/** 
Usage: this js file is used for html form datatype checking.
all the configuration operation can divide into the following parts.

1. set attribute to html object, "isEmpty",have two value true or false
true means allow empty,false means not allow empty. this attribute is 
required for any form element which need to check datatype.

2. set attribute "desc",which shows meanful description help end-user easy to operate
this attribute is required for any form element which need to check datatype.

3. set attribute "datatype", which is used for checking function ensure datatype,
this attribute is desired datatype of which use input. datatype checking function
will check weather userd entered the valid datatype.
datatype attribute have sereval value below:
string, int,date. 


*/

// check form elements
function validateForm(obj)
{
	/*
  if(obj==null){
    if(document.forms[0])
      obj=document.forms[0];
    else
      return true;
  }
*/
 var formElements=obj.elements;
 var iCount;
 var r = true;
 for(iCount=0;iCount<formElements.length;iCount++)
 {
   if((formElements[iCount].type=="text")
   ||(formElements[iCount].type=="textarea")
   ||(formElements[iCount].type=="file")
   ||(formElements[iCount].type=="select-one")
   ||(formElements[iCount].type=="select-multiple")
   )
   { 
    
	   r=testE(formElements[iCount]);
	   if(!r)
	   {
			formElements[iCount].focus();
			//remarked select() event if "<select>" html object invoke select() function
			//the error will occur modified by Cole
			//formElements[iCount].select();
			
			if (formElements[iCount].type!="select-multiple"){
			  alert( formElements[iCount].getAttribute("desc") +":This item is not a valid datatype!" );
		  }
		  
			break;
	   }
   }
 }

 return r;
}

function testE(el)
{
  //only check is empty.
  if (el.type=="select-multiple"){
    var retVal=false;
    var i=0;
    if (el.isEmpty=="yes"){
      for(i=0;i<el.options.length;i++){
        if (el.options(i).selected==true){
          retVal=true;  
        }  
      }
      
      if (retVal==false){
        alert("Please select this item!");  
      }
        
    }else{
      retVal=true;  
    }
    return retVal;
  }
    

	var r = true;
	var s = "";
	var mtype;
	var type;
	var value;
	var isEmpty;

	type = toNonNull(el.getAttribute("datatype")).toLowerCase();
	value = toNonNull(el.value).toLowerCase();


	isEmpty = toNonNull(el.getAttribute("isEmpty")).toLowerCase();

	if ((isEmpty.toLowerCase()=="false")&&isBlank(value)) return false;

	if( !isBlank( isEmpty ) && isEmpty.toLowerCase()=="false" 
	  || !isBlank( value ) && !isBlank( type ) 
	  ){
		r = testStrMinLen( value, el.minlength );

		r = r && testTV( type, value );
	}

	return r;
}

function testTV( type, value )
{
  
	var r = true;
	var s = "";
	var mtype;
	if( isNull(type) ){
		mtype="";
	}else{
		mtype = trim(type.toLowerCase());
	}

	if( mtype == "email" )
	{
		r = isEmail( value );
	}else if( mtype=="date" ){
		r = isDate( value );
	}else if( mtype=="birthday" ){
		r = isDate( value );
	}else if( mtype == "time" ){
		r = isTime( value );
	}else if( mtype == "postcode" ){
		r = isPostcode( value );
	}else if( mtype == "int" ){
		r = isInt( value );
	}else if( mtype == "long" ){
		r = isInt( value );
	}else if( mtype == "float" ){
		r = isFloat( value );
	}else if( mtype == "double" ){
		r = isDouble( value );
	}else if( mtype == "ip" ){
		r = isIp( value );
	}else if( mtype == "url" ){
		r = isUrl( value );
	}else if( mtype == "chinese" ){
		r = isAllChinese( value );
	}else if( mtype == "chinesein" ){
		r = isChineseIncluded( value );
	}else if( mtype == "allchinese" ){
		r = isAllChinese( value );
	}else if( mtype == "doublechar" ){
		r = isAllDoubleChar( value );
	}else if( mtype == "doublecharin" ){
		r = isDoubleCharIncluded( value );
	}else if( mtype == "alldoublechar" ){
		r = isAllDoubleChar( value );
	}else if( mtype == "cellposition" ){
		r = isCellPosition(value);
	}else if( mtype == "string" ){
		r = isString(value);
	}else if( mtype == "sqlString" ){
		r = isSqlString(value);
	}else{
		r = !isNull( value );
	}

	return r;
}

function testStrMinLen( str, len )
{
	var r = true;
	var l = "" + len;
	if( !isBlank(l) && trim(str).length<parseInt(l) )
	{
		errorCode = "The length at least should be " + l + " !";
		r = false;
	}

	return r;
}

function isUrl( value )
{
	var p = /((\w+):\/\/)?[\w-]+(\.[\w-]+)*(:\d*)?(\/[^# ]*)*/;
	return verify( value, p );
}

function isAllChinese( value )
{
	var p = /^[\u4e00-\u9fa5]+$/;
	return verify( value, p );
}

function isChineseIncluded( value )
{
	var p = /[\u4e00-\u9fa5]+/;
	return verify( value, p );
}

function isAllDoubleChar( value )
{
	var p = /^[^\x00-\xff]+$/;
	return verify( value, p );
}

function isDoubleCharIncluded( value )
{
	var p = /[^\x00-\xff]+/;
	return verify( value, p );
}

function isIp( value )
{
	var p = /^(([01]{0,1}[0-9]{1,2})|(2([0-4]{1}[0-9]{1}|5[0-5]{1})))(\.(([01]{0,1}[0-9]{1,2})|(2([0-4]{1}[0-9]{1}|5[0-5]{1})))){3}$/;
	return verify( value, p );
}

function isDouble( value )
{
	return isFloat( value );
}

function isFloat( value )
{
	var p = /^(-{0,1}|\+{0,1})[0-9]+(\.{0,1}[0-9]+)$/;
	return verify( value, p );
}

function isInt( value )
{
	var p = /^[\+-]?[0-9]{1,}$/;
	return verify( value, p );
}

function isBirthday( value )
{
	var p = /^[(19\d{2})|(200\d)]{1}(-\d{1,2}){2}$/;
	return ( isDate( value )  &&  verify( value, p ) );
}

function isDate( value )
{
	var s = value;
	if( s.indexOf( "/" ) > 0 )
	{
		s = s.replace( "/", "-" );
		s = s.replace( "/", "-" );
	}

	var p = /^(0{0,1}[1-9]{1}|1[0-2]{1})-(0{0,1}[1-9]{1}|([12][0-9]){1}|30|31)-([1-2][0-9]{3})$/;
	if( verify( s, p ) )
	{
		var dd = s.split("-");
		s = dd[2] + "-" + dd[0] + "-" + dd[1];
	}

	return isDate1( s );
}

function isDate1( value )
{
	var p = /^([1-2][0-9]{3})-(0{0,1}[13578]|1[02])-(0{0,1}[1-9]|[1-2]{0,1}[0-9]|3[0-1]{1})$/
	if( verify( value, p ) )
	{
		return true;
	}

	var p = /^[1-2][0-9]{3}-(0{0,1}[469]|11)-(0{0,1}[1-9]|[1-2]{0,1}[0-9]|30)$/
	if( verify( value, p ) )
	{
		return true;
	}

	var p = /^[1-2][0-9]{3}-(0{0,1}2)-(0{0,1}[1-9]|[1-2]{0,1}[0-8])$/
	if( verify( value, p ) )
	{
		return true;
	}

	var p = /^[1-2][0-9]{3}-(0{0,1}2)-29$/
	if( verify( value, p ) )
	{
		var s = value.split( "-" );
		var y = parseInt( s );
		if( (0==y%4) && (0!=y%400) ){
			return true;
		}else{
			return false;
		}
	}
	
	return false;
}

function isEmail( value )
{
	var p = /^\w+(\.\w+){0,2}@\w+(\.\w+)*\.[a-zA-Z]{2,3}$/;
	return verify( value, p );
}

function isPostcode( value ){
	var p = /^[0-9]{6}$/;
	return verify( value, p );
}

function isTime( value ){
	var p = /^([01]{0,1}[0-9]|2[0-3])(:[0-5]?[0-9]){1,2}$/;
	return verify( value, p );
}

function verify(value,pattern){
	return pattern.test( value );
}

function trim( value )
{
	return value.replace(/(^\s*)|(\s*$)/g, "");
}

function isNull(value)
{
  return ( (value==null) || (value.length==0) );
}

function isBlank( value )
{
	return (isNull( value ) || isNull( trim( value ) ));
}

function toNonNull( v )
{
	return ( isNull(v)?"":trim(v));
}

//check cell possiton
function isCellPosition(value)
{
  var p=/^([0-9]+),([0-9]+)$/;
  return verify(value,p);  
  
}

function isString(value)
{
  var p=/^([^';\/"\f\n\r\t\v]*)([^';\/"\f\n\r\t\v])([^';\/"\f\n\r\t\v]*)$/;
  return verify(value,p);  
  
}

function isSqlString(value){
  return true;
}

