// Copyright Rafał 'Nookie' Filipek | www.nookie.pl | me@nookie.pl | gg:3943367 | v. 2.0
function Validator(languageCode){
var form ,data;
var tRules=['req','minLength','maxLength','signs','type','pattern','regExp','patternMsg'];
var fRules=['req'];
var crRules=['req'];
var smRules=['req'];
var sRules=['req','falseValue'];
var signsRules=['l','n','ln','m','custom'];
var typeRules=['email','www','nip','postalcode','custom'];
var tGroup=['text','password','textarea'];
var fGroup=['file'];var cfGroup=['checkbox','radio'];
var sGroup=['select-one'];var smGroup=['select-multiple'];
switch(languageCode){
	case "pl":	/* Polish */
		var msg=['Pole',
		'jest wymagane',
		'nie moze byc walidowane.',
		'musi byc zaznaczone.',
		'musi zawierac poprawny adres e-mail.'];
		break;

	case "en":	/* English */
		var msg=['Field',
		'is required',
		'cannot be validated',
		'must be checked',
		'must be a valid email address'];
		break;
}

function $(id){return document.getElementById(id);}
function trim(x){return x.replace(/^\s+|\s+$/g,'')}
function in_array(array,rule,i,l){for(i=0;i<(l=array.length)&&array[i++]!==rule;);return i!=l-1}
function validEmail(value){return/^[\w\.-]+@([\w\.-]+)*\.[a-z]{2,4}$/.test(value)}
function validWWW(value){return/^(http:\/\/|https:\/\/|ftp:\/\/)?(www.)?([\w]+)(.[\w]+){1,2}$/i.test(value)}
function validNIP(value){return/^[0-9]{3}-[0-9]{2}-[0-9]{2}-[0-9]{3}$/.test(value)}
function validPostalCode(value){return/^[0-9]{2}-[0-9]{3}$/.test(value)}
function validCustom(value,regExp){return eval('/^'+regExp+'.test(value)')}
function addError(msg){errors[errors.length]=msg}
function F(name){return form[name];}
function T(name){var e=(form[name][0] && form[name][0].type=='radio')?form[name][0]:form[name]; return e.type;}
function R(rules){var i=0;for(var x in rules){i++;} return(i>0)?true:false;}
function V(name){switch(T(name)){case'text':case'password':case'file':case'textarea':return F(name).value;break;
case'checkbox':return F(name).checked;break;
case'radio':var v=false;for(var i=0,j=F(name).length;i<j;i++){if(form[name][i].checked){return true;}}break;
case'select-one':return F(name).options[F(name).selectedIndex].value;break;
case'select-multiple':var v=[];for(var i=0,j=F(name).options.length;i<j;i++){if(F(name).options[i].selected){v[v.length]=F(name).options[i].value; return v;}}break;} return false;}
function C(name,rules){var type=0;
switch(T(name)){case'text':case'password':case'textarea':type='tRules';break;
case'file':type='fRules';break;
case'checkbox':case'radio':type='crRules';break;
case'select-one':type='sRules';break;
case'select-multiple':type='smRules';break;
default:alert(msg[0]+' "'+name+'" '+msg[2]);return false;}
if(type==0){return false;}
for(var x in rules){if(!in_array(x,eval(type))){alert('Nie mozna zastosowac opcji "'+x+'" dla pola "'+name+'" lub opcja ta nie istnieje.'); return false;} 
if(x=='signs' && !in_array(rules[x],signsRules)){alert('Podana zostala nieprawidlowa wartosc opcji "signs" dla pola "'+name+'".'); return false;} 
if(x=='signs' && rules[x]=='custom' && !rules.pattern){alert('Brak opcji "pattern" dla pola "'+name+'" wymaganej podczas uzycia opcji signs:\'custom\'.');return false;}
if(x=='type' && !in_array(rules[x],typeRules)){alert('Podana zostala nieprawidlowa wartosc opcji "type" dla pola "'+name+'".'); return false;}
if(x=='type' && rules[x]=='custom' && !rules.regExp){alert('Brak opcji "regExp" dla pola "'+name+'" wymaganej podczas uzycia opcji type:\'custom\'.');return false;}}return true;}
this.start=function(form_id){if($(form_id)){form=$(form_id);data=[];form.onsubmit=function(){return false}; return true;}else {alert('Formularz o id "'+form_id+'" nie istnieje na stronie.');return false;}}
this.addField=function(name, rules, user_name, custom_msg){if(F(name)){if(R(rules)){if(C(name,rules))	data[data.length]=[name, rules, user_name]; return true;}else{alert('Jezeli chesz sprawdzic pole "'+name+'" w formularzu o id "'+form.id+'" musisz podac przynajmniej 1 kryterium.');return false;}}else {alert('W formularzu o id "'+form.id+'" nie istnieje pole "'+name+'".');return false;}}
this.run=function(){errors=[];
for(var i=0,j=data.length; i<j; i++){var el=F(data[i][0]);var name=data[i][0];var uname=(data[i][2]=='')?name:data[i][2];var rules=data[i][1];var cmsg=data[i][3];
if(rules.req==1){switch(T(name)){case'text':case'password':case'file':case'textarea':
if(trim(V(name))==''){addError(msg[0]+' "'+uname+'" '+msg[1]+'.')}break;					
case'checkbox':case'radio':	if(!V(name)){addError(msg[0]+' "'+uname+'" '+msg[3])}break;
case'select-one':if(V(name)==0||V(name)==''||V(name)==(rules.falseValue)?rules.falseValue:0){addError('Musi zostac wybrany element list "'+uname+'".')}break;
case'select-multiple':if(V(name).length==0){addError('Przynajmniej jeden element listy "'+uname+'" musi byc zaznaczony.')}break;
default: alert(msg[0]+' "'+name+'" nie moze byc walidowane.');return false;}}
if(in_array(T(name),tGroup)){if(rules.minLength && trim(V(name)).length<rules.minLength){addError(msg[0]+' "'+uname+'" musi miec przynajmniej '+rules.minLength+' znakow.')}
if(rules.maxLength && trim(V(name)).length>rules.maxLength){addError(msg[0]+' "'+uname+'" moze miec maksymalnie '+rules.maxLength+' znakow.')}
if(rules.signs){if(rules.signs=='l'){pattern='A-Za-z';msgAdd='litery';}
if(rules.signs=='n'){pattern='0-9';msgAdd='cyfry';}
if(rules.signs=='ln'){pattern='A-Za-z0-9';msgAdd='litery i cyfry';}
if(rules.signs=='m'){pattern='A-Za-z0-9\-_';msgAdd='litery, cyfry oraz "-" i "_"';}
if(rules.signs=='custom'){pattern=rules.pattern;msgAdd=(rules.patternMsg=='')?rules.pattern:rules.patternMsg;}
if(V(name).search('[^'+pattern+']')>=0){addError(msg[0]+' "'+uname+'" moze zawierac tylko '+msgAdd+'.')}}
if(rules.type){if(rules.type=='email'&&!validEmail(V(name))){addError(msg[0]+' "'+uname+'" '+msg[4])}
if(rules.type=='www'&&!validWWW(V(name))){addError(msg[0]+' "'+uname+'" musi zawierac poprawny adres www.')}
if(rules.type=='nip'&&!validNIP(V(name))){addError(msg[0]+' "'+uname+'" musi zawierac poprawny numer NIP.')}
if(rules.type=='postalcode'&&!validPostalCode(V(name))){addError(msg[0]+' "'+uname+'" musi zawierac poprawny kod pocztowy.')}
if(rules.type=='custom'&&!validCustom(V(name),rules.regExp)){addError(msg[0]+' "'+uname+'" jest niepoprawne.')}}}}
if(errors.length==0){form.onsubmit=function(){return true};return true;}else{showErrors(errors);return false;}}
function showErrors (errors){alert(errors.join('\n'))}
}
