// helper functions

// returns: false if length is out of bounds, true if ok.
// param: str=string to interigate
// param: maxLength=maximum length of string allowed
// param: minLength=minumum length of string allowed
// param: loose=loosen condition (eg. <= or >= instead of < and >)
function checkLength(str, maxLength, minLength, loose){
  if(loose==true){
     if(str.length>=maxLength){
         return false;
     }else if(str.length<=minLength){
         return false;
     }else{
         return true;
     } 
  }else{
     if(str.length>maxLength){
         return false;
     }else if(str.length<minLength){
         return false;
     }else{
         return true;
     }
  }
}

// returns: string of sql keywords found or true if no bad sql was found
// param: str=string to interigate
function noBadSql(str){
   var err="";
   var badsql="delete|drop|update|replace|kill|lock";
   var teststr=badsql.split("|");
   for(i=0;i<teststr.length;i++){
      if(str.indexOf(teststr[i])!=-1){
         err+=teststr[i] + " ";	   
	  }
   }	  
   if(err==""){
	  return true;
   }else{
	  return err;
   }
}

// returns: false if not an integer (eg. not [0-9]), true if is an integer.
// param: str=string to interigate
function isInteger(str){
  var i;
  for (i=0; i<str.length; i++){   
     var c=str.charAt(i);
     if (((c<"0")||(c>"9"))){
        return false;
     }
  }
  return true;
}

// returns: false if not an integer (eg. not [0-9]), true if is an integer.
// param: str=string to interigate
// comment: wrapper for isInteger
function isPhone(ele){
  var str=ele;
  if(isInteger(str)){
     return true;
  }else{
     return false;
  }  
}

// format methods

// returns: false if keycode not an integer (eg. not [0-9]), true if is an integer.
// param: obj=object being operated on
// param: e=event
function currencyFormat(obj, e){
  var keycode;
  if(window.event){
     keycode=window.event.keyCode;
  }else if(e){
     keycode = e.which;
  }else{
     return true;
  }
  if(((keycode>47) && (keycode<58)) || (keycode==8)){
     return true;
  }else{
     return false;
  }
}

// returns: false if keycode not an integer (eg. not [0-9]), true if is an integer.
// param: obj=object being operated on
// param: e=event
function phoneFormat(obj, e){
  var keycode;
  if(window.event){
     keycode=window.event.keyCode;
  }else if(e){
     keycode = e.which;
  }else{
     return true;
  }
  if(((keycode>47) && (keycode<58)) || (keycode==8)){
     return true;
  }else{
     return false;
  }
}

// validation methods

// returns: err string if error occured, empty string ("") if ok.
// param: obj=object operated on
// param: label=label of form field. (eg. 'Label Here ')
// param: minChars=minimum characters allowed
// param: maxChars=maximum characters allowed
// param: required=required field? boolean (true|false)
function validateInt(obj, label, minChars, maxChars, required){
  var err="";
  if(required==true){
     if(obj.value==null || obj.value==""){
        return " * " + label + "is a required field, please enter/select a value for this field.\n";
     }
  }
  if(!isInteger(obj.value)){
    err+=" * " + label + " is not a valid number.\n";
	err+="   Please use numbers only.\n\n";
  }
  return err;
}

// invalidChars='n|n' separate with pipe, n is ascii code of character.
// returns: err string if error occured, empty string ("") if ok.
// param: obj=object operated on
// param: label=label of form field. (eg. 'Label Here ')
// param: minChars=minimum characters allowed
// param: maxChars=maximum characters allowed
// invalidChars='n|n' separate with pipe, n is ascii code of character.
// nobadsql=boolean (true|false)
// param: required=required field? boolean (true|false)
function validateText(obj, label, minChars, maxChars, invalidChars, nobadsql, required){
   var err="";
   var str=obj.value;
   var asciicodes=invalidChars.split('|');
   if(required==true){
     if(obj.value==null || obj.value==""){
        return " * " + label + "is a required field, please enter/select a value for this field.\n";
     }
   }
   if(!checkLength(str, maxChars, minChars)){
       err+=" * " + label + " has too many or not enough characters.\n\n";
  	   err+="   Maximum Characters: " + maxChars + "\n";
 	   err+="   Minimum Characters: " + minChars + "\n\n"; 
   }
   for(i=0;i<asciicodes.length;i++){
      if(str.indexOf(String.fromCharCode(asciicodes[i]))!=-1){
	    err+=" * "  + label + " contains illegal character: " +  String.fromCharCode(asciicodes[i]) + ".\n\n";
      }
   }
   // test for malicious sql
   if(nobadsql){
      if(noBadSql(str)!=true){
         err+=" * " +  label + " contains possible malicious SQL statement(s): " + noBadSql(str) + ".\n\n";
      }
   }
   return err;
}

// returns: err string if error occured, empty string ("") if ok.
// param: obj=object operated on
// param: label=label of form field. (eg. 'Label Here ')
// param: minInt=minimum  int allowed (eg. 0)
// param: maxInt=maximum  intallowed  (eg. 9999999999999)
// param: isFloat? eg. 121231.23. etc. (true|false)
// param: hasDSign=boolean (true|false)
// param: hasComma=allow commas? (eg. 12,123,123)
// param: strict=whole number characters only - (eg. 50000), over-rides isFloat, hasComma and hasDsign
// param: required=required field? boolean (true|false)
function validatePrice2(obj, label, minInt, maxInt, isFloat, hasDSign, hasComma, strict, required){
  var flag="";
  var err="";
  var str=obj.value;
  if(required==true){
     if(obj.value==null || obj.value==""){
        return " * " + label + "is a required field, please enter/select a value for this field.\n";
     }
  }
  if(strict){
    if(isInteger(str)){
       return "";
    }else{
       err+=" * " +  label + " is not a valid price.\n";
       err+=" * " +  label + " must contain numeric characters only. (eg. 50000)\n";
    } 
  }else if(!strict && isFloat && hasComma){ // xxxx,xxx,xx.xx
    var chars = "0123456789,."; 
    for(var i = 0; i < str.length; i++){ 
       if(chars.indexOf(str.charAt(i))==-1){ 
          flag=1;
		  break;    
       }
    }
	if(flag){
	   err+=" * "  + label + "can only have numbers (0-9), a comma and a period. (eg. 10,000.00)";
	}
  }
  return err;
}

// returns: err string if error occured, empty string ("") if ok.
// param: obj=object operated on.
// param: label=label of form field. (eg. 'Label Here ').
// param: minInt=minimum characters allowed.
// param: maxInt=maximum characters allowed.
// param: strict=whole number characters only - eg. 50000, over-rides isFloat, hasComma and hasDsign.
// param: required=required field? boolean (true|false).
function validatePrice(obj, label, minInt, maxInt, strict, required){
  var flag="";
  var err="";
  var str=obj.value;
  if(required==true){
     if(obj.value==null || obj.value==""){
        return " * " + label + "is a required field, please enter/select a value for this field.\n";
     }
  }
  if(strict){
    if(isInteger(str)){
       return "";
    }else{
       err+=" * " +  label + " is not a valid phone number.\n";
       err+=" * " +  label + " must contain numeric characters only. (eg. 0249735858)\n";
    } 
  }else if(!strict){ // xxxx,xxxxxxx
    var chars = "0123456789"; 
    for(var i = 0; i < str.length; i++){ 
       if(chars.indexOf(str.charAt(i))==-1){ 
          flag=1;
		  break;    
       }
    }
	if(flag){
	   err+=" * "  + label + "can only have numbers (0-9), and a comma. (eg. 10,000.00)";
	}
  }
  return err;
}

// returns: err string if error occured, empty string ("") if ok.
// param: obj=object operated on.
// param: label=label of form field. (eg. 'Label Here ').
// param: minInt=minimum characters allowed.
// param: maxInt=maximum characters allowed.
// param: strict=whole number characters only - eg. 50000, over-rides isFloat, hasComma and hasDsign.
// param: required=required field? boolean (true|false).
function validatePhone(obj, label, minInt, maxInt, strict, required){
  var flag="";
  var err="";
  var str=obj.value;
  if(required==true){
     if(obj.value==null || obj.value==""){
        return " * " + label + "is a required field, please enter/select a value for this field.\n";
     }
  }
  if(strict){
    if(isInteger(str)){
       return "";
    }else{
       err+=" * " +  label + " is not a valid phone number.\n";
       err+=" * " +  label + " must contain numeric characters only. (eg. 0249735858)\n";
    } 
  }else if(!strict){ // xxxx,xxxxxxx
    var chars = "0123456789"; 
    for(var i = 0; i < str.length; i++){ 
       if(chars.indexOf(str.charAt(i))==-1){ 
          flag=1;
		  break;    
       }
    }
	if(flag){
	   err+=" * "  + label + "can only have numbers (0-9), and a comma. (eg. 10,000.00)";
	}
  }
  return err;
}

function validateUrl(obj, label, minChars, maxChars, invalidChars, nobadsql, required){
  var err="";
  err+=validateText(obj, label, minChars, maxChars, invalidChars, nobadsql, required);
  if(obj.value=="http://"){
     err+=" * " + label + "is a required field, please enter a URL. eg. http://www.slashdot.org.\n";
  }
  return err;
}

function validatePriceRange(obj, obj2, label){
   var err="";
   if(parseInt(obj.value)>parseInt(obj2.value)){
      err+=" * " + label + "the second Price Range value (Price To) has to be higher or equal to the first Price Range value (Price From).\n";
      return err;
   }
   return err;
}

function validatePCode(obj, label, required){
   var err="";
   if(required==true){
      return " * " + label + "is a required field, please enter/select a value for this field.\n";
   }
   if(!isInteger(obj.value)){
      return " * " + label + "is not a valid Post Code.\n";
   }
   return err;
}

function validateEmail(obj, label, required){
  var str=obj.value;
  var err="";
  var at="@";
  var dot=".";
  var lat=str.indexOf(at);
  var lstr=str.length;
  var ldot=str.indexOf(dot);
  if(required==true){
     if(obj.value==null || obj.value==""){
        return " * " + label + "is a required field, please enter/select a value for this field.\n";
     }
  }
  if(str!=""){
     if(str.indexOf(at)==-1){
        err+=" * " +  label + " is not a valid Email address.\n";
     }else if(str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
       err+=" * " +  label + " is not a valid Email address.\n";
     }else if(str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
       err+=" * " +  label + " is not a valid Email address.\n";
     }else if(str.indexOf(at,(lat+1))!=-1){
       err+=" * " +  label + " is not a valid Email address.\n";
     }else if(str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
       err+=" * " +  label + " is not a valid Email address.\n";
     }else if(str.indexOf(dot,(lat+2))==-1){
       err+=" * " +  label + " is not a valid Email address.\n"; 
     }else if(str.indexOf(" ")!=-1){
       err+=" * " +  label + " is not a valid Email address.\n"; 
     }
  }
  return err;
}

function requiredSelect(obj, label, selectNeeded, countFirstAsNull, nullNotAllowed){
  obj=eval(obj);
  var flag="";
  if(selectNeeded && !countFirstAsNull && nullNotAllowed){
    for(i=0;  i<obj.options.length; i++){
       if(obj.options[i].selected==true){
          flag+="1";
       }
    }
    if(flag==""){
       return " * " + label +"is a required field, please select a value.\n";
    }else{
       return "";
    }
  }else if(selectNeeded && countFirstAsNull && nullNotAllowed){
    for(i=0;  i<obj.options.length; i++){
       if(obj.options[i].selected==true && obj.options[0].selected!=true){
          flag+="1";
       }
    }
    if(flag==""){
       return " * " + label +"is a required field, please select a value. (You cannot select the first option.)\n";
    }else{
       return "";
    }
  }
}
