/*
	Some examples:

		MyCustomFunctionToValidiateValueInThisInput = function(value_from_input) {
			if(value_from_input<100)
				return true;
			else
				return false;
		}
		

		formConstarints = new Array(
			{ fieldName:'id', constrName:'int_nn' }, -- This constraint, this value is checked by regExp.
			{ fieldName:'nazwa', func:MyCustomFunctionToValidiateValueInThisInput, desc:' When func:function returned false - this msg show after run FormCheck' },
			{ fieldName:'regon', constrName:'regon'} -- This constraint, value is checked by function because we cannot check it by regExp.
		);
 */

	function FormCheck(form, constraints, submit, dontHookOnSubmit) {

		form.FCheck = function() {
			var dataGood = true;
			var firstBadField = null;
			var message = '';
			
			form.FCResetHighlight();
			var correct;
			try {
				for(var i = 0; i < form.FCFields.length; i++ ) {
					
					
					if (form.FCFields[i].el.length == 2) {
						var x = form.FCFields[i].el;
						var hid;
						var fil;
						if (x[0].type=='hidden'){
							hid = x[0];
							fil = x[1];
						}	
						else {
							hid = x[1];
							fil = x[0];
						}
						if (hid.value.length > 0) {
							form.FCFields[i].el = hid;
						} else {
							form.FCFields[i].el = fil;
						}
					}
					
					
					correct=true;
					
					if(form.FCFields[i].func) {
						//alert('sprawdzam funkcje dla pola: '+form.FCFields[i].name);
						if(form.FCFields[i].el.length > 1) {
							
							if (!form.FCFields[i].func(form.FCFields[i].el, form.FCFields[i].nn)) {
								correct=false;
								
							}
						}
						else if(!form.FCFields[i].func(form.FCFields[i].el.value, form.FCFields[i].nn)) {
							correct=false;
						}
					} else {
						//alert('sprawdzam regExp dla pola: '+form.FCFields[i].name);

						if(!form.FCFields[i].el.disabled && form.FCFields[i].el.value.search( form.FCFields[i].regExp ) == -1 ) {
							correct=false;
						}
					}

					if(correct==false) {
						dataGood = false;
						//form.FCHighlight( form.FCFields[i].name );
						//message += 'Pole \'' + form.FCLabels[ form.FCFields[i].name ].text + '\' ' + form.FCFields[i].desc + '!\n';
						message += form.FCFields[i].desc + '\n';
						//if(!firstBadField) {
						//	firstBadField = form.FCFields[i].el;
						//}
					}
				}
			} catch (e) {
				/* Micha�: W zwi�zku z wyskakuj�cym na ro�nych formatkach alertem informuj�cym o braku pola w formularzu zakomentowa�em wy�wietlanie tej wiadomo�ci. Pozosta�a funkcjonalno�� bez zmian. */
				alert('Walidator nie znalaz� pola: '+form.FCFields[i].name+' a blad to: '+e);
			}
			
			if( !dataGood ) {
				alert( message );
				//firstBadField.focus();
				//firstBadField.select();
			} 
			return dataGood;
		}
		
		form.FCHighlight = function(labelFor) {
			this.FCLabels[ labelFor ].el.style.color = 'red';
		}
		
		form.FCResetHighlight = function(labelFor) { 
			if(labelFor == null) {
				for( var i = 0; i < this.FCLabels.length; i++ )
					this.FCLabels[i].el.style.color = this.FCLabels[i].color;
			} else {
				try {
					this.FCLabels[ labelFor ].el.style.color = this.FCLabels[ labelFor ].color;
				} catch (e) {

				}
			}
		}

		form.FCSetConstr = function( fieldName, constrName ){
			this.FCFields[ fieldName ].regExp = FormCheck.constraints[ constrName ].regExp;
			this.FCFields[ fieldName ].desc = FormCheck.constraints[ constrName ].desc;
		}
		
		form.FCFields = new Array();

		for( var i = 0; i < constraints.length; i++ ) {
			var regExp;
			var desc;
			var func;
			var nn;
			func=null;
			
			
			if(constraints[i].regExp) {	// This is for user definied regExps.
				regExp = constraints[i].regExp;
				desc = constraints[i].desc;
				func = constraints[i].func;
			} else if(FormCheck.constraints[constraints[i].constrName]) {	// This is for pre-definied regExps in FormCheck class.
				regExp = FormCheck.constraints[constraints[i].constrName].regExp;
				desc = (constraints[i].desc)?constraints[i].desc:FormCheck.constraints[constraints[i].constrName].desc;
				func = constraints[i].func;

			} else if(constraints[i].func) {	// This is for user definied custom functions to validiate.
				func = constraints[i].func;
				desc = constraints[i].desc;
			} else {	//	This is not: 1. User regExp 2. FormCheck regExp 3. User function, so - this must be value to check nonRegExp.
				switch(constraints[i].constrName) {
					case 'pesel':
						nn = false;
						func = CheckPesel;
						desc = ' zawiera niepoprawny numer PESEL';
						break;
					case 'pesel_nn':
						nn = true;
						func = CheckPesel;
						desc = ' zawiera niepoprawny numer PESEL';
						break;
					case 'date':
						nn = false;
						func = CheckDate;
						desc = ' zawiera niepoprawn� dat�';
						break;
					case 'date_nn':
						nn = true;
						func = CheckDate;
						desc = ' zawiera niepoprawn� dat�';
						break;
					case 'inputarray_nn':
						nn = true;
						func = CheckInputArray;
						desc = constraints[i].desc;
						break;
						
				}
			}
			//alert('Dla pola: '+constraints[i].fieldName+' dodaje funkcje: '+func );
			//alert(form.elements[ constraints[i].fieldName ].type+' '+form.elements[ constraints[i].fieldName ].length);
			//alert(form.elements[ constraints[i].fieldName ].length);
			//alert(constraints[i].func);
			form.FCFields.push( { 
				name:constraints[i].fieldName,
				el:form.elements[ constraints[i].fieldName ],
				regExp:regExp,
				func:func,
				desc:desc,
				nn:nn
			} );
		}
		
		for( var i = 0; i < form.FCFields.length; i++ ) {
			form.FCFields[ form.FCFields[i].name ] = form.FCFields[i];
		}
		
		form.FCLabels = new Array();
/*		
		var labels = form.getElementsByTagName('label');
		for( var i = 0; i < labels.length; i++ ) {
			form.FCLabels[i] = {
				fieldName:labels[i].htmlFor,
				el:labels[i],
				text:getElementText( labels[i] ),
				color:labels[i].style.color
			};
		}

		for( var i = 0; i < form.FCLabels.length; i++ ) {
			form.FCLabels[ form.FCLabels[i].fieldName ] = form.FCLabels[i];
		}
*/
		if( dontHookOnSubmit == null ) {
			if(submit == null) {
				form.onsubmit = form.FCheck;
				form.onreset = form.FCResetHighlight;
			} else
				submit.onclick = form.FCheck;
		}
};
	
	CheckPesel = function(pesel, notnull) {
		if(notnull==false && pesel=='') return true;
		
		if(pesel.length!=11 || pesel.search('^([0-9]{11})$')==-1)
			return false;
		
		var factor = new Array(1,3,7,9,1,3,7,9,1,3);
		s = 0;
		for (i=0;i<=9;i++) s += pesel.charAt(i)*factor[i];

		eleven = (10-s%10)%10;
		return (eleven==pesel.charAt(10));
	}

	
	CheckDate = function(dateStr, notnull) {
		if (notnull == false && dateStr.length == 0)
			return true;
		
		var yStr = dateStr.substr(0,4);
		var mStr = dateStr.substr(5,2)-1;
		var dStr = dateStr.substr(8,2);
		
		var regExpStr = /^([0-9]{4}-[01][0-9]-[0-3][0-9])?$/;
		var chRegExp = regExpStr.exec(dateStr);
		if (!chRegExp)
			return false; 
		
		var chDate = new Date();
		chDate.setFullYear( yStr, mStr, dStr );
		if ( chDate.getMonth() != mStr )
			return false;
		
		return true;
	}
	

	CheckInputArray = function(dateStr, notnull) {

	for(var i = 0; i < dateStr.length; i++) {
		if(dateStr[i].checked) 
		return true;

	}
	return false;
	}
	
	
	FormCheck.constraints = new Array (
		{ name:'ile_poz', regExp:'^[1-9]{1}[0-9]*$', desc:'=0. \nNie mozna wystawiac pustych dokumentow' },
		{ name:'int', regExp:'^[0-9]*$', desc:'musi by� liczb� ca�owit�' },
		{ name:'int_nn', regExp:'^[0-9]+$', desc:'musi by� liczb� ca�owit�' },
		{ name:'int_text_nn', regExp:'^[A-Za-z0-9]+$', desc:'ma nieprawid�ow� posta�' },
		{ name:'float', regExp:'^(-?[0-9]+([,.][0-9]+)?)?$', desc:'zawiera nieprawid�ow� warto��' },
		{ name:'float_nn', regExp:'^(-?[0-9]+([,.][0-9]+)?)$', desc:'zawiera nieprawid�ow� warto��' },
		{ name:'float_pos', regExp:'^([0-9]+([,.][0-9]+)?)?$', desc:'zawiera nieprawid�ow� warto��' },
		{ name:'float_nn_pos', regExp:'^([0-9]+([,.][0-9]+)?)$', desc:'zawiera nieprawid�ow� warto��' },
		{ name:'text', regExp:'.*', desc:'nie powinienes tego zobaczyc' },
		{ name:'text_nn', regExp:'.', desc:'nie mo�e by� puste' },
		{ name:'rach_pl', regExp:'^([0-9]([-]?[0-9]){25})?$', desc:'musi mie� 26 cyfr' },
		{ name:'nip', regExp:'^([0-9-]{13})*$', desc:'ma nieprawid�ow� posta�' },	// is needed checking sum?
		{ name:'nip_nn', regExp:'^([0-9-]{13})$', desc:'ma nieprawid�ow� posta�' },// is needed checking sum?
		//{ name:'date', regExp:'^([0-9]{4}-[01][0-9]-[0-3][0-9])?$', desc:'zawiera nieprawid�ow� dat�' },
		//{ name:'date_nn', regExp:'^[0-9]{4}-[01][0-9]-[0-3][0-9]$', desc:'zawiera nieprawid�ow� dat�' },
		{ name:'kod', regExp:'^([0-9]{2}[-][0-9]{3})?$', desc:'ma nieprawid�ow� posta�' },
		{ name:'kod_nn', regExp:'^[0-9]{2}[-][0-9]{3}$', desc:'ma nieprawid�ow� posta�' },
		// Komunikat nie pasuje do wyra�enia regExp { name:'kod_dost', regExp:'^[A-Z0-9]+$', desc:'musi zawiera� du�e litery bez polskich znak�w i cyfry' },
		{ name:'godz', regExp:'^(([0-1][0-9]|2[0-3]):[0-5][0-9])$|^$', desc:'zawiera nieprawid�ow� godzin�!' },
		{ name:'email', regExp:'^([-\._A-Za-z0-9]+@[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)+)?$', desc:'musi by� adresem w formacie: nazwa@domena' },
		{ name:'email_nn', regExp:'^[-\._A-Za-z0-9]+@[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)+$', desc:'musi by� adresem w formacie: nazwa@domena' },
		{ name:'street_no', regExp: '^(([0-9])+([a-z]*)){0,1}$', desc: 'zawiera niepoprawny adres' },
		{ name:'street_no_nn', regExp: '^(([0-9])+([a-z]*)){1,1}$', desc: 'zawiera niepoprawny adres' }

	);
	for( var i = 0; i < FormCheck.constraints.length; i++ )
		FormCheck.constraints[ FormCheck.constraints[i].name ] = FormCheck.constraints[i];
	
	
	function getElementText( el ) {
		var nodes = el.childNodes;
		var textData= '';
		var node = null;
		
		for( var i = 0; i < nodes.length; i++ ) {
			node = nodes[i];
			if( node.nodeType == 3 )
				textData += node.nodeValue;
			else if( node.nodeType == 1 )
				textData += this.getElementText( node );
		}
		return textData;
	}

   function to_numeric(field) {
		field.value = field.value.replace(',','.');
		var val=field.value;
	   if(!isNaN(val)) {
		   field.value = Number(val).toFixed(2);
	   } else {
		   field.value='0.00';
	   }
   }
	
	function ltrim(str, chars) {
		    chars = chars || "\\s";
			     return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
	}

	function rtrim(str, chars) {
		    chars = chars || "\\s";
			     return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
	}

	function trim(str, chars) {
		return ltrim(rtrim(str,chars), chars);
	}
	
	function is_integer(value) {
		var regExp = '^[0-9]*$';
		if(value.search(regExp)==-1) {
			return false;
		}

		return true;
	}
	
	function FormClear(form) {
		for (var i=0; i < form.elements.length; i++) {
			if(form.elements[i].type!='submit' && form.elements[i].type!='button') {
				try {
					form.elements[i].value='';
				} catch (e) {
					//alert('Blad podczas czyszczenia formularza: '+e);
				}
			}
		}
	}

