function Formular(formName)
{
	this.formName = formName;
	this.formular = document.forms[this.formName];
	this.registeredElements = Array();
	this.addRegisteredElement = function(elName, elValue)
	{
		return this.registeredElements[elName] = elValue;
	}
	this.clearForm = function()
	{
//		for(element in document.forms[this.formName])
//			document.writeln(document.forms[this.formName][element]);
		for(var i = 0; i < this.formular.elements.length; i++)
		{
			if(this.formular.elements[i].type == 'text')
			{
				this.formular.elements[i].value = '';
			}
			else if(this.formular.elements[i].type == 'textarea')
			{
				this.formular.elements[i].value = '';
			}
			else if(this.formular.elements[i].type.match('select*'))
			{
				for(var j = 0; j < this.formular.elements[i].options.length; j++)
					if(j == 0)
						this.formular.elements[i].options[j].selected = true;
					else
						this.formular.elements[i].options[j].selected = false;
			}
			else if(this.formular.elements[i].type == 'checkbox')
			{
				this.formular.elements[i].checked = false;
			}
			else if(this.formular.elements[i].type == 'radio')
			{
				this.formular.elements[i].checked = false;
			}
		}
	}
	this.uncheckRadio = function()
	{
		for(var i = 0; i < this.formular.elements.length; i++)
		{
			if(this.formular.elements[i].type == 'radio')
			{
				this.formular.elements[i].checked = false;
			}
		}
	}
}

function FormControllerPair(formName)
{
	this.parent = Formular;
	this.parent(formName);
	this.itemFormVisible = false;
	this.controller = null;
	this.itemToControll = null;
	this.itemUnwindedInnerHTML = '';
	this.itemWindedInnerHTML = '';

	this.addController = function(controller)
	{
		this.controller = this.addRegisteredElement("controller", controller);
	}
	this.addElementToBeControlled = function(itemToControll)
	{
		this.itemToControll = this.addRegisteredElement("itemToControll", itemToControll);
	}
	this.addUnwindedInnerHTML = function(text)
	{
		this.itemUnwindedInnerHTML = text;
	}
	this.addWindedInnerHTML = function(text)
	{
		this.itemWindedInnerHTML = text;
	}

	this.manageItemFormVisibility = function()
	{
		this.itemFormVisible = (this.itemToControll.style.display == "none")? false : true;
		if(this.itemFormVisible)
		{
			this.hideFormAndChangeText();
		}
		else
		{
			this.showFormAndChangeText();
		}
	}
	this.showFormAndChangeText = function()
	{
		//this.controller.value = "Hide item edit form";
		this.controller.innerHTML = this.itemUnwindedInnerHTML;
		this.itemToControll.style.display = "block";
	}
	this.hideFormAndChangeText = function()
	{
		//this.controller.value = "Show item edit form";
		this.controller.innerHTML = this.itemWindedInnerHTML;
		this.itemToControll.style.display = "none";
	}
}
FormControllerPair.prototype = new Formular;

function ValidateForm(formName)
{
	this.parent = Formular;
	this.parent(formName);
	this.elementsArray = new Array();
	this.STRING_PATTERN = '^.*$';
	this.EMAIL_PATTERN = '^((?:[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*|"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\]))?$'; // RFC 282 standard
	this.PHONE_PATTERN = '^(\\+?[\\(\\) \\d]*\\d+[ \\-\\d]*)?$';
	this.INTEGER_PATTERN = '^((\\+|-)?\\d+)?$';
	this.FLOAT_PATTERN = '^((\\+|-)?(\\d+\\.?\\d*|\\d*\\.?\\d+))?$';
	this.DATELONG_PATTERN = '^(\\d{4}-\\d{2}-\\d{2})?$';
	
	this.addFormElemToVal = function(element)
	{
		this.elementsArray.push(element);
	}

	this.escapeVal = function(element, message)
	{
		this.formular[element.name].focus();
		if(!!element.longtext)
		{
			alert(element.longtext);
		}
		else if(!!element.text && !!message)
		{
			alert(message.replace(/%s/, element.text));
		}
		else
		{
			alert('Nieprawidłowa wartość w polu formularza');
		}
		return false;
	}
	
	this.checkLength = function(element, message)
	{
		var minlength = (!!element.minlength)? new Number(element.minlength) : '0';
		var maxlength = (!!element.maxlength)? new Number(element.maxlength) : '';
		if(isNaN(maxlength))
		{
			maxlength = '';
		}
		if(isNaN(minlength))
		{
			minlength = '0';
		}
		if(maxlength != '' && minlength != '' && maxlength < minlength)
		{
			maxlength = '';
			minlength = '0';
		}
		if(!(new RegExp('^.{' + minlength + ',' + maxlength + '}$', 'img')).test((this.formular[element.name].value).side_trim()))
		{
			return this.escapeVal(element, message + '\nMin. długość: ' + minlength + ', maks. długość: ' + maxlength + '');
		}
		return true;
	}
	
	this.checkValue = function(element, message)
	{
		if(!!element.minvalue && !isNaN((this.formular[element.name].value).side_trim()) && (this.formular[element.name].value).side_trim() < element.minvalue)
		{
			return this.escapeVal(element, message + '\nMinimum: ' + element.minvalue);
		}
		if(!!element.maxvalue && !isNaN((this.formular[element.name].value).side_trim()) && (this.formular[element.name].value).side_trim() > element.maxvalue)
		{
			return this.escapeVal(element, message + '\nMaksimum: ' + element.maxvalue);
		}
		return true;
	}
	
	this.checkPattern = function(element, pattern, message)
	{
		if(!(new RegExp(pattern, 'img')).test((this.formular[element.name].value).side_trim()))
		{
			return this.escapeVal(element, message);
		}
		return true;
	}
	
	this.valForm = function()
	{
		for(var i = 0; i < this.elementsArray.length; i++)
		{
			if(!this.checkLength(this.elementsArray[i], 'Pole "%s" powinno mieć prawidłową długość')) // length check
			{
				return false;
			}
			
			if(this.elementsArray[i].valtype == 'email' && !this.checkPattern(this.elementsArray[i], this.EMAIL_PATTERN, 'Pole "%s" powinno być prawidłowo wypełnione.\nNp. j.kowal@poczta.pl')) // pattern check
			{
				return false;
			}
			else if(this.elementsArray[i].valtype == 'phone' && !this.checkPattern(this.elementsArray[i], this.PHONE_PATTERN, 'Pole "%s" powinno być prawidłowo wypełnione\nNp. 1234567; 123-45-67; +48 (22) 333 44 55'))
			{
				return false;
			}
			else if(this.elementsArray[i].valtype == 'integer' && !this.checkPattern(this.elementsArray[i], this.INTEGER_PATTERN, 'Pole "%s" powinno być prawidłowo wypełnione\nNp. 34; +34; -34'))
			{
				return false;
			}
			else if(this.elementsArray[i].valtype == 'float' && !this.checkPattern(this.elementsArray[i], this.FLOAT_PATTERN, 'Pole "%s" powinno być prawidłowo wypełnione\nNp. 34; 34.2; +.34; -34.'))
			{
				return false;
			}
			else if(this.elementsArray[i].valtype == 'regexp' && !this.checkPattern(this.elementsArray[i], this.elementsArray[i].regexp, 'Pole "%s" powinno być prawidłowo wypełnione\nWzór: ' + this.elementsArray[i].regexp))
			{
				return false;
			}
			else if(this.elementsArray[i].valtype == 'datelong' && !this.checkPattern(this.elementsArray[i], this.DATELONG_PATTERN, 'Pole "%s" powinno być prawidłowo wypełnione\nNp. 2009-03-30'))
			{
				return false;
			}
			else if((this.elementsArray[i].valtype == 'string' || !this.elementsArray[i].valtype) && !this.checkPattern(this.elementsArray[i], this.STRING_PATTERN, 'Pole "%s" powinno być prawidłowo wypełnione'))
			{
				return false;
			}
			
			if(!this.checkValue(this.elementsArray[i], 'Pole "%s" powinno mieć prawidłową wartość')) // value check
			{
				return false;
			}
		}
		return true;
	}
	
	this.valSendForm = function()
	{
		if(this.valForm())
		{
			this.formular.submit();
			return true;
		}
		else
		{
			return false;
		}
	}
	
	this.send = function()
	{
		this.formular.submit();
	}
}
ValidateForm.prototype = new Formular;
