// -----------------------------------------------------------------------------
// Generic Form Validation
//
// Copyright (C) 2000 Jacob Hage - [jacobhage@hotmail.com]
// Distributed under the terms of the GNU Library General Public License
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// Initializing script  - setting global variables
// -----------------------------------------------------------------------------
var checkObjects		= new Array(); 	// Array containing the objects to validate.
var errors				= ""; 			// Variable holding the error message.
var returnVal			= false; 		// General return value. The validated form will only be submitted if true.
var language			= new Array(); 	// Language independent error messages!
var selectecLanguage	= "english";	// Choose between "english", "danish", "dutch", "french", "spanish", "russian", "portuguese"
language.english		= new Array();
language.polish			= new Array();
language.german			= new Array();
language.french			= new Array();
language.italian		= new Array();
language.russian		= new Array();
language.spanish		= new Array();

// Error messages in english:
	language.english.header		= "The following error(s) occured:"
	language.english.start		= "* ";
	language.english.field		= " Field <";
	language.english.require	= "> is required";
	language.english.min		= " and must consist of at least %d ";
	language.english.max		= " and must not contain more than %d ";
	language.english.minmax		= " and no more than %d ";
	language.english.chars		= " characters";
	language.english.num		= " and must contain a number";
	language.english.email		= "> must contain a valid e-mail address";
	language.english.date		= "> must contain a valid date";
	language.english.nip		= "> must contain a valid NIP number";

// Error messages in polish: Thanks to Marcin Maciukiewicz <ciukes@poczta.fm>
	language.polish.header		= "Wyst±pi³y nastêpuj±ce b³êdy:"
	language.polish.start		= "* ";
	language.polish.field		= " Pole <";
	language.polish.require		= "> jest wymagane";
	language.polish.min			= " i musi zawieraæ conajmniej %d ";
	language.polish.max			= " i nie mo¿e zawieraæ wiêcej ni¿ %d ";
	language.polish.minmax		= " i nie wiêcej ni¿ %d ";
	language.polish.chars		= " znaki";
	language.polish.num			= " i musi zawieraæ liczbê";
	language.polish.email		= "> musi zawieraæ prawid³owy adres e-mail";
	language.polish.date		= "> musi zawieraæ prawid³ow¹ datê";
	language.polish.nip			= "> musi zawieraæ prawid³owy numer NIP";

// Error messages in german:
	language.german.header		= "Es sind folgende Fehler untergelaufen:"
	language.german.start		= "* ";
	language.german.field		= " das Feld <";
	language.german.require	= "> es ist erforderlich";
	language.german.min		= " und soll mindestens %d enthalten";
	language.german.max		= " und darf nicht mehr als %d enthalten";
	language.german.minmax		= " und nicht mehr als %d ";
	language.german.chars		= " Zeichen";
	language.german.num		= " und soll die Zahl enthalten";
	language.german.email		= "> soll die korrekte eMail Adresse enthalten";
	language.german.date		= "> soll das korrekte Datum enthalten";
	language.german.nip		= "> soll die korrekte Steuernummer enthalten";

// Error messages in french:
	language.french.header		= "The following error(s) occured:"
	language.french.start		= "* ";
	language.french.field		= " Field <";
	language.french.require	= "> is required";
	language.french.min		= " and must consist of at least %d ";
	language.french.max		= " and must not contain more than %d ";
	language.french.minmax		= " and no more than %d ";
	language.french.chars		= " characters";
	language.french.num		= " and must contain a number";
	language.french.email		= "> must contain a valid e-mail address";
	language.french.date		= "> must contain a valid date";
	language.french.nip		= "> must contain a valid NIP number";

// Error messages in italian:
	language.italian.header		= "The following error(s) occured:"
	language.italian.start		= "* ";
	language.italian.field		= " Field <";
	language.italian.require	= "> is required";
	language.italian.min		= " and must consist of at least %d ";
	language.italian.max		= " and must not contain more than %d ";
	language.italian.minmax		= " and no more than %d ";
	language.italian.chars		= " characters";
	language.italian.num		= " and must contain a number";
	language.italian.email		= "> must contain a valid e-mail address";
	language.italian.date		= "> must contain a valid date";
	language.italian.nip		= "> must contain a valid NIP number";

// Error messages in russian:
	language.russian.header		= "Ïðîèçîøëè ñëåäóþùèå îøèáêè:"
	language.russian.start		= "* ";
	language.russian.field		= " Ïîëå <";
	language.russian.require	= "> òðåáóåòñÿ";
	language.russian.min		= " i äîëæíî ñîäåðæàòü êàê ìèíèìóì %d ";
	language.russian.max		= " i íå ìîæåò ñîäåðæàòü áîëåå, ÷åì %d ";
	language.russian.minmax		= " i íå áîëåå, ÷åì %d ";
	language.russian.chars		= " çíàêè";
	language.russian.num		= " i äîëæíî ñîäåðæàòü ÷èñëî";
	language.russian.email		= "> äîëæåí áûòü ïðàâèëüíûé e-mail";
	language.russian.date		= "> äîëæíà áûòü ïðàâèëüíàÿ äàòà";
	language.russian.nip		= "> äîëæåí áûòü ïðàâèëüíûé íîìåð NIP";

// Error messages in spanish:
	language.spanish.header		= "Notamos las siguientes errores:"
	language.spanish.start		= "* ";
	language.spanish.field		= " Campo <";
	language.spanish.require	= "> es obligatorio";
	language.spanish.min		= " y tiene que incluir minimo %d ";
	language.spanish.max		= " y no puede incluir mas que %d ";
	language.spanish.minmax		= " y no mas que %d ";
	language.spanish.chars		= " signos";
	language.spanish.num		= " y tiene que incluir numero";
	language.spanish.email		= "> tiene que contener la direccion correcta";
	language.spanish.date		= "> tiene que contener la fecha correcta";
	language.spanish.nip		= "> tiene que contener al NIP correcta";
	
// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
//
// n = name of the input field (Required)
// type= string, num, email, date (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
// -----------------------------------------------------------------------------
function define(n,type,HTMLname,min,max,d){
	var p;
	var i;
	var x;
	if(!d) d=document;
  
	if((p=n.indexOf("?"))>0&&parent.frames.length){
    	d=parent.frames[n.substring(p+1)].document;
    	n=n.substring(0,p);
    }
	if(!(x=d[n])&&d.all) x=d.all[n];
  	for (i=0;!x&&i<d.forms.length;i++){
  		x=d.forms[i][n];

  	}
	for(i=0;!x&&d.layers&&i<d.layers.length;i++){ 
		x=define(n,type,HTMLname,min,max,d.layers[i].document);
		return x;		
	}
	
	// Create Object. The name will be "V_something" where something is the "n" parameter above.
	eval("V_"+n+" = new formResult(n,x,type,HTMLname,min,max);");
	
	// if defined, undefine it first
	undefine(n);
	
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

// -----------------------------------------------------------------------------
// formResult - Used internally to create the objects
// -----------------------------------------------------------------------------
function formResult(n,form,type,HTMLname,min,max){
	this.name = n;
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
}

// -----------------------------------------------------------------------------
// undefine - usuwa obiekt z listy walidacji
//
// n - identyfikator obiektu
//
// Zwraca true, jesli obiekt zostal znaleziony i usuniety; w przeciwnym wypadku
// zwraca false.
// -----------------------------------------------------------------------------
function undefine(n) {
	var i;
	for(i=0; i<checkObjects.length; i++)
	{
		if (checkObjects[i].name==n)
		{
			checkObjects.splice(i, 1);
			return true;
		}
	}
	return false;
}

// -----------------------------------------------------------------------------
// validate - Call this function onSubmit and return the "returnVal". (onSubmit="validate();return returnVal;")
// -----------------------------------------------------------------------------
function validate(){
	if(checkObjects.length>0){
		errorObject = "";
		for(i=0;i<checkObjects.length;i++){
			validateObject 			= new Object();
			validateObject.form 	= checkObjects[i].form;
			validateObject.HTMLname = checkObjects[i].HTMLname;
			validateObject.type 	= checkObjects[i].type;
			validateObject.val 		= (validateObject.type=="list") ? validateObject.form.selectedIndex : checkObjects[i].form.value;
			validateObject.len 		= (validateObject.type=="list") ? 1 : checkObjects[i].form.value.length;
			validateObject.min 		= checkObjects[i].min;
			validateObject.max 		= checkObjects[i].max;

			//if (validateObject.type=="list")
			//alert (validateObject.form.selectedIndex);	
			
			//Debug alert line
			//alert("validateObject: "+validateObject+"\nvalidateObject.val: "+validateObject.val+"\nvalidateObject.len: "+validateObject.len+"\nvalidateObject.min,validateObject.max: "+validateObject.min+","+validateObject.max+"\nvalidateObject.type: "+validateObject.type);
			
			// Checking input. If "min" and/or "max" is defined the input has to be within the specific range
			if(validateObject.type == "num" || validateObject.type == "string"){
				if((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))){
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].num+"\n";
				} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)){
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min.replace('%d',validateObject.min)+language[selectecLanguage].minmax.replace('%d',validateObject.max)+language[selectecLanguage].chars+"\n";
				} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)){
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min.replace('%d',validateObject.min)+language[selectecLanguage].chars+"\n";
				} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)){
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].max.replace('%d',validateObject.max)+language[selectecLanguage].chars+"\n";
				} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0){
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
				}
			} else if(validateObject.type == "email"){
				// Checking existense of "@" and ".". The length of the input must be at least 5 characters. The "." must neither be preceding the "@" nor follow it.
				if((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") ||(validateObject.len < 6) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") ||  !(email_validate(validateObject.val))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].email+"\n";}
			} else if (validateObject.type == "list"){
				// Checking existense of "@" and ".". The length of the input must be at least 5 characters. The "." must neither be preceding the "@" nor follow it.
				if((validateObject.val == -1)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";}
			}
			else if (validateObject.type == "date")
			{
				// Checking date format: yyyy-mm-dd
				var val = validateObject.val;
				val = val.replace(/^\s*/i, '');	// trim left
				val = val.replace(/\s*$/i, '');	// trim right
				var re = /^\d{4}-\d{2}-\d{2}$/gi;
				if (!re.test(val))
				{
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].date+"\n";
				}
			}
			else if (validateObject.type == "nip")
			{
				// Checking NIP format
				var val = validateObject.val;
				val = val.replace(/^\s*/i, '');	// trim left
				val = val.replace(/\s*$/i, '');	// trim right
				var re = /(^\d{2,3}(\s|-)\d{2,3}(\s|-)\d{2,3}(\s|-)\d{2,3}$)|(^\d{10}$)/i;
				if (!re.test(val) || val.length!=10 && val.length!=13)
				{
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].nip+"\n";
				}
			}
			else
			{
				alert('Nieznany typ do walidacji: "'+validateObject.type+'"');
			}
		}
	}
	// Used to set the state of the returnVal. If errors -> show error messages in chosen language
	if(errors){
		alert(language[selectecLanguage].header.concat("\n"+errors));
		errors = "";
		returnVal = false;
	} else {
		returnVal = true;
	}
}


// DODATKOWA VALIDACJA MAILA
function email_validate(email)
{
var tlds = ".ac .ad .ae .af .ag .ai .al .am .an .ao .aq .ar .as .at .au .aw .ax .az .ba .bb .bd .be .bf .bg .bh .bi .bj .bm .bn .bo .br .bs .bt .bu .bv .bw .by .bz .ca .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .cr .cs .cu .cv .cx .cy .cz .dd .de .dj .dk .dm .do .dz .ec .ee .eg .eh .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gn .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .io .iq .ir .is .it .je .jm .jo .jp .ke .kg .kh .ki .km .kn .kp .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .mg .mh .mk .ml .mm .mn .mo .mp .mq .mr .ms .mt .mu .mv .mw .mx .my .mz .na .nc .ne .nf .ng .ni .nl .no .np .nr .nu .nz .om .pa .pe .pf .pg .ph  .pk .pl .pm .pn .pr .ps .pt .pw .py .qa .re .ro .ru .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .tt .tv .tw .tz .ua .ug .uk .um .us .uy .uz .va .vc .ve .vg .vi .vn .vu .wf .ws .ye .yt .yu .za .zm .zr .zw .com .net .org .mil .gov .edu .nato .info .int .name .biz .museum .pro .AC .AD .AE .AF .AG .AI .AL .AM .AN .AO .AQ .AR .AS .AT .AU .AW .AX .AZ .BA .BB .BD .BE .BF .BG .BH .BI .BJ .BM .BN .BO .BR .BS .BT .BU .BV .BW .BY .BZ .CA .CC .CD .CF .CG .CH .CI .CK .CL .CM .CN .CO .CR .CS .CU .CV .CX .CY .CZ .DD .DE .DJ .DK .DM .DO .DZ .EC .EE .EG .EH .ER .ES .ET .EU .FI .FJ .FK .FM .FO .FR .GA .GB .GD .GE .GF .GG .GH .GI .GL .GM .GN .GP .GQ .GR .GS .GT .GU .GW .GY .HK .HM .HN .HR .HT .HU .ID .IE .IL .IM .IN .IO .IQ .IR .IS .IT .JE .JM .JO .JP .KE .KG .KH .KI .KM .KN .KP .KR .KW .KY .KZ .LA .LB .LC .LI .LK .LR .LS .LT .LU .LV .LY .MA .MC .MD .MG .MH .MK .ML .MM .MN .MO .MP .MQ .MR .MS .MT .MU .MV .MW .MX .MY .MZ .NA .NC .NE .NF .NG .NI .NL .NO .NP .NR .NU .NZ .OM .PA .PE .PF .PG .PH  .PK .PL .PM .PN .PR .PS .PT .PW .PY .QA .RE .RO .RU .RW .SA .SB .SC .SD .SE .SG .SH .SI .SJ .SK .SL .SM .SN .SO .SR .ST .SU .SV .SY .SZ .TC .TD .TF .TG .TH .TJ .TK .TL .TM .TN .TO .TP .TR .TT .TV .TW .TZ .UA .UG .UK .UM .US .UY .UZ .VA .VC .VE .VG .VI .VN .VU .WF .WS .YE .YT .YU .ZA .ZM .ZR .ZW .COM .NET .ORG .MIL .GOV .EDU .NATO .INFO .INT .NAME .BIZ .MUSEUM .PRO";
var myRegex = new RegExp("^[A-Za-z0-9\\-\\._]+@[A-Za-z0-9\\-\\._]+\.[A-Za-z]+$")
var endofString = email.split('.');
var ending = endofString.length - 1;
var tld = endofString[ending];
	if (! email.match(myRegex))
	{//alert('Wymagany jest poprawny adres e-mail');
	 return false;
	}
	else if (tlds.search(tld) < 0)
	{
	//alert('Sprawd¼ czy podany adres e-mail jest prawid³owy');
	 return false;
	} else {
		return true;
	}

}

