/*  $Id: validator.js 4465 2007-04-19 07:42:44Z ajramos $
 *  validator function with row error notification.
 */

var a_format  =   {
    'alpha'      :   /^[a-zA-Z]*$/,
    'alphanum'   :   /^[a-zA-Z0-9\-\_]*$/,
    'add'        :   /^[a-zA-Z0-9\-\._\, \'\ ]*$/,
    'cur'        :   /^[0-9\.\,]/,
    'date'       :   /^(\d{1,2})\-(\d{1,2})\-(\d{4})$/,
    'eml'        :   /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z])+$/,
    'num'        :   /^\d+$/
     },
    a_msg =[
    '%label% is required.',
    'Value for %label% is invalid. ',
    '%label% must match previous entry.',
    'Value for %label% must be %mn% characters or more.',
    'Value for %label% must be no longer than %mx% characters.'];
var DV = {
    count:0,
    init:function(elm,n_fields,cl){
        this.a_fields = n_fields;
        this.className = cl;
        if(elm){
           var OBJ = document.forms[elm];
           var func = OBJ['onsubmit'];
           OBJ['onsubmit'] = function(){
               if(typeof func =='function'){
                       var fv1 = DV.Run();
                       var fv2 = func();
                       var fv3 = (fv1) ? ((fv2) ? true:false):false;
                           if(!fv3)
                                alert("There are still missing or invalid fields in the form.\nPlease review the information entered before submit.");
                       return fv3;
               }else{
                   return DV.Run(); 
               }
           };
        }
        try{
            if(n_fields || typeof(n_fields) =='object'){
                for(var s_key in n_fields){
                    if(typeof(n_fields[s_key]['e']) == 'object'){
                        for(var i in n_fields[s_key]['e']){
                            addEvent(document.getElementById(s_key),n_fields[s_key]['e'][i],DV.exec);
                        }
                    }else{
                        addEvent(document.getElementById(s_key),n_fields[s_key]['e'],DV.exec);
                    }               
                }
            }
        }catch(e){             
            alert(e+"=>Initialize id: "+s_key);
        }     
    },
    exec:function(e){
   		var el = window.event ? window.event.srcElement : e ? e.target : null;
        if(el){
           DV.validate(el.id);   	        
        }
    },
    Run:function(){
      DV.count=0; 
      for(var s_key in DV.a_fields){ 
          DV.validate(s_key); 
      }
      return (DV.count>0)? false:true;
    },
    validate:function(v_key){
       n     =  DV.a_fields[v_key];
       el    =  document.getElementById(v_key);
       av    =  '';
       emsg  =  '';
            if(n['a'] && typeof(n['a']) =='object') {
                for(var _a in n['a']){
                    av += document.getElementById(n['a'][_a]).value + n['p'];
                }
                if(av) return false; 
            }
            elm = (av) ? av+=el.value:el.value;
            el.value = elm = DV.strip(elm);
            el2 = (n['m']) ? document.getElementById(n['m']):'';
            var elm2='';
            if(n['m']) elm2 = DV.strip(el2.value);
            if(el.tagName.toLowerCase() == 'input'){
               if(el.type == 'text' ||el.type == 'password'){
                    emsg = DV.check(elm,n['l'],elm2,n['f'],n['mn'],n['mx'],n['r']);
               }else{
            		var rv = '';
            		var rad = document.getElementsByName(el.name);
	           		for (var i = 0; i < rad.length ; i++) { 
            		   if (eval(rad[i].checked)) { rv += '-'; }else{ rv += ''; }
            		}
            		emsg = (!rv)? a_msg[0].replace('%label%',n['l']):'';
               }
            }else if(el.tagName.toLowerCase() == 'textarea'){
                emsg = DV.check(elm,n['l'],elm2,n['f'],n['mn'],n['mx'],n['r']);
            }else{
                sindx = el.selectedIndex;
               	emsg =(sindx==0 || sindx==-1) ?  a_msg[0].replace('%label%',n['l'] ):'';
            }

       DV.showMsg(((n['h'])? n['h']:el.id),emsg);
	   if(emsg) DV.count++;
    },
    showMsg:function(elm,msg){
      var er1= document.getElementById(elm+'-row');
      var er1m = document.getElementById(elm+'-msg');
      try{
          if(msg){
            if(er1m.innerHTML != msg){
               er1m.innerHTML = msg;
               er1.className = DV.className;
               er1.style.display = '';
            }
          }else{
               er1m.innerHTML = '';
               er1.className = '';
               er1.style.display = 'none';
          }
      }catch(e){
          alert(e +"=>showMsg:"+elm);
      }        
    },
    check:function(){
        var arg = arguments;
        var emsg='';
        var regx = (a_format[arg[3]]) ? a_format[arg[3]]:arg[3];
        if(!arg[0]){
            emsg = (arg[6]) ? a_msg[0].replace('%label%',arg[1]):'';
        }else if(arg[0] && regx && !regx.test(arg[0])){
    		if(arg[3] =='date'){
        		if (!regx.test(arg[0])){
        			emsg =  a_msg[1].replace('%label%',arg[1]);
        		}	
        		if (RegExp.$1 > 31 || RegExp.$2 > 12){
        			emsg =  a_msg[1].replace('%label%',arg[1]);
        		}	
        		var dt_test = new Date(RegExp.$3, Number(RegExp.$2-1), RegExp.$1);
        		if (dt_test.getMonth() != Number(RegExp.$2-1)){
        			emsg =  a_msg[1].replace('%label%',arg[1]);
        		}
    		}	
            emsg =  a_msg[1].replace('%label%',arg[1]);
        }else if(arg[2] && arg[0] != arg[2]){
            emsg =  a_msg[2].replace('%label%',arg[1])	
        }else if(arg[4] && arg[0].length < arg[4]){
       	    emsg =  a_msg[3].replace('%label%',arg[1]);
       	    emsg =  emsg.replace('%mn%',arg[4]);	    	    	    
       	}else if(arg[5] && arg[0].length > arg[5]){
       	    emsg =  a_msg[4].replace('%label%',arg[1]);
       	    emsg =  emsg.replace('%mx%',arg[5]);	    	    	    
       	}else {
       	    emsg = '';
       	}
    	return emsg;
    },
    strip:function(str){
        str = str.replace(new RegExp(/^\s+/),""); // START
        str = str.replace(new RegExp(/\s+$/),""); // END
        return str;
    }
}
