/*
 Author: Matt Kruse <matt@mattkruse.com>
 WWW: http://www.mattkruse.com/

 NOTICE: You may use this code for any purpose, commercial or
 private, without any further permission from the author. You may
 remove this notice from your final code if you wish, however it is
 appreciated by the author if at least my web site address is kept.

 You may *NOT* re-distribute this code in any way except through its
 use. That means, you can include it in your product, or your web
 site, or any other form where the code is actually being used. You
 may not put the plain javascript up on your site for download or
 include it in your javascript libraries for download. 
 If you wish to share this code with others, please just point them
 to the URL instead.
 Please DO NOT link directly to my .js files from your site. Copy
 the files to your server and use them there. Thank you.
*/


/**
 * Trims whitespace from the left-hand side of a string
 *
 * @param str a string
 * @return str trimmed to the left
 */
function LTrim(str) {
  if (str==null) {
    return null;
  }
  for(var i=0;str.charAt(i)==" ";i++);
  return str.substring(i,str.length);
}

/**
 * Trims whitespace from the right-hand side of a string
 *
 * @param str a string
 * @return str trimmed to the right
 */
function RTrim(str) {
  if (str==null) {
    return null;
  }
  for(var i=str.length-1;str.charAt(i)==" ";i--);
  return str.substring(0,i+1);
}

/**
 * Trims whitespace from a string
 *
 * @param str a string
 * @return str trimmed
 */
function Trim(str) {
  return LTrim(RTrim(str));
}

/**
 * Trims whitespace newlines and tabs from the left-hand side of a string
 *
 * @param str a string
 * @return str trimmed
 */
function LTrimAll(str) {
  if (str==null) {
    return str;
  }
  for (var i=0; str.charAt(i)==" " || str.charAt(i)=="\n" || str.charAt(i)=="\t"; i++);
  return str.substring(i,str.length);
}

/**
 * Trims whitespace newlines and tabs from the right-hand side of a string
 *
 * @param str a string
 * @return str trimmed
 */

function RTrimAll(str) {
  if (str==null) {
    return str;
  }
  for (var i=str.length-1; str.charAt(i)==" " || str.charAt(i)=="\n" || str.charAt(i)=="\t"; i--);
  return str.substring(0,i+1);
}

/**
 * Trims whitespace newlines and tabs from a string
 *
 * @param str a string
 * @return str trimmed
 */

function TrimAll(str) {
  return LTrimAll(RTrimAll(str));
}

/**
 * Returns true if val is null
 *
 * @param val 
 * @return true if val is null, false otherwise
 */
function isNull(val) {
  return(val==null);
}

/**
 * Returns true if value only contains spaces
 *
 * @param val
 * @return true if val only contains spaces, false otherwise
 */
function isBlank(val) {
  if(val==null) {
    return true;
  }
  for(var i=0;i<val.length;i++) {
    if ((val.charAt(i)!=' ')&&(val.charAt(i)!="\t")&&(val.charAt(i)!="\n")&&(val.charAt(i)!="\r")) {
      return false;
    }
  }
  return true;
}

/**
 * Returns true if val contains all digits
 *
 * @param val
 * @return true if val contains all digits, false otherwise
 */
 
function isInteger(val){
  if (isBlank(val)) {
    return false;
  }
  for(var i=0;i<val.length;i++) {
    if(!isDigit(val.charAt(i))) {
      return false;
    }
  }
  return true;
}

/*
 * Returns true if val contains a positive float value
 *
 * @param val
 * @return true if val contains a positive float value, false otherwise
 */
 
function isNumeric(val) {
  return(parseFloat(val,10)==(val*1));
}

/**
 * Returns true if the object (obj) is an array, else false
 *
 * @param obj an object
 * @return true if obj is an array, false otherwise
 */
 
function isArray(obj) {
  return(typeof(obj.length)=="undefined")?false:true;
}

/**
 * Returns true if value (num) is a 1-character digit
 *
 * @param num
 * @return true if num is a 1-character digit, false othwewise
 */
 
function isDigit(num) {
  if (num.length>1) {
    return false;
  }
  var string="1234567890";
  if (string.indexOf(num)!=-1) {
    return true;
  }
  return false;
}

/**
 * Sets a form field to "" if it isBlank()
 *
 * @param obj a form field (or any other object with a 'value' property)
 */
 function setNullIfBlank(obj) {
  if(isBlank(obj.value)) {
    obj.value="";
  }
}

/**
 * Sets value of form field toUpperCase() for all fields passed
 *
 */
 
 function setFieldsToUpperCase(){
  for(var i=0;i<arguments.length;i++) {
    arguments[i].value = arguments[i].value.toUpperCase();
  }
}

/**
 * disallowBlank(input_object[,message[,true]])
 * Checks a form field for a blank value. Optionally alerts if 
 * blank and focuses
 *
 * @param obj a form field
 */
 
function disallowBlank(obj) {
  var msg=(arguments.length>1)?arguments[1]:"";
  var dofocus=(arguments.length>2)?arguments[2]:false;
  if (isBlank(getInputValue(obj))) {
    if(!isBlank(msg)) {
      alert(msg);
    }
    if(dofocus) {
      if (isArray(obj) && (typeof(obj.type)=="undefined")) {
        obj=obj[0];
      }
      if(obj.type=="text"||obj.type=="textarea"||obj.type=="password") { 
        obj.select(); 
      }
      obj.focus();
    }
    return true;
  }
  return false;
}

/**
 * disallowModify(input_object[,message[,true]])
 * Checks a form field for a value different than defaultValue. 
 * Optionally alerts and focuses
 *
 * @param obj a form field
 */
 
function disallowModify(obj) {
  var msg=(arguments.length>1)?arguments[1]:"";
  var dofocus=(arguments.length>2)?arguments[2]:false;
  if (getInputValue(obj)!=getInputDefaultValue(obj)) {
    if(!isBlank(msg)) {
      alert(msg);
    }
    if(dofocus) {
      if (isArray(obj) && (typeof(obj.type)=="undefined")) {
        obj=obj[0];
      }
      if(obj.type=="text"||obj.type=="textarea"||obj.type=="password") { 
        obj.select(); 
      }
      obj.focus();
    }
    setInputValue(obj,getInputDefaultValue(obj));
    return true;
  }
  return false;
}

/**
 * commifyArray(array)
 * Take an array of values and turn it into a comma-separated string
 *
 * @param obj an array
 * @return obj as a comma-separated string
 */
 
function commifyArray(obj) {
  var s="";
  if(obj==null||obj.length<=0) {
    return s;
  }
  for(var i=0;i<obj.length;i++) {
    s=s+((s=="")?"":",")+obj[i].toString();
  }
  return s;
}

/**
 * getSingleInputValue(input_object,use_default)
 * Utility function used by others
 *
 * @param obj a form field
 * @param use_default true if one wants the default value, false if one wants the current value
 * @return the value of obj
 */
 
function getSingleInputValue(obj,use_default) {
  switch(obj.type) {
    case 'radio': 
    case 'checkbox': 
      return(((use_default)?obj.defaultChecked:obj.checked)?obj.value:null);
    case 'text': 
    case 'hidden': 
    case 'textarea': 
      return(use_default)?obj.defaultValue:obj.value;
    case 'password': 
      return((use_default)?null:obj.value);
    case 'select-one':
      if (obj.options==null) { 
        return null; 
      }
      if(use_default) {
        var o=obj.options;
        for(var i=0;i<o.length;i++) {
          if(o[i].defaultSelected){
            return o[i].value;
          }
        }
        return o[0].value;
      }
      if (obj.selectedIndex<0) {
        return null;
      }
      return(obj.options.length>0)?obj.options[obj.selectedIndex].value:null;
    case 'select-multiple': 
      if (obj.options==null) { 
        return null; 
      }
      var values=new Array();
      for(var i=0;i<obj.options.length;i++) {
        if((use_default&&obj.options[i].defaultSelected)||(!use_default&&obj.options[i].selected)) {
          values[values.length]=obj.options[i].value;
        }
      }
      return (values.length==0)?null:commifyArray(values);
    }
  alert("FATAL ERROR: Field type "+obj.type+" is not supported for this function");
  return null;
}

/**
 * getSingleInputText(input_object,use_default)
 * Utility function used by others
 *
 * @param obj a form field
 * @param use_default true if one wants the default text, false if one wants the current text
 * @return the text of obj
 */
function getSingleInputText(obj,use_default) {
  switch(obj.type){
    case 'radio': 
    case 'checkbox':
      return "";
    case 'text': 
    case 'hidden': 
    case 'textarea': 
      return(use_default)?obj.defaultValue:obj.value;
    case 'password': 
      return((use_default)?null:obj.value);
    case 'select-one':
      if (obj.options==null) { 
        return null; 
      }
      if(use_default) {
        var o=obj.options;
        for(var i=0;i<o.length;i++) {
          if(o[i].defaultSelected) {
            return o[i].text;
          }
        }
        return o[0].text;
      }
      if (obj.selectedIndex<0) {
        return null;
      }
      return(obj.options.length>0)?obj.options[obj.selectedIndex].text:null;
    case 'select-multiple': 
      if (obj.options==null) { 
        return null; 
      }
      var values=new Array();
      for(var i=0;i<obj.options.length;i++) {
        if((use_default&&obj.options[i].defaultSelected)||(!use_default&&obj.options[i].selected)) {
          values[values.length]=obj.options[i].text;
        }
      }
      return (values.length==0)?null:commifyArray(values);
    }
  alert("FATAL ERROR: Field type "+obj.type+" is not supported for this function");
  return null;
}

/**
 * setSingleInputValue(input_object,value)
 * Utility function used by others
 *
 * @param obj a form field
 * @param value a value for obj
 */
 
function setSingleInputValue(obj,value) {
  switch(obj.type) {
    case 'radio': 
    case 'checkbox': 
      if(obj.value==value) {
        obj.checked=true;return true;
      } else {
        obj.checked=false;
        return false;
      }
    case 'text': 
    case 'hidden': 
    case 'textarea': 
    case 'password': 
      obj.value=value;
      return true;
    case 'select-one': 
    case 'select-multiple': 
      var o=obj.options;
      for(var i=0;i<o.length;i++) {
        if(o[i].value==value) {
          o[i].selected=true;
        } else {
          o[i].selected=false;
        }
      }
      return true;
    }
  alert("FATAL ERROR: Field type "+obj.type+" is not supported for this function");
  return false;
}

/**
 * getInputValue(input_object)
 * Get the value of any form input field
 * Multiple-select fields are returned as comma-separated values
 * (Doesn't support input types: button,file,reset,submit)
 *
 * @param obj a form field
 * @return the value of obj
 */
 
function getInputValue(obj) {
  var use_default=(arguments.length>1)?arguments[1]:false;
  if (isArray(obj) && (typeof(obj.type)=="undefined")) {
    var values=new Array();
    for(var i=0;i<obj.length;i++) {
      var v=getSingleInputValue(obj[i],use_default);
      if(v!=null) {
        values[values.length]=v;
      }
    }
    return commifyArray(values);
  }
  return getSingleInputValue(obj,use_default);
}

/**
 * getInputText(input_object[,use_default])
 * Get the displayed text of any form input field
 * Multiple-select fields are returned as comma-separated values
 * (Doesn't support input types: button,file,reset,submit)
 *
 * @param obj a form field
 * @return text for obj
 */
 
function getInputText(obj) {
  var use_default=(arguments.length>1)?arguments[1]:false;
  if (isArray(obj) && (typeof(obj.type)=="undefined")) {
    var values=new Array();
    for(var i=0;i<obj.length;i++) {
      var v=getSingleInputText(obj[i],use_default);
      if(v!=null) {
        values[values.length]=v;
      }
    }
    return commifyArray(values);
  }
  return getSingleInputText(obj,use_default);
}

/**
 * getInputDefaultValue(input_object)
 * Get the default value of any form input field when it was created
 * Multiple-select fields are returned as comma-separated values
 * (Doesn't support input types: button,file,password,reset,submit)
 *
 * @param obj a form field
 * @return default text for obj
 */
 
function getInputDefaultValue(obj) {
  return getInputValue(obj,true);
}

/**
 * isChanged(input_object)
 * Returns true if input object's value has changed since it was
 * created.
 *
 * @param obj a form field
 * @return true if obj's value has changed since it was created, false otherwise
 */

function isChanged(obj) {
  return(getInputValue(obj)!=getInputDefaultValue(obj));
}

/**
 * setInputValue(obj,value)
 *   Set the value of any form field. In cases where no matching value
 *   is available (select, radio, etc) then no option will be selected
 *   (Doesn't support input types: button,file,password,reset,submit)
 *
 * @param obj a form field
 * @param value a value for obj
 */
 
function setInputValue(obj,value) {
  var use_default=(arguments.length>1)?arguments[1]:false;
  if(isArray(obj)&&(typeof(obj.type)=="undefined")) {
    for(var i=0;i<obj.length;i++) {
      setSingleInputValue(obj[i],value);
    }
  } else {
    setSingleInputValue(obj,value);
  }
}
  
/**
 * isFormModified(form_object,hidden_fields,ignore_fields)
 * Check to see if anything in a form has been changed. By default
 * it will check all visible form elements and ignore all hidden 
 * fields. 
 * You can pass a comma-separated list of field names to check in
 * addition to visible fields (for hiddens, etc).
 * You can also pass a comma-separated list of field names to be
 * ignored in the check.
 *
 * @param theform a form
 * @param hidden_fields a comma-separated list of hidden fields
 * @param ignore_fields a comma-separated list of field to ignore
 * @return true if form was modified, false otherwise
 *
 */
 
function isFormModified(theform,hidden_fields,ignore_fields){
  if(hidden_fields==null) {
    hidden_fields="";
  }
  if(ignore_fields==null) {
    ignore_fields="";
  }
  var hiddenFields=new Object();
  var ignoreFields=new Object();
  var i,field;
  var hidden_fields_array=hidden_fields.split(',');
  for (i=0;i<hidden_fields_array.length;i++) {
    hiddenFields[Trim(hidden_fields_array[i])]=true;
  }
  var ignore_fields_array=ignore_fields.split(',');
  for (i=0;i<ignore_fields_array.length;i++) {
    ignoreFields[Trim(ignore_fields_array[i])]=true;
  }
  for (i=0;i<theform.elements.length;i++) {
    var changed=false;
    var name=theform.elements[i].name;
    if(!isBlank(name)) {
      var type=theform[name].type;
      if(!ignoreFields[name]) {
        if(type=="hidden"&&hiddenFields[name]) {
          changed=isChanged(theform[name]);
        } else if(type=="hidden") {
          changed=false;
        } else {
          changed=isChanged(theform[name]);
        }
      }
    }
    if(changed) {
      return true;
    }
  }
  return false;
}

/**
 * Returns true if email is valid
 *
 * @param email a string
 * @return true if email is valid, false otherwise
 */
function isValidEmail(email) {
      var chars = "@#$&[]()/\\\{}!^:'\"";
      var pat=/^(.+)@(.+)$/;
      
      var emaildiv = email.match(pat);
      
      if(emaildiv==null)
            return false;
            
      var login = emaildiv[1];
      var dominio = emaildiv[2];
      
      for(var i=0;i<chars.length;i++) {
            if(login.indexOf(chars.substr(i,1))!=-1)
                  return false;
      }
      
      for(var i=0;i<chars.length;i++) {
            if(dominio.indexOf(chars.substr(i,1))!=-1)
                  return false;
      }
      
      return true;
}
function validateEmail(email) {
        var chars = "@#$&[]()/\\\{}!^:'\"";
        var pat=/^(.+)@(.+)$/;
        
        var emaildiv = email.match(pat);
        
        if(emaildiv==null)
                return false;
                
        var login = emaildiv[1];
        var dominio = emaildiv[2];
        
        for(var i=0;i<chars.length;i++) {
                if(login.indexOf(chars.substr(i,1))!=-1)
                        return false;
        }
        
        for(var i=0;i<chars.length;i++) {
                if(dominio.indexOf(chars.substr(i,1))!=-1)
                        return false;
        }
        
        return true;
}
