// Usage: d = new FormChecker();
//        d.CheckForm('form', 'elementi', 'types');

var FormChecker = function()
{
	this.ColorOK   = "#fff";
	this.ColorFail = "#ff4";
	
	//klicna funkcija
	function CheckForm(form, elementosi, types){
		if (!(elementosi.length == types.length)){
			alert("Elements.length and Types.length not the same!");
			return false;
		}
		var array_length = elementosi.length;
		var elementi = new Array(array_length);
		for (i_e = 0; i_e<array_length; i_e++){
			elementi[i_e] = new Array(2);
			elementi[i_e][0] = elementosi[i_e];
			elementi[i_e][1] = types[i_e];
			form.elements[elementosi[i_e]].style.backgroundColor = this.ColorOK;
		}
		return this.check(form, elementi, array_length);
	}
	//glavna check funkcija
	function check(form, elementi, element_count){
		for (var ind = 0; ind<element_count; ind++){
			var el = form.elements[elementi[ind][0]];
			var el_type = elementi[ind][1];
			if (el == undefined)
				continue;
			
			if (this.notEmpty(el)){
				if (el_type == "string_strict"){
					if ((!this.isAlphanumeric(el)) || (this.isNumeric(el))){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else if (el_type == "lang_code"){
					if ((!this.isAlphanumeric(el)) || (this.isNumeric(el)) || (!this.lengthRestriction(el, 2, 2))){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else if (el_type == "string"){
					//TODO - what to check?
				}
				else if (el_type == "checkbox"){
					//TODO - what to check?
				}
				else if (el_type == "combobox"){
					//TODO - what to check?
				}
				else if (el_type == "geo_location_lat"){
					if (!this.isGeoLat(el)){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else if (el_type == "geo_location_long"){
					if (!this.isGeoLong(el)){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else if (el_type == "captcha")
				{
					var key = document.getElementById(el.id+'-key').value;
					if (SHA1(el.value) != key){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else if (el_type == "integer"){
					if (!this.isNumeric(el)){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else if (el_type == "boolean"){
					if ((!this.isBoolean(el)) || (!this.lengthRestriction(el, 1, 1))){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else if (el_type == "email"){
					if (!this.isMail(el)){
						el.style.backgroundColor = this.ColorFail;
						return false;
					}
				}
				else return false;
			}
			else {
				el.style.backgroundColor = this.ColorFail;
				return false;
			}
		};
		return true;
	}
	//cekiraj ce je numeric
	function isNumeric(elem){
		var numericExpression = /^(\+|-)?\d+$/;
		if(elem.value.match(numericExpression)){
			return true;
		}else{
			elem.focus();
			return false;
		}
	}
	//cekiraj ce je geo location long
	function isGeoLong(elem){
		var p = elem.value;
		if ((!isNaN(p - 0)) && (p <= 180 ) && (p >= -180))
			return true;
		else{
			elem.focus();
			return false;
		}
	}
	//cekiraj ce je geo location lat
	function isGeoLat(elem){
		var p = elem.value;
		if ((!isNaN(p - 0)) && (p <= 85 ) && (p >= -85))
			return true;
		else{
			elem.focus();
			return false;
		}
	}
	//cekiraj ce je boolean
	function isBoolean(elem){
		var booleanExpression = /^[0-1]+$/;
		if(elem.value.match(booleanExpression)){
			return true;
		}else{
			elem.focus();
			return false;
		}
	}
	//cekiraj dolzino
	function lengthRestriction(elem, min, max){
		var uInput = elem.value;
		if(uInput.length >= min && uInput.length <= max){
			return true;
		}else{
			elem.focus();
			return false;
		}
	}
	//cekiraj ce je alfanumericno
	function isAlphanumeric(elem){
		var alphaExp = /^[0-9a-zA-Z_-]+$/;
		if(elem.value.match(alphaExp)){
			return true;
		}else{
			elem.focus();
			return false;
		}
	}
	//cekiraj mail
	function isMail(elem){
		var mailFilter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		if(elem.value.match(mailFilter)){
			return true;
		}else{
			elem.focus();
			return false;
		}
	}
	//cekiraj ce ni prazen
	function notEmpty(elem){
		var re = /^\s{1,}$/g; //match za karkol praznega (space, tab, newline,...)
		if ((elem.value.length==0) || (elem.value==null) || ((elem.value.search(re)) > -1)) {
			elem.focus();
			return false;
		}
		else {
			return true;
		}
	}
	//hide message
	function hideMessage(id){
		setTimeout(function(){t_hideMessage(id)}, 3000);
		function t_hideMessage(id){
			var ob = document.getElementById(id);
			ob.style.display = 'none';
		}
	}
	
	function SHA1(msg){function rotate_left(n,s){var t4=(n<<s)|(n>>>(32-s));return t4};function lsb_hex(val){var str="";var i;var vh;var vl;for(i=0;i<=6;i+=2){vh=(val>>>(i*4+4))&0x0f;vl=(val>>>(i*4))&0x0f;str+=vh.toString(16)+vl.toString(16)}return str};function cvt_hex(val){var str="";var i;var v;for(i=7;i>=0;i--){v=(val>>>(i*4))&0x0f;str+=v.toString(16)}return str};function Utf8Encode(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n<string.length;n++){var c=string.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c)}else if((c>127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128)}else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128)}}return utftext};var blockstart;var i,j;var W=new Array(80);var H0=0x67452301;var H1=0xEFCDAB89;var H2=0x98BADCFE;var H3=0x10325476;var H4=0xC3D2E1F0;var A,B,C,D,E;var temp;msg=Utf8Encode(msg);var msg_len=msg.length;var word_array=new Array();for(i=0;i<msg_len-3;i+=4){j=msg.charCodeAt(i)<<24|msg.charCodeAt(i+1)<<16|msg.charCodeAt(i+2)<<8|msg.charCodeAt(i+3);word_array.push(j)}switch(msg_len%4){case 0:i=0x080000000;break;case 1:i=msg.charCodeAt(msg_len-1)<<24|0x0800000;break;case 2:i=msg.charCodeAt(msg_len-2)<<24|msg.charCodeAt(msg_len-1)<<16|0x08000;break;case 3:i=msg.charCodeAt(msg_len-3)<<24|msg.charCodeAt(msg_len-2)<<16|msg.charCodeAt(msg_len-1)<<8|0x80;break}word_array.push(i);while((word_array.length%16)!=14)word_array.push(0);word_array.push(msg_len>>>29);word_array.push((msg_len<<3)&0x0ffffffff);for(blockstart=0;blockstart<word_array.length;blockstart+=16){for(i=0;i<16;i++)W[i]=word_array[blockstart+i];for(i=16;i<=79;i++)W[i]=rotate_left(W[i-3]^W[i-8]^W[i-14]^W[i-16],1);A=H0;B=H1;C=H2;D=H3;E=H4;for(i=0;i<=19;i++){temp=(rotate_left(A,5)+((B&C)|(~B&D))+E+W[i]+0x5A827999)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp}for(i=20;i<=39;i++){temp=(rotate_left(A,5)+(B^C^D)+E+W[i]+0x6ED9EBA1)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp}for(i=40;i<=59;i++){temp=(rotate_left(A,5)+((B&C)|(B&D)|(C&D))+E+W[i]+0x8F1BBCDC)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp}for(i=60;i<=79;i++){temp=(rotate_left(A,5)+(B^C^D)+E+W[i]+0xCA62C1D6)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp}H0=(H0+A)&0x0ffffffff;H1=(H1+B)&0x0ffffffff;H2=(H2+C)&0x0ffffffff;H3=(H3+D)&0x0ffffffff;H4=(H4+E)&0x0ffffffff}var temp=cvt_hex(H0)+cvt_hex(H1)+cvt_hex(H2)+cvt_hex(H3)+cvt_hex(H4);return temp.toLowerCase()}
	
	this.CheckForm = CheckForm;
	this.check = check;
	this.isNumeric = isNumeric;
	this.isBoolean = isBoolean;
	this.lengthRestriction = lengthRestriction;
	this.isAlphanumeric = isAlphanumeric;
	this.isMail = isMail;
	this.notEmpty = notEmpty;
	this.isGeoLat = isGeoLat;
	this.isGeoLong = isGeoLong;
	this.hideMessage = hideMessage;
}	
