/*
*  The Validator
*   The class that handles all validation related issues
*
*   pass the name of the form while constructing.
*   methods:
*    add(input_item_name,validation_descriptor,error_string)
*       call this method for each input item. Single input item can have
*       many validations
*
*    setAddnlValidationFunction(function_name)
*             call this function to set a custom validat function, which will
*            be called after other validations are over.
*            The function should return 'true' or 'false'
*/
var use_openwin = 0;
var openwin_size;
var openwin_name;


function Validator(frmname)
{
  this.formobj=document.forms[frmname];
  if(!this.formobj)
  {
    alert("BUG: couldnot get Form object "+frmname);
    return;
  }
  if(this.formobj.onsubmit)
  {
   this.formobj.old_onsubmit = this.formobj.onsubmit;
   this.formobj.onsubmit=null;
  }
  else
  {
   this.formobj.old_onsubmit = null;
  }
  this.formobj.onsubmit=form_submit_handler;
  this.add = add_validation;
  this.setAddnlValidationFunction=set_addnl_vfunction;
  this.clearAllValidations = clear_all_validations;
}

function set_addnl_vfunction(functionname)
{
  this.formobj.addnlvalidation = functionname;
}
function clear_all_validations()
{
  for(var itr=0;itr < this.formobj.elements.length;itr++)
  {
    this.formobj.elements[itr].validationset = null;
  }
}

function set_form_submit_openwin(win_size, win_name) {
	openwin_size = win_size;
	openwin_name = win_name;
	use_openwin  = 1;

}


function form_submit_handler()
{
  for(var itr=0;itr < this.elements.length;itr++)
  {
    if(this.elements[itr].validationset &&  !this.elements[itr].validationset.validate())
    {
      return false;
    }
  }
  if(this.addnlvalidation)
  {
    str =" var ret = "+this.addnlvalidation+"()";
    eval(str);
    if(!ret) return ret;
  }
  
  
  if (use_openwin == 1){
		if (openwin_size == ''){
			openwin_size = '400x300';
		}
		var w_size = openwin_size.split(/x/);
		var win_feature = "status=1,directories=0,resizable=1,toolbar=0,location=0,scrollbars=1,width=" + w_size[0] + ",height=" + w_size[1];
	
		var w_name = 'SinaWinPopup';
	  if (openwin_name != ''){
	  	w_name = openwin_name; 
	  }
	
		window.open('', w_name,win_feature);
	}
  return true;
}

function add_validation(itemname,descriptor,errstr)
{
  if(!this.formobj)
  {
    alert("BUG: the form object is not set properly");
    return;
  }//if
  var itemobj = this.formobj[itemname];
  if(!itemobj)
  {
    alert("BUG: Couldnot get the input object named: "+itemname);
    return;
  } else{



    //if ("length" in itemobj )
    if (itemobj[0] && ( (itemobj[0].type == "radio") || (itemobj[0].type == "checkbox")) ){
      //alert("INFO A: Get the input object named: "+itemname+" of type "+itemobj[0].type+" Added." + typeof(itemobj) );
      if(!itemobj[0].validationset)
        {
          itemobj[0].validationset = new ValidationSet(itemobj);
        }
        itemobj[0].validationset.add(descriptor,errstr, 1);

    } else {
        //alert("INFO B: Get the input object named: "+itemname+" of type "+itemobj.type+" Added." + typeof(itemobj) );

        if(!itemobj.validationset)
        {
          itemobj.validationset = new ValidationSet(itemobj);
        }
        itemobj.validationset.add(descriptor,errstr, 0);
    }
  }


}

function ValidationDesc(inputitem,desc,error,isArray)
{
  this.desc=desc;
  this.error=error;
  this.itemobj = inputitem;
  this.isArray = isArray;
  this.validate=vdesc_validate;

}

function vdesc_validate()
{
 if(!V2validateData(this.desc,this.itemobj,this.error, this.isArray))
 {
   if (this.isArray == 0){
      this.itemobj.focus();
    } else {
      this.itemobj[0].focus();
    }
    return false;
 }
 return true;
}
function ValidationSet(inputitem)
{
  this.vSet     = new Array();
  this.add      = add_validationdesc;
  this.validate = vset_validate;
  this.itemobj  = inputitem;
}
function add_validationdesc(desc,error, isArray)
{
  this.vSet[this.vSet.length]= new ValidationDesc(this.itemobj,desc, error, isArray);
}
function vset_validate()
{
   for(var itr=0;itr<this.vSet.length;itr++)
   {
     if(!this.vSet[itr].validate())
     {
       return false;
     }
   }
   return true;
}

//---------------------------------EMail Check ------------------------------------

/*  checks the validity of an email address entered
*   returns true or false
*
*/

function validateEmailv2(email)
{
// a very simple email validation checking.
// you can add more complex email checking if it helps
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null)
      {
      var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
      if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;
}

function validateURL(aURL){
  //var	regexp_url1 = /^http:\/\/\S+\.(com|net|org|info|biz|ws|us|tv|cc|co)/i
  var	regexp_url1 = /^http:\/\/([A-z\d]+)\:([A-z\d]+)\@([A-z\d\-\.]+\.)+[A-z]/i;
  var	regexp_url2 = /^http:\/\/([A-z\d\-\.]+\.)+[A-z]/i
  var	regexp_url3 = /^http:\/\/(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}/i
  
 if (regexp_url1.test(aURL) || regexp_url2.test(aURL) || regexp_url3.test(aURL)) {
   return true;
 } else {
   return false;
 }
 
}

// ext in format of 'jpg,gif'
function validateFileExt(fname, extlist) 
{
	//var extArray = new Array(".gif", ".jpg");
	var extArray = extlist.split(',');
  var allowSubmit = false;

  while (fname.indexOf("\\") != -1)
    fname = fname.slice(fname.indexOf("\\") + 1);
    ext = fname.slice(fname.indexOf(".")+1).toLowerCase();
    for (var i = 0; i < extArray.length; i++) {
      if (extArray[i] == ext) { allowSubmit = true; break; } 
    }
  if (allowSubmit) return true;
  else return false;

}

function show_error(strError, strDefault, StrAppend){
              if(!strError || strError.length ==0)
              {
                strError = strDefault;
              }//if
              //if (StrAppend.length > 0)
              strError += StrAppend;
              alert(strError);

              return false;
}
/* function V2validateData
*  Checks each field in a form

*/
function V2validateData(strValidateStr,objValue,strError,isArray)
{

    //alert("1. "+strValidateStr+"2. "+objValue+"3. "+strError);
    var epos = strValidateStr.search("=");
    var  command  = "";
    var  cmdvalue = "";
    if(epos >= 0)
    {
     command  = strValidateStr.substring(0,epos);
     cmdvalue = strValidateStr.substr(epos+1);
    }
    else
    {
     command = strValidateStr;
    }

    //alert(objValue.name+"Value = "+objValue.value);

    switch(command)
    {
        case "req":
        case "required":
         {
           if(eval(objValue.value.length) == 0)
             return show_error(strError, objValue.name + " : Required Field", "");
           break ;
         }//case required
        case "maxlength":
        case "maxlen":
          {
             if(eval(objValue.value.length) >  eval(cmdvalue))
               return show_error(strError, objValue.name + " : "+cmdvalue+" characters maximum ", "\n[現在的長度 = " + objValue.value.length + " ]");
             break;
          }//case maxlen
        case "minlength":
        case "minlen":
           {
             if(eval(objValue.value.length) <  eval(cmdvalue))
               return show_error(strError, objValue.name + " : " + cmdvalue + " characters minimum  ", "\n[現在的長度 = " + objValue.value.length + " ]");
             break;
            }//case minlen
        case "alnum":
        case "alphanumeric":
           {
              var charpos = objValue.value.search("[^A-Za-z0-9]");
              if(objValue.value.length > 0 &&  charpos >= 0)
                 return show_error(strError, objValue.name+": Only alpha-numeric characters allowed ",  "\n [Error character position " + eval(charpos+1)+"]");
              break;
           }//case alphanumeric
        case "num":
        case "numeric":
           {
              var charpos = objValue.value.search("[^0-9]");
              if(objValue.value.length > 0 &&  charpos >= 0)
                return show_error(strError, objValue.name+": Only digits allowed ", "\n [Error character position " + eval(charpos+1)+"]");
              break;
           }//numeric

	case "dec":
	case "decimal":
           {
              var charpos = objValue.value.search("[^0-9\.]");
              if(objValue.value.length > 0 &&  charpos >= 0)
                return show_error(strError, objValue.name+": Only digits allowed ", "\n [Error character position " + eval(charpos+1)+"]");
              break;
	   }

        case "alphabetic":
        case "alpha":
           {
              var charpos = objValue.value.search("[^A-Za-z]");
              if(objValue.value.length > 0 &&  charpos >= 0)
                return show_error(strError, objValue.name+": Only alphabetic characters allowed ", "\n [Error character position " + eval(charpos+1)+"]");
              break;
           }//alpha
    case "alnumhyphen":
      {
              var charpos = objValue.value.search("[^A-Za-z0-9\-_]");
              if(objValue.value.length > 0 &&  charpos >= 0)
                return show_error(strError, objValue.name+": characters allowed are A-Z,a-z,0-9,- and _", "\n [Error character position " + eval(charpos+1)+"]");
      break;
      }
			case "email":
			{
				if ( cmdvalue == "optional" && eval(objValue.value.length) == 0){
				 // fine
				} else {
				 if(!validateEmailv2(objValue.value))
				   return show_error(strError, objValue.name+": Enter a valid Email address ", "");
				}
			break;
			}//case email
			
			case "lt":
			case "lessthan":
			{
				if(isNaN(objValue.value))
				{
					alert(objValue.name+": Should be a number ");
					return false;
				}//if
				if(eval(objValue.value) >=  eval(cmdvalue))
				return show_error(strError,  objValue.name + " : value should be less than "+ cmdvalue, "");
				break;
			}//case lessthan
        case "gt":
        case "greaterthan":
         {
            if(isNaN(objValue.value))
            {
              alert(objValue.name+": Should be a number ");
              return false;
            }//if

             if(eval(objValue.value) <=  eval(cmdvalue))
               return show_error(strError, objValue.name + " : value should be greater than "+ cmdvalue, "");
            break;
         }//case greaterthan
        case "regexp":
         {
            if(!objValue.value.match(cmdvalue))
              return show_error(strError, objValue.name+": Invalid characters found ", "");
           break;
         }//case regexp
        case "iregexp":  //case insensitive regexp
         {
            myRE = new RegExp(cmdvalue, "i");
            if(!objValue.value.match(myRE))
              return show_error(strError, objValue.name+": Invalid characters found ", "");
           break;
         }//case iregexp
        case "dontselect":
         {
            if(objValue.selectedIndex == null)
            {
              alert("BUG: dontselect command for non-select Item");
              return false;
            }
            if(objValue.selectedIndex == eval(cmdvalue))
              return show_error(strError, objValue.name+": Please Select one option ", cmdvalue);
             break;
         }//case dontselect

        case "radiogt":
        case "checkboxgt":
         {
            var cb_cnt=0;
            var name;
            if (isArray){
              for(i=0;i<objValue.length;i++)
                if (objValue[i].checked == true) {
                  cb_cnt++;
                }
              name = objValue[0].name;
            } else {
              name = objValue.name;
              if (objValue.checked == true) cb_cnt=1;
            }
            if ( cb_cnt <= eval(cmdvalue))
              return show_error(strError, name + " : value should Select at least "+ eval(cmdvalue+1) + " item", "");
          break;
         }//case checkboxgt
         case "file":
         {
         		if(!validateFileExt(objValue.value, cmdvalue))
               return show_error(strError+cmdvalue, objValue.name+": Only Accept file with ext: "+cmdvalue, "");

         }
         
        case "optionalfile":
        {
        	   if (eval(objValue.value.length) == 0){
          	   	 // fine
          	 } else {
                 if(!validateFileExt(objValue.value, cmdvalue))
                   return show_error(strError+cmdvalue, objValue.name+": Only Accept file with ext: "+cmdvalue, "");
             }
        }
        
        case "url":
        {
          	 if ( cmdvalue == "optional" && eval(objValue.value.length) == 0){
				         // fine
          	 } else {
                 if(!validateURL(objValue.value))
                   return show_error(strError+cmdvalue, objValue.name+": Only Accept a URL", "");
             }
        }        
    }//switch
    return true;
}
