/*
 * PageValidator 1.1
 * Copyright (c) 2007 Daniel.Lin(http://www.aspstat.com)
 * To Run This Code jQuery 1.1.3.1(http://www.jQuery.com) Required.
 */
//base class for a validator
function Validator(
  srcID , empty , msgOnTip , msgOnErr , msgOnEmpty , onValid
){
   this.msgOnTip = msgOnTip||"请输入内容";   
   this.msgOnError = msgOnErr||"输入错误";
   this.msgOnEmpty = msgOnEmpty||"输入内容为空";
   this._parent = srcID; 
   this.empty = empty;
   if ( null!= onValid && undefined != onValid )
     this.onValid = onValid;
   this.isValid = false;
}
//note: tip panel must with these format : valid control id and "Tip"
Validator.prototype.updateShow =function(){
   var srcCTLWithJQuery = $("#"+this._parent); 
   var tip = $( "#"+srcCTLWithJQuery.attr("id")+"Tip" );
   if ( !this.isValid ){
      tip.html( this.msgOnError );          
      tip.removeClass();
      tip.addClass( "msgError" );       
   }
   else{ 
      if ( null!= this.onValid )
         this.onValid(srcCTLWithJQuery);
      if ( this.empty && srcCTLWithJQuery.val().length==0 ){
     
        tip.html( this.msgOnEmpty );
        }
      else     
      {
        if( srcCTLWithJQuery.attr("alt")==undefined || srcCTLWithJQuery.attr("alt")==null )
        {
        tip.html('输入确认');
        }
        else{
        tip.html( srcCTLWithJQuery.attr("alt") );
        }
      }
      tip.removeClass();
      tip.addClass( "msgOK" );
   }
}

function SelectValidator( srcID ,empty, msgOnErr , msgOnEmpty, onValid ){
  this._base = Validator;
  this._base( srcID ,empty, null , msgOnErr ,msgOnEmpty , onValid );  
  if ( empty ){
      this.isValid = true;
  }

}
SelectValidator.prototype.updateShow = Validator.prototype.updateShow;
SelectValidator.prototype.valid = function(){
     if ( this.empty )
        this.isValid = true;
     else{
         var isValid=true;
         var srcCTLWithJQuery = $("#"+this._parent);
         var groupname = srcCTLWithJQuery.attr("groupname");
		 var ctls = $("select[@groupname="+groupname+"]" );
	     ctls.each( function(){          
		    if ( this.options.length > 0 ){
		       if ( this.value == "" || this.value == "-1")
			      isValid = false;
		       else 
			      isValid = isValid&&true;
		    }
		    else{
		     isValid = isValid&&true;
		    }
	     });
	     this.isValid = isValid;
     }
 
}

//this class represent checking a input element inherit from Validator
function InputValidator(
  srcID ,  min , max , empty , regex ,  msgOnTip , msgOnErr , msgOnEmpty , onValid){
  this._base = Validator;
  this._base( srcID ,empty, msgOnTip , msgOnErr , msgOnEmpty , onValid );  
  this.min = min;
  this.max = max;
  this.regex = regex;
  if ( empty ){
	  this.isValid = true;
  }
}
InputValidator.prototype.updateShow = Validator.prototype.updateShow;
InputValidator.prototype.valid = function(){
   var srcCTLWithJQuery = $("#"+this._parent);
   var val = srcCTLWithJQuery.val();
   var len = 0 ;
   
   //check input length
   for ( var i = 0 ; i<val.length  ; i++ ){
       if ( val.charCodeAt(i)>=0x4e00 && val.charCodeAt(i)<= 0x9fa5 )
         len+=2;
       else
         len++;
   }
   if ( val.length == 0 && this.empty==true ){
      this.isValid = true;   
   }  
   else if (  len < this.min ||  len > this.max ){
      this.isValid = false;   
       
   }
   //check with regexpression
   else if ( this.regex != null && this.regex != undefined  && typeof this.regex == "string" && this.regex!="" ){   
      var exp = new RegExp( "^"+ this.regex+"$" , "i");
      var isTest = exp.test( val );
      if ( !isTest ){        
         this.isValid = false
      }
      else{
         this.isValid = true;
      }
   }
   else{
      this.isValid =true;      
   }   
}

//this class represent compare valid
function CompareValidator( srcID , desID , msgOnErr ){   
   this.base = Validator;
   this.base( srcID ,true, null , msgOnErr, null );  
   this._compare = desID;
}
CompareValidator.prototype.updateShow = Validator.prototype.updateShow;
CompareValidator.prototype.valid = function(){  
   var srcCTLWithJQuery = $("#"+this._parent);
   var desCTLWithJQuery = $("#"+this._compare);
   if ( srcCTLWithJQuery.val() == desCTLWithJQuery.val() ){
      this.isValid = true;
   }
   else{
      this.isValid = false;
   }
}
//this class represent ajax valid
function AjaxValidator( srcID , url  ,  msgOnErr , ajaxCallback ){   
   this.base = Validator;
   this.base( srcID ,true, null , msgOnErr ,null  );  
   this.url = url;      
   this.isAjax = true;       
   if ( null!= ajaxCallback )
      this.callback = ajaxCallback;  
}
AjaxValidator.prototype.updateShow = Validator.prototype.updateShow;
AjaxValidator.prototype.valid = function(){  
   var srcCTLWithJQuery = $("#"+this._parent);  
   var tip = $( "#"+srcCTLWithJQuery.attr("id")+"Tip" );
   tip.html( "loading..." );
   tip.removeClass();
   tip.addClass( "msgAjaxing" );
   srcCTLWithJQuery.get(0).ajaxvalid=this;  
   $.ajax({
	   type: "POST",
	   url: this.url,
	   data: srcCTLWithJQuery.attr("name")+"=" + srcCTLWithJQuery.val(),
	   success: function(data){
			 var obj = eval( "({value:"+data+"})");        
			 var t = srcCTLWithJQuery.get(0).ajaxvalid;
			 if ( undefined!= t.callback ){       
				t.callback( obj , t );
			 }
			 else
			 {
				if ( obj.value )
				   t.isValid = true;
				else
				   t.isValid = false;
			 } 
			 t.updateShow();    
			
		}
   });    
}

//function represent init a element need to valid
function initValid(  validator ){
    var srcID = validator._parent;
	var srcCTLWithJQuery = $("#"+srcID);
	var srcTag = srcCTLWithJQuery.get(0).tagName;
	var arrayValidator = new Array(); 
	arrayValidator.push( validator );
	srcCTLWithJQuery.get(0).validator = arrayValidator;
	var tip = $( "#"+srcID+"Tip" );
    tip.html( srcCTLWithJQuery.attr("title") );
    tip.addClass( "msgNormal" ); 

	
    if (srcTag == "INPUT" || srcTag=="TEXTAREA"){
		
		var type=srcCTLWithJQuery.attr( "type");
		if ( type=="text" || type=="password" ||type=="file" || srcTag=="TEXTAREA" ){
			var defaultVal = srcCTLWithJQuery.attr("value");	
			if (null!= defaultVal && defaultVal!= undefined && defaultVal!=""){				
				validator.isValid = true;
			}
			srcCTLWithJQuery.focus(function(){			   
			   var tip = $( "#"+this["id"]+"Tip" );
			   tip.html( this.validator[0].msgOnTip );			 
			   tip.removeClass();
			   tip.addClass( "msgOnFocus" );
			});
			srcCTLWithJQuery.blur(function(){   
			   for ( var i = 0 ; i<this.validator.length ; i ++ ){     
				 this.validator[i].valid();   				 
				 if ( this.validator[i].isAjax==null ||this.validator[i].isAjax== undefined ){
					this.validator[i].updateShow();
					if ( !this.validator[i].isValid )          
					    break;				       
				 }
			   }
			});
		}else if ( type=="checkbox" || type=="radio"){
			var ctls = $( "input[@name="+srcCTLWithJQuery.attr("name")+"]" );
			var defaultVal = srcCTLWithJQuery.attr("checkedValue");	
			
			if (null!= defaultVal && defaultVal!= undefined){
				ctls.each( function(){
				  if ( this.value == defaultVal)
				  {
					  this.checked = "checked";
					  validator.isValid = true;
				  }
				});
			}
			ctls.bind( "click" , function(){           
			   var val;
			   if ( this.validator == undefined ){
				  val = ctls.get(0).validator[0];
			   }
			   else
				  val =this.validator[0];
			   val.isValid = true;           
			   val.updateShow();
		   });       
		}
    } else if (srcTag == "SELECT"){
		var groupname = srcCTLWithJQuery.attr("groupname");
		var ctls = $("select[@groupname="+groupname+"]" );
		ctls.each( function(){
			var defaultVal = $(this).attr('selectedValue');			
			if ( null!= defaultVal && defaultVal!= undefined){			 
			    $.each( this.options ,function(){			
				  if ( $.trim(this.value)==$.trim(defaultVal) || this.text==defaultVal )
				  {    
				     this.selected = true;				  
				  }
				});
				validator.isValid = true;				  
			}
		});
        
		ctls.bind( "change" , function(){
		    var validators = ctls.get(0).validator;
		    for ( var i = 0 ; i<validators.length ; i ++ ){ 
				if ( validators[i].isAjax==null || validators[i].isAjax== undefined ){
					 validators[i].valid();			 
					 validators[i].updateShow();
					 
					 if ( !validators[i].isValid )
					    break;
				 }
				 else{ 
					 if ( this.id == srcID )            
					    validators[i].valid();    
				 }            
			}
		});
    }
}
function appendValid( validator ){
   var srcCTLWithJQuery = $("#"+validator._parent).get(0);   
   if ( srcCTLWithJQuery.validator == undefined )
      srcCTLWithJQuery.validator = new Array();   
   srcCTLWithJQuery.validator.push( validator );
}



function PageIsValid(){
var isValid = true;
$(".validElement").each(function(){ 
   if ( $( "#"+this["id"] ).get(0).validator!=undefined && $( "#"+this["id"] ).get(0).validator!=null ){    
       for( var i = 0 ; i < $( "#"+this["id"] ).get(0).validator.length   ; i++ ){
          if ( $( "#"+this["id"] ).get(0).validator[i].isValid==false ){
             $( "#"+this["id"] ).get(0).validator[i].updateShow();
             isValid = false;

          }
       }
   }
});
return isValid;
}