

/**
 * 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;
}
