// Copyright Rafal Filipek 2006
// www.nookie.pl | me@nookie.pl | gg:3943367
function Validator(f){
if(!$(f)){alert('Formularz od id "'+f+'" nie istnieje na stronie.');}
else{var _form=$(f);_form.onsubmit=function(){if(!run()){return false;}};}
var _data=[];
var _errors=[];
var _fields=['text','password','textarea','file','checkbox','radio','select-one','select-multiple'];
var _groups=[['text','password','textarea'],['file'],['checkbox','radio'],['select-one'],['select-multiple']];
var _rules=[['req','minLength','maxLength','signs','type','pattern','regExp','patternMsg'],['req'],['req'],['req','falseValue'],['req']];
var _types_name=['email','www','postalcode','custom'];
var _types=[/^[\w\.-]+@([\w-]+)*\.[a-z]{2,4}$/,/^(http:\/\/|https:\/\/|ftp:\/\/)?(www.)?([\w.\-_]+)[.]{1}([\w]+){1,4}([\/]?([\w.\-_]+)?)+$/,/^[0-9]{2}-[0-9]{3}$/];
var _signs=['l','n','ln','m','custom'];
function $(id){return document.getElementById(id);}
function F(name){return _form[name];}
function trim(x){return x.replace(/^\s+|\s+$/g,'');}
function in_array(element,array){for(var i=0,j=array.length;i<j;i++){if(array[i]==element)return true;}return false;}
function valid_type(value,type,custom){if(type==4&&custom!=''){return eval('/'+custom+'/.test(value)');}else{return _types[type].test(value);}}
function add_error(msg){_errors.push(msg);}
function T(name){return(_form[name][0]&&_form[name][0].type=='radio')?_form[name][0].type:_form[name].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':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.push(F(name).options[i].value);}}
return v;break;}return false;}
function C(name,rules){
var type=-1;
switch(T(name)){
case'text':case'password':case'textarea':type=0;break;
case'file':type=1;break;
case'checkbox':case'radio':type=2;break;
case'select-one':type=3;break;
case'select-multiple':type=4;break;
default:alert('Pole "'+name+'" nie moze byc walidowane.');return false;
}
if(type==-1){return false;}
for(var x in rules){
if(!in_array(x,_rules[type])){alert('Nie mozna zastosowac opcji "'+x+'" dla pola "'+name+'" lub opcja ta nie istnieje.');return false;} 
if(x=='signs' && !in_array(rules[x],_signs)){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],_types_name)){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.addField=function(name, rules, user_name){
if(!F(name)){alert(' W formularzu nie istnieje pole "'+name+'".');return false;}
if(!R(rules)){alert('Jezeli chesz sprawdzic pole "'+name+'" musisz podac przynajmniej 1 kryterium.');return false;}
if(C(name,rules)){_data.push([name, rules, user_name]);return true;}
}
function run(){
_errors=[];
for(var i=0,j=_data.length; i<j; i++){
var el=F(_data[i][0]);
var name=_data[i][0];
var rules=_data[i][1];
var uname=(_data[i][2]=='')?name:_data[i][2];
if(rules.req==1){	
switch(T(name)){
case'text':case'password':case'file':case'textarea':if(trim(V(name))==''){add_error([name,'Pole "'+uname+'" jest wymagane.'])}break;					
case'checkbox':case'radio':if(!V(name)){add_error([name,'Pole "'+uname+'" musi byc zaznaczone.'])}break;
case'select-one':if(V(name)==0||V(name)==''||V(name)==(rules.falseValue)?rules.falseValue:0){add_error([name,'Musi zostac wybrany element list "'+uname+'".'])}break;
case'select-multiple':if(V(name).length==0){add_error([name,'Przynajmniej jeden element listy "'+uname+'" musi byc zaznaczony.'])}break;
}}
if(rules.minLength && trim(V(name)).length<rules.minLength){add_error([name,'Pole "'+uname+'" musi miec przynajmniej '+rules.minLength+' znakow.'])}
if(rules.maxLength && trim(V(name)).length>rules.maxLength){add_error([name,'Pole "'+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.patternMsg=='')?rules.pattern:rules.patternMsg;}
if(V(name).search('[^'+pattern+']')>=0){add_error([name,'Pole "'+uname+'" moze zawierac tylko '+msgAdd+'.']);}}
if(rules.type){
if(rules.type=='email'&&(!valid_type(V(name),0) || V(name)=='')){add_error([name,'Pole "'+uname+'" musi zawierac poprawny adres e-mail.']);}
if(V(name)!=''&&rules.type=='www'&&!valid_type(V(name),1)){add_error([name,'Pole "'+uname+'" musi zawierac poprawny adres www.']);}
if(rules.type=='postalcode'&&(!valid_type(V(name),2) || V(name)=='')){add_error([name,'Pole "'+uname+'" musi zawierac poprawny kod pocztowy.']);}
if(V(name)!=''&&rules.type=='custom'&&!valid_type(V(name),3,rules.regExp)){add_error([name,'Pole "'+uname+'" jest niepoprawne.']);}}}
if(_errors.length>0){if(this.userErrors){this.userErrors(_errors)}else{showErrors()}return false;}else{ return true; }}
this.addErrorFunction = function(f){this.userErrors = f; return true; }
function showErrors(){var eMsg=[];for(var i=0,j=_errors.length;i<j;i++){eMsg[i]=_errors[i][1];}alert(eMsg.join('\n'));}
}


