
	function FormField(_prefix,_name,_type,_label,_validationMethod,_minimum,_maximum,_maxlength,_options) {
		this.prefix = _prefix;
		this.name = _name;
		this.type = _type;
		this.label = _label;
		this.validationMethod = _validationMethod;
		this.minimum = _minimum;
		this.maximum = _maximum;
		this.maxlength = _maxlength;
		this.options = _options;
	}
	
	/**
	 * Polskie znaki w standardzie ISO-8859-2
	 */
	FormField.prototype.changeUmlauts = function(str) {
		var re = new RegExp("([¡])","g");  str = str.replace(re, "A");
		
		re = new RegExp("([±])","g");  str = str.replace(re, "a");
		re = new RegExp("([Ê])","g");  str = str.replace(re, "E");
		re = new RegExp("([ê])","g");  str = str.replace(re, "e");
		re = new RegExp("([Ó])","g");  str = str.replace(re, "O");
		re = new RegExp("([ó])","g");  str = str.replace(re, "o");
		re = new RegExp("([Ñ])","g");  str = str.replace(re, "N");
		re = new RegExp("([ñ])","g");  str = str.replace(re, "n");
		re = new RegExp("([Æ])","g");  str = str.replace(re, "C");
		re = new RegExp("([æ])","g");  str = str.replace(re, "c");
		re = new RegExp("([¯])","g");  str = str.replace(re, "Z");
		re = new RegExp("([¿])","g");  str = str.replace(re, "z");
		re = new RegExp("([¯])","g");  str = str.replace(re, "Z");
		re = new RegExp("([¿])","g");  str = str.replace(re, "z");
		re = new RegExp("([¦])","g");  str = str.replace(re, "S");
		re = new RegExp("([¶])","g");  str = str.replace(re, "s");
		re = new RegExp("([£])","g");  str = str.replace(re, "L");
		re = new RegExp("([³])","g");  str = str.replace(re, "l");
		
		return str;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([A-Z]|[a-z]|[ ]|[-])+$"
	 * @param _input = input text field
	 */
	FormField.prototype.isName = function(_input,message) {
		var str = this.changeUmlauts(_input.value);
		
		if (str == "") return false;
		
		var re = new RegExp("^([A-Z]|[a-z]|[ ]|[-])+$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([A-Z]|[a-z]|[ ]|[-])+$"
	 * @param _input = input text field
	 */
	FormField.prototype.isNotEmpty = function(message) {
		var str = document.getElementById(this.prefix+this.name).value;
		if (str == "") return false;
		else return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([A-Z]|[a-z]|[ ]|[-]|[\.])+$"
	 * @param _input = input text field
	 */
	FormField.prototype.isStreet = function(_input,message) {
		var str = this.changeUmlauts(_input.value);
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]|[A-Z]|[a-z]|[ ]|[-]|[\.]|[\/])+$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]|[A-Z]|[a-z]|[ ]|[-])+$"
	 * @param _input = input text field
	 */
	FormField.prototype.isStreetNumber = function(_input,message) {
		var str = this.changeUmlauts(_input.value);
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]|[A-Z]|[a-z]|[ ]|[-])+$");
		var ret = re.test(str);
  
		if(!ret) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]|[ ]-)+$"
	 * @param _input = input text field
	 */
	FormField.prototype.isZIP = function(message) {
		var tmp = document.getElementById(this.prefix+this.name);
		var str = tmp.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]|[ ]|[-])+$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message) alert(message);
			tmp.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([A-Z]|[a-z]|[ ]|[-]|[\(]|[\)]|[\/])+$"
	 * @param _input = input text field
	 */
	FormField.prototype.isCity = function(message) {
		var tmp = document.getElementById(this.prefix+this.name);
		var str = this.changeUmlauts(tmp.value);
		
		if (str == "") return false;
		
		var re = new RegExp("^([A-Z]|[a-z]|[ ]|[-]|[\(]|[\)]|[\/]|[.])+$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message) alert(message);
			tmp.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]|[ ]|[-]|[\(]|[\)]|[\/])+$"
	 * @param _input = input text field
	 */
	FormField.prototype.isPhone = function(message) {
		var tmp = document.getElementById(this.prefix+this.name);
		var str = this.changeUmlauts(tmp.value);
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]|[ ]|[-]|[\(]|[\)]|[\/]|[+])+$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message) alert(message);
			tmp.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([A-za-z0-9_\.]|[\-])+([@]){1}(([A-za-z0-9_]|[\-])+([\.]))+([a-zA-Z]){2,3}$"
	 * @param _input = input text field
	 */
	FormField.prototype.isEmail = function(message) {
		var tmp = document.getElementById(this.prefix+this.name);
		var str = this.changeUmlauts(tmp.value);
		
		if (str == "") return false;
		
		var re = new RegExp("^([A-za-z0-9_\.]|[\-])+([@]){1}(([A-za-z0-9_]|[\-])+([\.]))+([a-zA-Z]){2,3}$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message) alert(message);
			tmp.focus();
			return false;
		}
		return true;
	}

	/**
	 * checks if given value matches expression:
	 * "^([0-9]{2})$" and checkcs if number is between <1 and 31>
	 * @param _input = input text field
	 */
	FormField.prototype.isDay = function(_input,message) {
		var str = _input.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]{2})$");
		var ret = re.test(str);
		
		if(!ret || str < 1 || str > 31) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]{2})$" and checkcs if number is between <1 and 12>
	 * @param _input = input text field
	 */
	FormField.prototype.isMonth = function(_input,message) {
		var str = _input.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]{2})$");
		var ret = re.test(str);
		
		if(!ret || str < 1 || str > 12) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		return true
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]{2})$" and checkcs if number is between <1 and 99>
	 * @param _input = input text field
	 */
	FormField.prototype.isYear = function(_input,message) {
		var str = _input.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]{2})$");
		var ret = re.test(str);
		
		if(!ret || str < 0 || str > 99) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]{16})$"
	 * @param _input = input text field
	 */
	FormField.prototype.isCardNumber = function(_input,message) {
		var str = _input.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]{16})$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message.length != 0) alert(message);
			_input.focus();
			return falsel
		}
		return false;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]{3})$"
	 * @param _input = input text field
	 */
	FormField.prototype.isCVC = function(_input,message) {
		var str = _input.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]{3})$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]{1,9})$"
	 * @param _input = input text field
	 */
	FormField.prototype.isNumber = function(message) {
		var tmp = document.getElementById(this.prefix+this.name)
		var str = tmp.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]{1,9})$");
		var ret = re.test(str);
		
		if(!ret ) {
			if (message) alert(message);
			tmp.focus();
			return false;
		}
		else if (this.minimum) {
			if (tmp.value<this.minimum) {
				if (message) alert(message);
				tmp.focus();
				return false;
			}      
		}
		else if (this.maximum) {
			if (_input.value>this.maximum) {
				if (message) alert(message);
				tmp.focus();
				return false;
			}      
		}
		return true;
	}
	
	/**
	 * checks if given value matches expression:
	 * "^([0-9]{1,9})$"
	 * @param _input = input text field
	 */
	FormField.prototype.isBookingNumber = function(_input,message) {
		var str = _input.value;
		
		if (str == "") return false;
		
		var re = new RegExp("^([0-9]{1,9})$");
		var ret = re.test(str);
		
		if(!ret) {
			if (message.length != 0) alert(message);
			_input.focus();
			return false;
		}
		return true;
	}
	
	FormField.prototype.isRegon = function(_input,message) {
		return isNotEmpty(_input,message);	
	}

	FormField.prototype.isNIP = function(_input,message) {
		return isNotEmpty(_input,message);	
	}
	

	FormField.prototype.CheckYear = function(year) {
		if ((year%400==0)||((year%4==0)&&(year%100!=0))) return true;
		else return false;
	}


	FormField.prototype.isDate = function() {
		var aStr = document.getElementById(this.prefix+this.name).value;

		var re = new RegExp("^[0-9]{1,4}[\.-]{1}[0-9]{1,2}[\.-]{1}[0-9]{1,4}$");
		var ret = re.test(aStr);
		if (!ret) return false;
		
		var DateArr = aStr.split(/\./);
		if(DateArr[1] == null) DateArr = aStr.split(/-/);
//		alert(DateArr[0]+' '+DateArr[1]+' '+DateArr[2]);
		if (DateArr[2] < 1900 || DateArr[2] > 2030)
			if(DateArr[0] < 1900 || DateArr[0] > 2030) return false;
		if (DateArr[1] < 1 || DateArr[1]>12) return false;
		
		if(DateArr[0] < 1900) if (this.CheckYear(DateArr[2]) && DateArr[1]==2) days[2] = 29;
		else if (this.CheckYear(DateArr[0]) && DateArr[1] == 2) days[2] = 29;
		if (DateArr[0] < 1900) if (DateArr[0] < 1 || DateArr[0]>days[DateArr[1]]) return false;
		else if (DateArr[2] < 1 || DateArr[2]>days[DateArr[1]]) return false;
		
		return true;
	}

	FormField.prototype.checkDate = function() {
		var aStr = document.getElementById(this.prefix+this.name).value;

		var re = new RegExp("^[0-9]{1,4}[\.-]{1}[0-9]{1,2}[\.-]{1}[0-9]{1,2}$");
		var ret = re.test(aStr);
		if (!ret) return false;
		
		var DateArr = aStr.split(/\./);
		if(DateArr[1] == null) DateArr = aStr.split(/-/);
		if(DateArr[0] < 1900 || DateArr[0] > 2030) return false;
		if (DateArr[1] < 1 || DateArr[1]>12) return false;
		
		if (this.CheckYear(DateArr[0]) && DateArr[1] == 2) days[2] = 29;
		if (DateArr[2] < 1 || DateArr[2]>days[DateArr[1]]) return false;
		
		return true;
	}
	
/*
	FormField.prototype.validateFloatForm = function(form, fields) {
		var re = new RegExp("^[0-9]{1,}$");
		for (index in fields) {
			field = form[fields[index]];
			if (field.type == 'text' || field.type == 'textarea' || field.type == 'select-one' || field.type == 'radio') {
				var value = '';
				if (field.type == "select-one") {
					var si = field.selectedIndex;
					if (si >= 0) {
						value = field.options[si].value;
					}
				}
				else {
					value = field.value;
				}
				if (value.length > 0) {
					var tempArray = value.split('.');
					var joinedString= tempArray.join('');
					var ret = re.test(joinedString);
					if (!ret) {
						field.focus();
						return field.name;
					}
				}
//				else return field.name;
			}
		}
		return true;
	}
*/

/*
function validateIntForm(form, fields)
{
    var re = new RegExp("^[0-9]{1,}$");
    for (index in fields) 
    {
        field = form[fields[index]];
        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'select-one' ||
            field.type == 'radio')
        {
            var value = '';
            if (field.type == "select-one") 
            {
                var si = field.selectedIndex;
                if (si >= 0)
                {
                    value = field.options[si].value;
                }
            }
            else
            {
                value = field.value;
            }
            if (value.length > 0)
            {
                var ret = re.test(value);
                if (!ret)
                {
                    field.focus();
                    return field.name;
                }
                
            }

            //else
            //    return field.name;

        }
    }
    return true;
}
*/

/*
	function validateDateForm(form, fields) {
	    var re = new RegExp("^[0-9]{1,}$");
	    for (index in fields) {
	        field = form[fields[index]];
	        if (field.type == 'text' ||
	            field.type == 'textarea' ||
	            field.type == 'select-one' ||
	            field.type == 'radio') {
	            var value = '';
	            if (field.type == "select-one") {
	                var si = field.selectedIndex;
	                if (si >= 0) {
	                    value = field.options[si].value;
	                }
	            }
	            else {
	                value = field.value;
	            }
	            if (value.length > 0) {
	                if (!this.validateDateFormat(value)) {
	                    field.focus();
	                    return field.name;
	                }
	            }
	
	            //else
	            //    return field.name;
	
	        }
	    }
	    return true;
	}
*/

/*
function validateRequiredForm(form, fields)
{
    for (index in fields)
    {
        field = form[fields[index]];
        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'select-one' ||
            field.type == 'radio')
        {
            var value = '';
            if (field.type == "select-one") 
            {
                var si = field.selectedIndex;
                if (si >= 0)
                {
                    value = field.options[si].value;
                    if (value.length>0 && parseInt(value)==0)
                        value = "";
                }
            }
            else
            {
                value = field.value;
            }
            if (value.length == 0)
            {
                //field.focus();
                return field.name;
            }
        }
    }
    return true;
}
*/
	FormField.prototype.isDictionaryNotEmpty = function(message) {
		if(this.type != 'select') return false;
		else {
			var tmp = document.getElementById(this.prefix+this.name);
			if(tmp.selectedIndex > 0) return true;
			else return false;
		}
	}
	
	
	FormField.prototype.getSelectedIndexes = function() {
		if(this.type != 'select') return null;
		else {
			var tmp = document.getElementById(this.prefix+this.name);
			var aIndexes = new Array;
			
			for(var i=0; i<tmp.options.length; i++) {
				if(tmp.options[i].selected) aIndexes.push(i);
			}
			return aIndexes;
		}
	}
	
	FormField.prototype.addOption = function(sName, sValue) {
		if(this.type != 'select') return false;
		else {
			var tmp = document.getElementById(this.prefix+this.name);
			var oOption = document.createElement("option");
			oOption.appendChild(document.createTextNode(sName));
			
			if (arguments.length == 3) {
				oOption.setAttribute("value", sValue);
			}
			
			tmp.appendChild(oOption);
			return true;
		}
	}
	
	FormField.prototype.deleteOption = function(iIndex) {
		if(this.type != 'select') return false;
		else {
			var tmp = document.getElementById(this.prefix+this.name);
			tmp.remove(iIndex);
			
			return true;
		}
	}
	
	FormField.prototype.clearOptions = function() {
		if(this.type != 'select') return false;
		else {
			var tmp = document.getElementById(this.prefix+this.name);
			
			for(var i=tmp.options.length-1; i>=0; i--) {
				this.deleteOption(i);
			}
		}
	}
	
	FormField.prototype.validateField = function() {
		switch (this.validationMethod) {
			case 'isDictionaryNotEmpty' :
				return this.isDictionaryNotEmpty('');
			break;
			case 'isCity' :
				return this.isCity('');
			break;
			case 'isZIP' :
				return this.isZIP('');
			break;
			case 'isPhone' :
				return this.isPhone('');
			break;
			case 'isNumber' :
				return this.isNumber('');
			break;
			case 'isDate' :
				return this.isDate();
			break;
			case 'checkDate' :
				return this.checkDate();
			break;
			default: return this.isNotEmpty('');
		}
	}
	
	FormField.prototype.enableField = function() {
		var tmp = document.getElementById(this.prefix+this.name);
		tmp.disabled = false;
		tmp.style.backgroundColor = '#ffffff';
		var tmp = document.getElementById(this.prefix+this.name+'_year');
		if(tmp) {
			tmp.disabled = false;
			tmp.style.backgroundColor = '#ffffff';
		}
		var tmp = document.getElementById(this.prefix+this.name+'_month');
		if(tmp) {
			tmp.disabled = false;
			tmp.style.backgroundColor = '#ffffff';
		}
		var tmp = document.getElementById(this.prefix+this.name+'_day');
		if(tmp) {
			tmp.disabled = false;
			tmp.style.backgroundColor = '#ffffff';
		}
	}
	
	FormField.prototype.disableField = function() {
		var tmp = document.getElementById(this.prefix+this.name);
		tmp.disabled = true;
		tmp.style.backgroundColor = '#dddddd';
		var tmp = document.getElementById(this.prefix+this.name+'_year');
		if(tmp) {
			tmp.disabled = true;
			tmp.style.backgroundColor = '#dddddd';
		}
		var tmp = document.getElementById(this.prefix+this.name+'_month');
		if(tmp) {
			tmp.disabled = true;
			tmp.style.backgroundColor = '#dddddd';
		}
		var tmp = document.getElementById(this.prefix+this.name+'_day');
		if(tmp) {
			tmp.disabled = true;
			tmp.style.backgroundColor = '#dddddd';
		}
	}
	
