// constraint_array:
//-----------------------------------------------------------------------------

var CCODE_BACKSPACE = 8;
var CCODE_TAB = 9;

var CT_NUMBER = 0;
var CT_CHECK = 1;
var CT_DATE = 2;
var CT_NOTNULL = 3;
var CT_GROUP_NOTNULL = 4;
var CT_ALPHABET = 5;
var CT_DEPENDENT_NOTNULL_CHECKED = 6;
var CT_DEPENDENT_NOTNULL_VALUE = 7;
var CT_MULTIPLE_SELECT = 8;
var CT_MAXLENGTH = 9;

var V_YEAR_LOW = 1950;
var V_YEAR_HIGH = 2100;

var NULLABLE = 1;
var NOT_NULLABLE = 2;

var NATIONAL_CHARS = "éáűőúöüóíÉÁŰŐÚÖÜÓÍ";

var is_netscape;

function ev_init () {
  	if (navigator.appName == "Netscape") {
		is_netscape = true;
	} else {
		is_netscape = false;
	}
}

function focus_next (inp) {
	for (i = 0; i < inp.form.elements.length; i++) {
		if (inp.form.elements[i].name == inp.name) {
			if (i+1 < inp.form.elements.length)
				inp.form.elements[i+1].focus ();
			else	inp.form.elements[0].focus ();
			return;
		}
	}	
}


function group_null (form, name, first_ind, last_ind) {
	l_first_ind = (first_ind == null) || (first_ind == "") ? -1 : first_ind;
	l_last_ind = (last_ind == null) || (last_ind == "") ? -1 : last_ind;
	ind = -1;

	for (i = 0; i < form.elements.length; i++) {
		if (form.elements[i].name == name) {
			ind++;
			if ((l_first_ind != -1) && (l_last_ind != -1) && ((ind < l_first_ind) || (ind > l_last_ind))) {
				continue;
			}
			if (form.elements[i].type == "checkbox") {
				if (form.elements[i].checked)
					return false;
			} else if (form.elements[i].value != "")
				return false;
		}
	}
	return true;
}


function constraint_array () {
	this.constraint_types = new Array ();
	this.constraint_labels = new Array ();
	this.params1 = new Array ();
	this.params2 = new Array ();
	this.params3 = new Array ();
	this.params4 = new Array ();
	this.params5 = new Array ();

	this.null_checks = true;

	this.enable_null_checks = enable_null_checks;
	this.disable_null_checks = disable_null_checks;
	this.add_constraints = add_constraints;
	this.passed_keydown_check = passed_keydown_check;
	this.get_index = get_index;
	this.constraints_forced = constraints_forced_;
	this.valid_date = valid_date;
	this.handle_shift_click = handle_shift_click;
}

function enable_null_checks () {
	this.null_checks = true;
}

function disable_null_checks () {
	this.null_checks = false;
}

function add_constraints (p_constraint_type, p_constraint_label, p_param1, p_param2, p_param3, p_param4, p_param5) {
	var ind = this.constraint_types.length;
	this.constraint_types[ind] = p_constraint_type;
	this.constraint_labels[ind] = p_constraint_label;
	this.params1[ind] = p_param1;
	this.params2[ind] = p_param2;
	this.params3[ind] = p_param3;
	this.params4[ind] = p_param4;
	this.params5[ind] = p_param5;

	if ((p_constraint_type == CT_NUMBER) || (p_constraint_type == CT_DATE) || (p_constraint_type == CT_ALPHABET)
		|| (p_constraint_type == CT_MAXLENGTH)) {
		this.params1[ind].ind = ind;
	}
}


function get_index (p_input) {
	ind = new Number (p_input.ind);
	if (!isNaN(ind)) return ind;

	in_u = new String (p_input.name);
	in_u = in_u.toUpperCase ();
	for (i = 0; i < this.constraint_types.length; i++) {
		if ((this.constraint_types[i] == CT_NUMBER) 
			|| (this.constraint_types[i] == CT_ALPHABET)
			|| (this.constraint_types[i] == CT_DATE)
		) {
			if (this.params1[i].name.toUpperCase () == in_u)
				return i;
		}
	}
	return NULL;
}



function passed_keydown_check (p_ind, p_char_code) {

	if (this.constraint_types[p_ind] == CT_NUMBER) {
		if (((p_char_code >= "0".charCodeAt(0)) && (p_char_code <= "9".charCodeAt(0))) ||
		((p_char_code == CCODE_TAB) || (p_char_code == CCODE_BACKSPACE))) {
			return true;
		} else 	return false;
	//} else if (this.constraint_types[p_ind] == CT_DATE) {
	//	alert ('date');
	} else if (this.constraint_types[p_ind] == CT_ALPHABET) {
		if (((p_char_code >= "a".charCodeAt(0)) && (p_char_code <= "z".charCodeAt(0)))
		|| ((p_char_code >= "A".charCodeAt(0)) && (p_char_code <= "Z".charCodeAt(0)))
		|| (NATIONAL_CHARS.indexOf (p_char_code) != -1)
		|| ((p_char_code == CCODE_TAB) || (p_char_code == CCODE_BACKSPACE))) {
			return true;
		} else return false;
	}
	return true;
}



var days_of_month = new Array ();

days_of_month[1] = 31;
days_of_month[2] = 28;
days_of_month[3] = 31;
days_of_month[4] = 30;
days_of_month[5] = 31;
days_of_month[6] = 30;
days_of_month[7] = 31;
days_of_month[8] = 31;
days_of_month[9] = 30;
days_of_month[10] = 31;
days_of_month[11] = 30;
days_of_month[12] = 31;

var PT_YEAR = 'YYYY';
var PT_MONTH = 'MM';
var PT_DAY = 'DD';
var PT_HH24 = 'HH24';
var PT_MIN = 'MI';

function get_date_part (p_date, p_format_mask, p_part) {
	if (ind = p_format_mask.indexOf (p_part) == -1)
		return '';
	
	return p_date.substr (ind, p_part.length);
}


function replace_part (p_str, p_ind, p_oldpart, p_newpart) {
	pre_part = p_str.substr (0, p_ind);
	post_part = p_str.substr (p_ind + p_oldpart.length);
	
	return (pre_part + p_newpart + post_part);
}


function construct_date (p_date, p_format_mask, p_constraint_label) {
	var l_format_mask;
	var c_year, c_month, c_day, c_hour, c_min;
	var n_year, n_month, n_day, n_hour, n_min;
	var ind;

	l_format_mask = new String (p_format_mask);
	l_format_mask = new String (l_format_mask.toUpperCase ());
	fm_len = l_format_mask.length;
	if (l_format_mask.indexOf(PT_HH24) != -1) fm_len -= 2;
	if (p_date.length != fm_len) {
		alert ('[' + p_constraint_label + ']: Formailag hibás dátum: ['+ p_date+ ' <-> '+ p_format_mask +']');
		return null;
	} else {
		// YEAR
		if ((ind = l_format_mask.indexOf (PT_YEAR)) == -1) {
			alert ('[' + p_constraint_label + ']: Formailag hibás dátum (év): ['+ p_date+ ' <-> '+ p_format_mask +']');
			return null;
		}
		c_year = p_date.substr (ind, PT_YEAR.length); n_year = new Number (c_year);
		if (isNaN (n_year)) {
			alert ('[' + p_constraint_label + ']: Érvénytelen év: ['+ c_year +'], ('+ p_date+ ', '+ p_format_mask +')');
			return null;
		}
		if ((n_year < V_YEAR_LOW) || (n_year > V_YEAR_HIGH)){
			alert ('[' + p_constraint_label + ']: Érvénytelen év: ' + c_year + ', ('+ p_date+ ', '+ p_format_mask +')');
			rval = false;
		}

		l_format_mask = replace_part (l_format_mask, ind, PT_YEAR, c_year);
		// MONTH
		if ((ind = l_format_mask.indexOf (PT_MONTH)) == -1) {
			alert ('[' + p_constraint_label + ']: Formailag hibás dátum (hónap): ['+ p_date+ ' <-> '+ p_format_mask +']');
			return null;
		}
		c_month = p_date.substr (ind, PT_MONTH.length); n_month = new Number (c_month);
		if (isNaN (n_month)) {
			alert ('[' + p_constraint_label + ']: Érvénytelen hónap: ['+ c_month +'], ('+ p_date+ ', '+ p_format_mask +')');
			return null;
		}
		l_format_mask = replace_part (l_format_mask, ind, PT_MONTH, c_month);

		// DAY
		if ((ind = l_format_mask.indexOf (PT_DAY)) == -1) {
			alert ('[' + p_constraint_label + ']: Formailag hibás dátum (nap): ['+ p_date+ ' <-> '+ p_format_mask +']');
			return null;
		}
		c_day = p_date.substr (ind, PT_DAY.length); n_day = new Number (c_day);
		if (isNaN (n_day)) {
			alert ('[' + p_constraint_label + ']: Érvénytelen nap: ['+ c_day +'], ('+ p_date+ ', '+ p_format_mask +')');
			return null;
		}
		l_format_mask = replace_part (l_format_mask, ind, PT_DAY, c_day);
		if ((n_month < 1) || (n_month > 12)) {
			alert ('[' + p_constraint_label + ']: Érvénytelen hónap: ' + c_month + ', ('+ p_date+ ', '+ p_format_mask +')');
			return null;
		} else {
			top_day = (((n_year % 4) == 0) && (n_month == 2)) ? days_of_month[n_month] +1 : days_of_month[n_month];
			if ((n_day < 1) || (n_day > top_day)) {
				alert ('[' + p_constraint_label + ']: Érvénytelen nap: (' + c_month + '): ' + c_day + ', ('+ p_date+ ', '+ p_format_mask +')');
				return null;
			}
		}

		// HOUR - MIN
		n_hour = null; n_min = null;
		if ((ind = l_format_mask.indexOf (PT_HH24)) != -1) {
			c_hour = p_date.substr (ind, PT_HH24.length-2); n_hour = new Number (c_hour);
			if (isNaN (n_hour)) {
				alert ('[' + p_constraint_label + ']: Érvénytelen óra: ['+ c_hour +'], ('+ p_date+ ', '+ p_format_mask +')');
				return null;
			}
			if ((n_hour < 0) || (n_hour > 24)) {
				alert ('[' + p_constraint_label + ']: Érvénytelen óra: ['+ c_hour +'], ('+ p_date+ ', '+ p_format_mask +')');
				return null;
			}
			l_format_mask = replace_part (l_format_mask, ind, PT_HH24, c_hour);
		}
		if ((ind = l_format_mask.indexOf (PT_MIN)) != -1) {
			c_min = p_date.substr (ind, PT_MIN.length); n_min = new Number (c_min);
			if (isNaN (n_min)) {
				alert ('[' + p_constraint_label + ']: Érvénytelen perc: ['+ c_min +'], ('+ p_date+ ', '+ p_format_mask +')');
				return null;
			}
			if ((n_min < 0) || (n_min > 60)) {
				alert ('[' + p_constraint_label + ']: Érvénytelen perc: ['+ c_min +'], ('+ p_date+ ', '+ p_format_mask +')');
			}
			l_format_mask = replace_part (l_format_mask, ind, PT_MIN, c_min);
		}
		if (p_date != l_format_mask) {
			alert ('[' + p_constraint_label + ']: Formailag hibás dátum: ('+ p_date+ ' <-> '+ p_format_mask +')');
			return null;
		}
		if ((n_hour != null) && (n_min != null)) {
			return new Date (n_year, n_month, n_day, n_hour, n_min);
		} else if ((n_hour != null) && (n_min == null)) {
			return new Date (n_year, n_month, n_day, n_hour);
		} else {
			return new Date (n_year, n_month, n_day);
		}
	}
}


function valid_date (p_date, p_format_mask, p_nullable_flag, p_mindate, p_maxdate, p_constraint_label) {

	if (p_date == "") {
		if (p_nullable_flag == NULLABLE)
			return true;
		else {
			if (this.null_checks) {
				alert ('[' + p_constraint_label + ']: A mezőt kötelező kitölteni.');
				return false;
			} else return true;
		}
	}

	l_date = construct_date (new String(p_date), p_format_mask, p_constraint_label);
	if (l_date == null) return false;
	if (p_mindate != "") {
		l_mindate = construct_date (new String(p_mindate), p_format_mask, p_constraint_label + '(alsó dátumhatár)');
		if (l_mindate == null) return false;
		if (l_mindate > l_date) {
			alert ('[' + p_constraint_label + ']: A dátum lehetséges legkisebb értéke: ' + p_mindate + '.');
			return false;
		}
	}
	if (p_maxdate != "") {
		l_maxdate = construct_date (new String(p_maxdate), p_format_mask, p_constraint_label + '(felső dátumhatár)');
		if (l_maxdate == null) return false;
		if (l_maxdate < l_date) {
			alert ('[' + p_constraint_label + ']: A dátum lehetséges legnagyobb értéke: ' + p_maxdate + '.');
			return false;
		}
	}
	return true;
}

function handle_shift_click (p_name, p_value) {
	var ref_ind;
	var ref_checked;

	for (i = 0; i < this.constraint_types.length; i++) {
		if (this.constraint_types[i] == CT_MULTIPLE_SELECT) {
			e = this.params1[i].form.elements;
			for (j = 0; j < e.length; j++) {
				if (e[j].name.toUpperCase() == p_name) {
					if (e[j].value.toUpperCase() == p_value) {
						ref_ind = j;
						ref_checked = e[j].checked;
						break;
					}
				}
			}
			for (j = ref_ind-1; j >= 0; j--) {
				if (e[j].name.toUpperCase() == p_name) {
					if (e[j].checked == ref_checked) {
						return;
					} else {
						e[j].checked = ref_checked;
					}
				}
			}
		}
	}	
}

function constraints_forced_ () {
	var rval = true;
	var i;

	for (i = 0; i < this.constraint_types.length; i++) {
		if (this.constraint_types[i] == CT_NUMBER) {
			if ((this.params2[i] == NULLABLE) && (this.params1[i].value == "")) continue;
			if ((this.params2[i] == NOT_NULLABLE) && (this.params1[i].value == "") && (this.null_checks)) {
				alert ('[' + this.constraint_labels[i] + ']: A mezőt kötelező kitölteni.');
				rval = false; 
				break;
			}
			// range check
			if ((!isNaN (this.params3[i])) && (!isNaN (this.params4[i]))) {
				if ((this.params1[i].value < (this.params3[i] == "" ? this.params1[i].value : this.params3[i])) || 
				   (this.params1[i].value > (this.params4[i] == "" ? this.params1[i].value : this.params4[i]))) {
					alert ('[' + this.constraint_labels[i] + ']: A szám kívül esik az érvényes értékek tartományán. (' + this.params1[i].value + ' - ['+ this.params3[i] +'..'+ this.params4[i] +'])');
					rval = false; 
				}
			}
		} else if (this.constraint_types[i] == CT_DATE) {
			if (!valid_date (this.params1[i].value, this.params2[i], this.params3[i], this.params4[i], this.params5[i], this.constraint_labels[i])) {
				rval = false;
				break;
			}
		} else if ((this.constraint_types[i] == CT_NOTNULL) && (this.null_checks)) {
			if (this.params1[i].value == "") {
				alert ('[' + this.constraint_labels[i] + ']: A mezőt kötelező kitölteni.');
				rval = false; 
				break;
			}
		} else if ((this.constraint_types[i] == CT_GROUP_NOTNULL) && (this.null_checks)) {
			if (group_null (this.params1[i], this.params2[i], this.params3[i], this.params4[i])) {
				alert ('[' + this.constraint_labels[i] + ']: A csoportból legalább egy mezőnek kötelező  értéket adni.');
				rval = false;
				break;
			}
		} else if ((this.constraint_types[i] == CT_ALPHABET) && (this.null_checks)) {
			if ((this.params2[i] == NULLABLE) && (this.params1[i].value == "")) continue;
			if ((this.params2[i] == NOT_NULLABLE) && (this.params1[i].value == "")) {
				alert ('[' + this.constraint_labels[i] + ']: A mezőt kötelező kitölteni.');
				rval = false; 
				break;
			}
		} else if ((this.constraint_types[i] == CT_DEPENDENT_NOTNULL_CHECKED) && (this.null_checks)) {
			if ((this.params1[i].value == "") && (this.params2[i].checked)) {
				alert ('[' + this.constraint_labels[i] + ']: A mezőt kötelező kitölteni.');
				rval = false; 
				break;
			}
		} else if ((this.constraint_types[i] == CT_DEPENDENT_NOTNULL_VALUE) && (this.null_checks)) {
			if ((this.params1[i].value == "") && ((this.params2[i].value == this.params3[i]) || ((this.params3[i] == '%') && (this.params2[i].value != "")))) {
				alert ('[' + this.constraint_labels[i] + ']: A mezőt kötelező kitölteni.');
				rval = false; 
				break;
			}
		} else if (this.constraint_types[i] == CT_MAXLENGTH) {
			if (this.params1[i].value.length > this.params2[i]) {
				//this.params1[i].value = this.params1[i].value.substr (0, this.params2[i]);
				//alert ('[' + this.constraint_labels[i] + ']: A mező hossza túllépte a megengedett határt ('+ this.params2[i] +'), ezért csonkítva lett. Ellenorizze a változásokat.');
				//rval = false; 
				this.params1[i].value = this.params1[i].value.substr (0, this.params2[i]) + '<---' + this.params2[i] + '--->\n' + this.params1[i].value.substr (this.params2[i]) + '\n';
				alert ('[' + this.constraint_labels[i] + ']: A mező hossza túllépte a megengedett határt ('+ this.params2[i] +'). A határ szövegben meg lett jelölve.');
				rval = false; 
				break;
			}
		}
	}
	return rval;
}

//-----------------------------------------------------------------------------
// constraint_array.




// interface routines to constraint_array:
//-----------------------------------------------------------------------------

var ca = new constraint_array ();
var NULL = '@#&*';
var PR_NAME = 'NAME=';
var PR_VALUE = 'VALUE=';
var PR_MAXLENGTH = 'MAXLENGTH=';

function register_constraint (p_constraint_type, p_constraint_label, p_param1, p_param2, p_param3, p_param4, p_param5) {
	ca.add_constraints (p_constraint_type, p_constraint_label, p_param1, p_param2, p_param3, p_param4, p_param5);
}

function force_keydown_constraints (evnt) {
	var ind;
	var MS_SHIFT_ONLY = 16;
	var MS_CTRL_ONLY = 17;
	var MS_ALT_ONLY = 18;
	
	if (is_netscape)
		ind = ca.get_index (evnt.target);
	else {	
		if ((window.event.keyCode == MS_SHIFT_ONLY) || 
		   (window.event.keyCode == MS_CTRL_ONLY) || (window.event.keyCode == MS_ALT_ONLY)) return;
		ind = ca.get_index (window.event.srcElement);
	}

	if (is_netscape) {
		return ca.passed_keydown_check (ind, evnt.which);
	} else {
		window.event.returnValue = ca.passed_keydown_check (ind, window.event.keyCode);
	}
}


function force_click_constraints (evnt) {
	if (is_netscape) {
		if (evnt.modifiers & Event.SHIFT_MASK)
			ca.handle_shift_click (evnt.target.name, evnt.target.value);
		return routeEvent (evnt);
	} else {
		if (window.event.shiftKey) {
			ca.handle_shift_click (window.event.srcElement.name.toUpperCase(), window.event.srcElement.value.toUpperCase());
		}
	}
}

function constraints_forced () {
	ca.enable_null_checks ();
	return ca.constraints_forced ();	
}


function constraints_forced_ignore_nulls () {
	ca.disable_null_checks ();
	return ca.constraints_forced ();	
}

function ct_hook () {
	ev_init ();

	//IE-ben a captureEvents nem kell.
	if (is_netscape) {
		document.captureEvents(Event.KEYDOWN | Event.CLICK);
	}

	document.onkeydown = force_keydown_constraints;
	document.onclick = force_click_constraints;
}


ct_hook ();

