﻿  //var supportedObjects = new Array("INPUT", "SELECT");
  //var supportedInputTypes = new Array("text", "radio", "checkbox", "file")
  
  var focusInputField = "formtext-focus";
  var focusSelectField = "formselect-focus";
  var focusLabel = "formlabel-focus"  
  
  //var inputObjects = new Array("text", "select");          
  
  var mainFormId = "";                    

  Array.prototype.in_array = inArray;
  Array.prototype.print_r = printArray;
  
  String.prototype.to_array = toArray;
  String.prototype.trim = trimString;    
  
  /*
    Function  : inArray
    Arguments : value (string)
    Returns   : true if found, else false  
    
    Purpose   : To determine if a specified value is found in a Array object.
  */  
  function inArray(value){
    for (var i=0;i<this.length;i++){
      if (this[i] == value) return true;
    }
    return false;
  }    
  
  /*
    Function  : printArray
    Arguments : value (string)
    Returns   : true if found, else false  
    
    Purpose   : To determine if a specified value is found in a Array object.
  */  
  function printArray(){
    var msg = "Array contents (length: " + this.length + ")\n";
    
    for (var i=0;i<this.length;i++)
      msg += "  - " + this[i] + "\n";
    
    return msg;
  }        
  
  /*
    Function  : toArray
    Arguments : s (string)
    Returns   : array representation of the specified string  
    
    Purpose   : To split up a string in seperate segments (not equal to split(), as he needs a seperation char).
  */      
  function toArray(){      
    var arr = new Array(this.length);
    
    for (var i=0; i<this.length;i++)
      arr[i] = this.charAt(i);
      
    return arr;
  }  
  
  /*
    Function  : TrimString
    Arguments : s (string)
    Returns   : trimmed version of the String object 
    
    Purpose   : To remove redundant spaces before & after the current string.
  */        
  function trimString(){
    return this.replace( /^\s+/g, "" );
  }
  
  /*
    Function  : initForm
    Arguments : formId (string)
    Returns   : -  
    
    Purpose   : Funcion is used to setup a form for using 'dynamic-focusing'. 
  */        
  initForm = function(formId, defaultField){
    var obj = null;
    var eleInput = formElements(formId, "input");
    var eleSelect = formElements(formId, "select");    
    var eleTextArea = formElements(formId, "textarea");
    this.mainFormId = formId;      
          
    for (var i=0;i<eleInput.length;i++){   
      if ((eleInput[i].getAttribute('type') == 'text') || (eleInput[i].getAttribute('type') == 'password') || (eleInput[i].getAttribute('type') == 'checkbox')){ 
        obj = eleInput[i];
        obj.onfocus = onSelect;
      } else if (eleInput[i].getAttribute('type') == 'radio') {
        obj = eleInput[i];
        obj.onfocus = radioSelect;
      } else if ((eleInput[i].getAttribute('type') == 'button') || (eleInput[i].getAttribute('type') == 'submit')) {
        obj = eleInput[i];
        obj.onfocus = function(){singleSelect(mainFormId);}
      }
    }
    
    for (var j=0;j<eleSelect.length;j++){
      obj = eleSelect[j];
      obj.onfocus = onSelect;
    }

    for (var j=0;j<eleTextArea.length;j++){
      obj = eleTextArea[j];
      obj.onfocus = onSelect;
    }
    
    if (defaultField != '') document.getElementById(defaultField).focus();    
  }
  
  radioSelect = function radioSelect()
  {
    singleSelect(mainFormId);
    var sId = '';
    sId = this.id;
    sId = 'lbl' + sId.substring(0, sId.length - 2);
    document.getElementById(sId).className = 'formlabel-focus';
  }
  
  /*
    Function  : singleSElect
    Arguments : formId (string)
    Returns   : -  
    
    Purpose   : Funcion is used to reset all objects in form <formId> to their default layout, depending on their type. 
  */          
  singleSelect = function(formId){      
    var ele = formElements(formId, 'input');
    var sel = formElements(formId, 'select');
    var txt = formElements(formId, 'textarea');
    
    if ((!ele) && (!sel) && (!txt)) return;
    
    for (var i=0;i<ele.length;i++){
      if ((ele[i].getAttribute('type') == 'text') || (ele[i].getAttribute('type') == 'password')){      
        resetObject(ele[i]);
      } 
    }  
    
    for (var j=0;j<txt.length;j++){
      resetObject(txt[j]); 
    }          
    
    for (var j=0;j<sel.length;j++){
      resetObject(sel[j]); 
    }      
    
    var labels = document.getElementsByTagName('label');
    if (!labels) return;
    
    for (var j=0;j<labels.length;j++){
      labels[j].className = 'label-default';
    }     
  }    
  
  /*
    Function  : onSelect
    Arguments : -
    Returns   : -  
    
    Purpose   : Function is only triggered when a (input) field is selected. 
  */          
  onSelect = function(){
    var labelObject = labelOfField(this);      
    
    singleSelect(mainFormId);
    
    if ((this.nodeName == 'INPUT') || (this.nodeName == 'TEXTAREA')){
      this.className = focusInputField;
    }
    
    if (this.nodeName == 'SELECT'){
      for (var x=0;x<this.options.length;x++){
        this.options[x].className = focusSelectField;
        if (!IE) this.className = focusSelectField;
      }    
    }     
        
    if ((this.nodeName == 'INPUT') || (this.nodeName == 'PASSWORD')){ 
      if (this.value.length != 0){
        this.focus();
        this.select();
      }              
    }
    
    if (!labelObject) return;            
    labelObject.className = focusLabel;      
  }
  
  /*
    Function  : resetObject
    Arguments : ref (object)
    Returns   : -  
    
    Purpose   : Inner function (called by singleSelect()) to reset a object to the default layout.
  */          
  resetObject = function(ref){
    if ((ref.nodeName == 'INPUT') || (ref.nodeName == 'TEXTAREA')){
      ref.className = 'text';
    }
    if (ref.nodeName == 'SELECT'){
      for (var x=0;x<ref.options.length;x++){
        ref.options[x].className = 'selectbox-default';
        if (!IE)  ref.className = 'selectbox-default';
      }
    }    
  }
  
  /*
    Function  : labelOfField
    Arguments : fieldId (string)
    Returns   : Reference to the referred label of a input field.   
  */          
  labelOfField = function(fieldRef){
    var parentRow = fieldRef.parentNode.parentNode;
    if (parentRow == null) return null;
    
    var aoLabels = parentRow.getElementsByTagName('label');
    var labelObject = null;
    var iLabelIndex = 0;
    
    if (aoLabels.length > 1){
      for (var j=0;j<aoLabels.length;j++){
        iLabelIndex = (parentChildrenIndexOf(aoLabels[j]) - 1);        
     
        if (parseInt(parentChildrenIndexOf(fieldRef)) == parseInt(iLabelIndex)){
          labelObject = aoLabels[j];
          break;
        }                
      }      
    }
    else{
      labelObject = aoLabels[0];
    }
      
    return labelObject;          
  }
  
  /*
    Function  : parentChildrenIndexOf
    Arguments : objRef (object)
    Returns   : Index of object <objRef> in ChildNodes collection of the parentNode of object <objRef>.
                If nothing could be found, function returns -1.
  */            
  parentChildrenIndexOf = function(objRef){
    if (objRef == null) return -1;
    
    var children = objRef.parentNode.childNodes;
    
    for (var i=0;i<children.length;i++){
      if (objRef == children[i]) return i;
    }
    
    return -1;
  }
