/*
Zalozeno na free knihovne
checkForm (version 3.4) by Riki "Fczbkk" Fridrich, 2003 - 2004
http://www.fczbkk.com/, mailto:riki@fczbkk.com
zrusena zavislost na dom.js
*
Modifikovano pro potreby reframeworku. (aby pro idcka jednotlivych inputu bylo mozno
nadefinovat vlastni error message)

*/

function eventFix(e) {
	if (typeof e == 'undefined') e = window.event;
	if (typeof e.target == 'undefined') e.target = e.srcElement;
	if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
	if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
	if ((typeof e.which == 'undefined') && e.keyCode) e.which = e.keyCode;
	// thanx to KKL2401 for preventDefault hack
	if (!e.preventDefault) e.preventDefault = function() {
		e.returnValue = false;
	}
	return e;
}

function getClasses(elm) {
	if (elm && elm.tagName) {
		var classes = [];
		if (elm.className) {	// na zaklade Centiho upozornenia o divnej interpretacii v Opere
			var cl = elm.className.replace(/\s+/g, " ");
			classes = cl.split(" ");
		}
		return classes;
	}
	return false;
}

var errorMsgs = [];

checkForm = {
	// localized
	// invalidMsg			: "Formulář není vyplněn správně.\n %err",
	errorMsg			: "\n %err - ",
	errorFields			: [],
	errorCodes			: [],

	fieldType			: [],
	defaultValue		: [],

	timeoutCounter		: 0,
	lazyCheckElement	: null,
	fieldSelector 		: "input[type='checkbox'],input[type='text'],input[type='password'],select,textarea",
	
	submitHandlers		: [],

	// inicializacia skriptu
	init : function () {
		$('form').submit(checkForm.checkForm)
				 //.reset(checkForm.checkForm)
	 			 .find(checkForm.fieldSelector)
	 			 	.blur(checkForm.checkField)
	 			 	.change(checkForm.checkField)
	 			 .end()
	 			 .find("input[type='text'],input[type='password']")
	 			 	.keyup(checkForm.checkFieldWithTimeout);
		return true;

	},

	checkFieldWithTimeout : function(elm) {
		checkForm.lazyCheckElement = elm;
		setTimeout('checkForm.checkFieldWithTimeoutHandle('+(++	checkForm.timeoutCounter)+')',750);
		e = eventFix(elm);
		e.preventDefault();
		return false;
	},

	checkFieldWithTimeoutHandle : function(counterValue) {
		if (counterValue == checkForm.timeoutCounter) {
			checkForm.checkField(checkForm.lazyCheckElement);
		}
	},


	// preveri validitu vsetkych policok a povoli alebo nepovoli submit
	checkForm : function(frm) {
		if (!frm || !frm.tagName || frm.tagName.toLowerCase() != "form") {
			e = eventFix(frm);
			frm = e.target;
		} else {
			var e = false;
		}
		checkForm.errorFields = [];
		checkForm.errorCodes = [];
		var fieldsOK = true;
		$(frm).find(checkForm.fieldSelector).each(
			function() {
				fieldsOK = ((checkForm.checkField(this) == "valid") && fieldsOK) ? true : false;
			}
		);
		if (fieldsOK)  {
			for (i in checkForm.submitHandlers) {
				if ((typeof(checkForm.submitHandlers[i]) == "function") && checkForm.submitHandlers[i].prototype) {
					checkForm.submitHandlers[i](e);
				}
			}
			return true;
		}
		if (e && (e.type == "reset")) {
			return;
		}
		if (e && (e.type == "submit")) {
			var err = "";
			for (var i = 0; i < checkForm.errorFields.length; i++) {
				err += checkForm.errorMsg.replace("%err", checkForm.errorFields[i]) + DT_error_messages.translate(checkForm.errorCodes[i][0]);
				if(typeof(checkForm.errorCodes[i][1])!='undefined'){
					var ecode=DT_error_messages.translate(checkForm.errorCodes[i][1]);
					if(typeof(ecode)!='undefined'){
						err += ' '+ecode;
					}
				}
			}
			alert(DT_error_messages.invalidMsg.replace("%err", err));
			if (e.preventDefault) {
				e.preventDefault();
			}
		}
		return false;
	},

	// preveri validitu policka a vrati "valid" alebo "invalid"
	checkField : function(elm) {
		if (!elm || !elm.tagName) {
			//var e = evt.fix(elm);
			e = eventFix(elm);
			elm = e.target;
		}

		if (elm) {
			if(elm.tagName == 'TEXTAREA' || elm.tagName == 'textarea'){
				if ((typeof tinyMCE != 'undefined') && tinyMCE.triggerSave)
					tinyMCE.triggerSave();
			}

			var fieldOK = true;
			elm.errorCode = null;

			var elmClasses = getClasses(elm);
			for (var i = 0; i < elmClasses.length; i++) {
				if (checkForm.fieldType[elmClasses[i]]) {
					var rule = checkForm.fieldType[elmClasses[i]];
					if (fieldOK && typeof(rule) == "string") {

						// pravidlo je string
						if (elm.value != "") {
							//fieldOK = elm.value.match(new RegExp(rule)) == null ? false : true;
							fieldOK = (elm.value.search(new RegExp(rule)) < 0) ? false : true;
						}

					} else if (fieldOK && ((typeof(rule) == "function") || (typeof(rule) == "object")) && rule.source) {
						// Mozilla vracia RegExpu typ "function", zatial co ostatne browsery "object"

						// pravidlo je regExp
						if (elm.value != "") {
							fieldOK = (elm.value.search(rule) < 0) ? false : true;
						}

					} else if (fieldOK && (typeof(rule) == "function") && rule.prototype) {

						// pravidlo je funkcia
						if(typeof e == 'undefined'){
							e = null;

						}
						fieldOK = rule(e, elm);


					}
				}
			}

			// zpravy
			if ($(elm).parent().is('td') || $(elm).parents('.formRow').length)
			{
				// formular ma layout nebo je policko v bunce tabulky
				var layoutParent = $(elm).parents('.formRow').length ? $(elm).parents('.formRow') : $(elm).parent();
				if (fieldOK) {
					$(layoutParent).removeClass('invalid');
					$('.fieldMessage',layoutParent).remove();
				} else {
					$(layoutParent).addClass('invalid');
					var messageText = DT_error_messages.translate(elm.errorCode ? elm.errorCode : 'em1');
					if(typeof(elm.additionalErrorCode)!='undefined'){
						var ecode=DT_error_messages.translate(elm.additionalErrorCode);
						if(typeof(ecode)!='undefined'){
							messageText += ' '+ecode;
						}
					}
					if (!$('.fieldMessage',layoutParent).length)
					{
						// TODO: revise, neni moc pekne mit divy v bunkach tabulky
						$(layoutParent).append('<div class="fieldMessage"></div>');
					}
					$('.fieldMessage',layoutParent).html(messageText);
				}
			} else {
				// policko je soliter
				if (fieldOK) {
					// a je OK, smazeme invalid class
					$(elm).removeClass('invalid');
				} else {
					// neni OK, pridame invalid class
					$(elm).addClass('invalid');
				}
			}

			if (!fieldOK) {
				// jeste se postarame o spravny kod / zpravu o chybe
				// FIXME: neni tohle memory leak? tyhle veci se nemazou, pokud je policko OK!
				checkForm.errorFields.push(checkForm.getFieldTitle(elm));
				var errorCode=[];
				errorCode.push(elm.errorCode || 'em1');
				if(typeof(elm.additionalErrorCode)!='undefined'){
					errorCode.push(elm.additionalErrorCode);
				}
				checkForm.errorCodes.push(errorCode);
			}

			return (fieldOK) ? "valid" : "invalid";
		}
		return false;
	},

	// prida novy typ policka
	addFieldType : function(cls, rule, defaultValue) {
		if (cls && (rule || defaultValue)) {
			if (rule) {
				checkForm.fieldType[cls] = rule;
			}
			if (defaultValue) {
				checkForm.defaultValue[cls] = defaultValue;
			}
			return true;
		}
		return false;
	},


	getFieldTitle : function(elm) {
		if (elm) {
			if (elm.checkFormErrorMsg) {
				return elm.checkFormErrorMsg;
			}
			if (elm.title) {
				return elm.title;
			}

			if (elm.name) {
				var labels = document.getElementsByTagName("label");
				for (var i = 0; i < labels.length; i++) {
					if (labels[i].attributes["for"] && (labels[i].attributes["for"].value == elm.id)) {
						// Opera nezvlada atribut "for"
						var str = checkForm.getNodeText(labels[i]);
						return str;
					}
				}
				return elm.id;
			}
			if (elm.name) {
				return elm.name;
			}
			return elm.toString();
		}
		return false;
	},

	getNodeText : function(node) {
		var str = "";
		if (node && node.hasChildNodes()) {
			for (var i = 0; i < node.childNodes.length; i++) {
				// TODO: skladanie toho stringu treba urobit nejak systemovejsie a prehladnejsie
				str += (node.childNodes[i].nodeType == 3) ? node.childNodes[i].nodeValue : checkForm.getNodeText(node.childNodes[i]);
				if ((node.childNodes[i].nodeType == 1) && (node.childNodes[i].tagName.toLowerCase() == "img") && (node.childNodes[i].attributes["alt"])) {
					str += node.childNodes[i].attributes["alt"].value;
				}
			}
		}
		return str;
	}

}

//var errorMessages = [];

/* basic field types */

// required field
checkForm.addFieldType(
	"required",
	function(evt, elm) {
		if (elm) {
			if (elm.tagName.toLowerCase() == "select") {
				if (elm.value) {
					return true;
				} else {
					elm.errorCode = 'em2';
					return false;
				}
			} else {
				if(elm.type.toLowerCase() == 'checkbox'){
					if(elm.checked != true){
						elm.errorCode = 'em2';
						return false;
					}else{
						return true;
					}

				}


				if (elm.value.search(/\S/) < 0) {
					elm.errorCode = 'em2';
					return false;
				} else {
					return true;
				}

			}
		}
		return false;
	}
);

function validate_Equals(elm1,elm2, eCode) {
	if(typeof elm1 != 'object'){
		elm1 = document.getElementById(elm1);
	}
	if(typeof elm2 != 'object'){
		elm2 = document.getElementById(elm2);
	}

	if (elm1.value != elm2.value) {
		elm1.errorCode = eCode;
		return false;
	}
	return true;
}

function validate_DT_String(elm, regex, minlength, maxlength, regkey) {
	if(typeof(regkey)!='undefined'){
		elm.additionalErrorCode=regkey;
	};
	
	if (! elm.value) return true;
	if (regex != '') {
		if (elm.value.search(new RegExp(regex)) < 0) {
			elm.errorCode = 'em12';
			return false;
		}
	}
	if (elm.value.length < minlength) {
		elm.errorCode = 'em11';
		return false;
	}

	if(maxlength > 0){
		if (elm.value.length > maxlength) {
			elm.errorCode = 'em10';
			return false;
		}
		return true;
	}
	return true;
}

function validate_List(elm, minItems, maxItems) {
	var items = elm.value.split(',');
	var itemsCount = 0;
	for(i=0;i<items.length;i++){
		if (items[i] != '') itemsCount++;
	}
	if ((! minItems === false) && minItems > itemsCount) {
		elm.errorCode = 'em60';
		return false;
	}
	if ((! maxItems === false) && maxItems < itemsCount) {
		elm.errorCode = 'em61';
		return false;
	}
	return true;
}

function f_combo_change(boxId) {
	var select = document.getElementById('_'+boxId+'_select');
	var value = document.getElementById(boxId);
	value.value = select.options[select.selectedIndex].value;
}

function f_combo_flip(boxId) {
	var select = document.getElementById('_'+boxId+'_select');
	var text = document.getElementById(boxId+'_text');
	var value = document.getElementById(boxId);
	if (text.style.display == 'none') {
		select.style.display = 'none';
		text.style.display = 'inline';
		var comboId = document.getElementById('_'+boxId+'_comboId');
		value.value = comboId.value;
		text.name = text.name.substr(1);
	} else {
		select.style.display = 'inline';
		text.style.display = 'none';
		value.value = select.options[select.selectedIndex].value;
		text.name = '_'+text.name;
	}
	return false;
}


function f_file_flipFileInfo(boxId) {
	var box = document.getElementById(boxId);
	if (box.style.visibility == 'visible') {
		box.style.visibility = 'hidden';
	} else {
		newContextMenuElement(box,'f_file_flipFileInfo(\''+boxId+'\');',1);
		box.style.visibility = 'visible';
	}
	return false;
}

function f_file_Replace(box) {
	var uploadField = document.getElementById('_'+box);
	var fileNameField = document.getElementById('filename_'+box);
	if (typeof(fileNameField.originalFile) == "undefined") {
		if (fileNameField.value.charAt(0) == ' ') {
			fileNameField.originalFile = '';
		} else {
			fileNameField.originalFile = fileNameField.value;
		}
	}
	if (uploadField.value) {
		var pos = uploadField.value.lastIndexOf('/');
		if (pos == -1) {
			var pos = uploadField.value.lastIndexOf('\\');
			if (pos == -1) {
				var base = uploadField.value;
			} else {
				var base = uploadField.value.substr(pos+1);
			}
		} else {
			var base = uploadField.value.substr(pos+1);
		}
		fileNameField.value = fileNameField.originalFile + ' → ' + base;
	} else {
		fileNameField.value = fileNameField.originalFile;
	}
}

function f_file_swap_delbox(box,value) {
	var sendField = document.getElementById(box);
	var uploadField = document.getElementById('_'+box);
	var fileNameField = document.getElementById('filename_'+box);
	if (value) {
		sendField.value = 'X'+sendField.value.substr(1);
		fileNameField.setAttribute('disabled','disabled');
		fileNameField.style.textDecoration = 'line-through';
		uploadField.setAttribute('disabled','disabled');
	} else {
		sendField.value = '1'+sendField.value.substr(1);
		fileNameField.removeAttribute('disabled');
		fileNameField.style.textDecoration = 'none';
		uploadField.removeAttribute('disabled');
	}

}

function f_list_addItem(inputName,code,hiddenOrder,jsHeader,callback) {
	code = code.replace(/<<<Q>>>/g, '"').replace(/<<<N>>>/g, f_list_itemCounter[inputName]);

	var tbody = document.getElementById('items_'+inputName).childNodes[0];
	if (tbody.childNodes.length == 1) {
		var headerCode = '<tr id="'+inputName+'_'+f_list_itemCounter[inputName]+'">';
		for (var i = 0; i < jsHeader.length; i++) {
			headerCode += '<th>' + jsHeader[i] + '</th>';
		}
		headerCode += '</tr>';
		$(document.getElementById('addline_'+inputName)).before(headerCode);
	}

	$(document.getElementById('addline_'+inputName)).before(code);

	if (hiddenOrder && tbody.childNodes.length > 3) { // > 3, nebot je tam header a radek s add a nove pridana
		//posledni polozka musi dostat sipku dolu
		var tr = tbody.childNodes[tbody.childNodes.length - 3]; //predposleni radek
		f_list_addArrowDown(tr,inputName,hiddenOrder);
	} else {
		//TODO smazat arrowUp
	}

	var firstTd = document.getElementById('items_'+inputName+'_'+f_list_itemCounter[inputName]).childNodes[0];
	for(var i = 0; i < firstTd.childNodes.length; i++) {
		var node = firstTd.childNodes[i];
		if (node.nodeName == 'INPUT' && node.getAttribute && (! node.getAttribute('type') || node.getAttribute('type') == 'text')) {
			if (node.focus) { node.focus(); }
			break;
		}
	}
	if (callback && callback.constructor == Function) {
		callback.apply(document.getElementById('items_'+inputName+'_'+f_list_itemCounter[inputName]));
	}
	f_list_itemCounter[inputName]++;
	return false;
}

function flipInputs(elm) {
	if (elm.nodeName == 'INPUT' || elm.nodeName == 'SELECT') {
		if (! elm.getAttribute('id')) return; //napr pomocny checkbox k fileinfo
		if (elm.getAttribute('name')) {
			elm.removeAttribute('name');
			elm.setAttribute('disabled','disabled');
		} else {
			elm.setAttribute('name',elm.getAttribute('id'));
			elm.removeAttribute('disabled');
		}
	} else {
		for(var i = 0; i < elm.childNodes.length; i++) {
			if (elm.childNodes[i].nodeType == 1) {
				flipInputs(elm.childNodes[i]);
			}
		}
	}
}

function f_list_removeItem(link,inputName,orderCol) {
	var tr = link.parentNode.parentNode;
	if ($(tr).is('.present')) {
		flipInputs(tr);
		//odkaz s ikonou pro delete/undo
		var anchor = tr.childNodes[tr.childNodes.length - 1].childNodes[0];
		if ($(tr).is('.trash')) {
			$(tr).removeClass('trash');
			anchor.title = 'Smazat';
			anchor.childNodes[0].src = base_static_dir+'images/admin2/icons/16/delete.gif';
			anchor.childNodes[0].alt = 'Smazat';
		} else {
			$(tr).addClass('trash');
			anchor.title = 'Obnovit';
			anchor.childNodes[0].src = base_static_dir+'images/admin2/icons/16/undo.gif';
			anchor.childNodes[0].alt = 'Obnovit';
		}
	} else {
		var table = tr.parentNode;
		if (orderCol) {
			if (table.childNodes[1] == tr && table.childNodes.length > 3) { //index 0 je hlavicka
				//jsme prvni a nejsme sami
				f_list_delArrowUp(tr.nextSibling);
			}
			if (table.childNodes[table.childNodes.length - 2] == tr && table.childNodes.length > 3) { //index 0 je hlavicka
				f_list_delArrowDown(tr.previousSibling);
			}
		}
		tr.parentNode.removeChild(tr);
	}
	var tbody = document.getElementById('items_'+inputName).childNodes[0];
	if (tbody.childNodes.length == 2) {
		//zbyva uz jen samotna hlavicka, tak ji take odstranime
		tbody.removeChild(tbody.childNodes[0]);
	}
	return false;
}

function f_list_addArrowDown(tr,inputName,hiddenOrder) {
	var td = tr.childNodes[tr.childNodes.length - 1]; //posledni bunka
	$(td).prepend('<a href="#" title="Posun dolů" onclick="return f_list_moveItem(this,\''+inputName+'\',\''+hiddenOrder+'\',1);"><img src="'+base_static_dir+'images/admin2/icons/misc/move-down.gif" width="16" height="16" alt="▼" /></a>');
}
function f_list_delArrowDown(tr) {
	var td = tr.childNodes[tr.childNodes.length - 1]; //posledni bunka
	td.removeChild(td.childNodes.length > 2 ? td.childNodes[2] : td.childNodes[1]); //pokud neni sipka nahoru tak sipka dolu je na indexu 1
}
function f_list_addArrowUp(tr,inputName,hiddenOrder) {
	var td = tr.childNodes[tr.childNodes.length - 1]; //posledni bunka
	$(td.childNodes[0]).append('<a href="#" title="Posun nahoru" onclick="return f_list_moveItem(this,\''+inputName+'\',\''+hiddenOrder+'\',-1);"><img src="'+base_static_dir+'images/admin2/icons/misc/move-up.gif" width="16" height="16" alt="▲" /></a>');
}
function f_list_delArrowUp(tr) {
	var td = tr.childNodes[tr.childNodes.length - 1]; //posledni bunka
	td.removeChild(td.childNodes[1]);
}

function f_list_moveItem(link,inputName,orderCol,dir) {
	var tr = link.parentNode.parentNode;
	var table = tr.parentNode;

	if (orderCol) {
		if (table.childNodes[table.childNodes.length - 2] == tr) {
			if (dir == 1) return false;
			//jsme posledni radka a jdeme nahoru
			f_list_addArrowDown(tr,inputName,orderCol);
			f_list_delArrowDown(tr.previousSibling);
		} else {
			if (table.childNodes[table.childNodes.length - 3] == tr && dir == 1) {
				//predposledni a jdeme dolu
				f_list_addArrowDown(tr.nextSibling,inputName,orderCol);
				f_list_delArrowDown(tr);
			}
		}
		if (table.childNodes[1] == tr) { //index 0 je hlavicka
			if (dir == -1) return;
			//jsme prvni a jdeme dolu
			f_list_addArrowUp(tr,inputName,orderCol);
			f_list_delArrowUp(tr.nextSibling);
		} else {
			if (table.childNodes[2] == tr && dir == -1) {
				//jsme druhy a jdeme hore
				f_list_addArrowUp(tr.previousSibling,inputName,orderCol);
				f_list_delArrowUp(tr);
			}
		}

	}


	if (dir < 0) {
		var tr2 = tr.previousSibling;
		var nextSibling = tr.nextSibling;
	    table.replaceChild(tr, tr2);
   		table.insertBefore(tr2, nextSibling);
	} else {
		var tr2 = tr.nextSibling;
		var nextSibling = tr2.nextSibling;
	    table.replaceChild(tr2, tr);
   		table.insertBefore(tr, nextSibling);
	}

	var tr_i = (tr.id.split('_'))[2];
	var tr2_i = (tr2.id.split('_'))[2];
	var hid = document.getElementById(inputName + ':' + tr_i + ':' + orderCol);
	var hid2 = document.getElementById(inputName + ':' + tr2_i + ':' + orderCol);
	var tmp = hid.value;
	hid.value = hid2.value;
	hid2.value = tmp;
   	return false;
 }

function generator_handler(fieldId,generator) {
	var field = document.getElementById(fieldId);
	eval('field.value = '+generator+';');
	return false;
}

function f_calendar_updated(cal) {
	$('.f_calendar').trigger('change');
}

// zavolanie inicializacie checkForm-u pri zavedeni dokumentu
//evt.add(window, "load", checkForm.init);
$(document).ready(checkForm.init);

$.fn.fastSerialize = function() {
    var a = [];
    $('input,textarea,select,button', this).each(function() {
        var n = this.name;
        var t = this.type;
        if ( !n || this.disabled || t == 'reset' ||
            (t == 'checkbox' || t == 'radio') && !this.checked ||
            (t == 'submit' || t == 'image' || t == 'button') && this.form.clicked != this ||
            this.tagName.toLowerCase() == 'select' && this.selectedIndex == -1)
            return;
        if (t == 'image' && this.form.clicked_x)
            return a.push(
                {name: n+'_x', value: this.form.clicked_x},
                {name: n+'_y', value: this.form.clicked_y}
            );
        if (t == 'select-multiple') {
            $('option:selected', this).each( function() {
                a.push({name: n, value: this.value});
            });
            return;
        }
        a.push({name: n, value: this.value});
    });
    return a;
};
