/* ****************************************************************************
Copyright 2007,
Todos los derechos Reservados
CM.COM E.U.
cmhenao@epm.met.co

El uso sin solicitud espresa a la compañia de esta libreria es una clara
violación a la propiedad intelectual y los derechos de autor.
Prohibida su distribucion y/o uso sin el permiso explicito de cm.com
**************************************************************************** */

/* ****************************************************************************
Autor: Jhon Alejandro Ramirez Velez
       Desarrollador
       Progress - WebSpeed
       jhalrave@epm.net.co
**************************************************************************** */

function cForm(){
  var self = this;
  
  this.checked    = false;
  this.messages   = "";

  this.serialize           = _FormSerialize;
  this.disable             = _disable;
  this.enable              = _enable;
  this.fieldHide           = _FieldHide;
  this.fieldShow           = _FieldShow;      
  this.validate            = _FormValidate;
  this.FieldKeyPress       = _FieldKeyPress;
  this.FieldChange         = _FieldChange;
  this.activate            = _activate; 
  this.deactivate          = _deactivate;
  this.clear               = _clear;
  this.isEmpty             = _isEmpty;
  this.isFull              = _isFull;
  this.get                 = _get;
  this.showHelp            = _showHelp;
  this.hideHelp            = _hideHelp;
  
  var oField = null;
 
  debugStartGroup("cForm: Initializating " + this.name);
  if(self.elements){
    for(var j = 0; j < self.elements.length; j++){
      oField = self.elements[j];
      self.failed = false;                    
      switch(oField.type){
        case "text":
        case "textarea":
        case "hidden":
        case "password":      
          if(oField.attachEvent){
            oField.attachEvent("onkeypress", self.FieldKeyPress);
            oField.attachEvent("onfocus", self.FieldChange);
            oField.attachEvent("onblur", self.FieldChange);
          }else{
            if(oField.addEventListener){
              oField.addEventListener("onkeypress", self.FieldKeyPress, true);
              oField.addEventListener("onfocus", self.FieldChange, true);
              oField.addEventListener("onblur", self.FieldChange, true);
            }          
          }
          oField.failed = false;
          oField.validationEvent = "onblur";
          debugMessage("cForm: Binding: " + oField.name);
        break;
        
        case "button":
        case "submit":
        break;
        
        case "select-one":
        default:
          //if(oField.validate != undefined && oField.validate != "false" && oField.validate != "no"){
            oField.attachEvent("onchange", self.FieldChange);
            oField.failed = false;
            oField.validationEvent = "onchange";
            debugMessage("cForm: Binding: " + oField.name);
          //}
        break;          
      }
      if(oField.help){
        var oHelp = document.getElementsById(oField.help);
        if(oHelp){
          oField.ayuda = oHelp;
          oHelp.style.display = "none";
          oField.attachEvent('onfocus', self.showHelp);
          oField.attachEvent('onblur', self.hideHelp);
        }
      }else{
        if(oField.name != undefined && oField.name != ""){
          var oHelp = document.getElementById("Ayuda." + oField.name);
          if(oHelp){
            oField.ayuda = oHelp;
            oHelp.style.display = "none";
            oField.attachEvent('onfocus', self.showHelp);
            oField.attachEvent('onblur', self.hideHelp);
          }
        }
      }      
    }
  }
  debugStopGroup();
  
  function _FormValidate(){
    self.messages = "";
    self.failed = false;  
    for(var i = 0; i < self.elements.length; i++){
      var oField = self.elements[i];
      if(oField.validationEvent){    
        if(self.elements[i].fireEvent){
          self.elements[i].fireEvent(oField.validationEvent);
          continue;
        }          
        var sEvent = oField.validationEvent.replace(/^on/,"");
        self.FieldChange(self.elements[i]);             
      }
    }
  }

  function _FieldKeyPress(oInput){
    if(window.event.srcElement){
      var oInput = window.event.srcElement;
    }
   
    cChar = window.event.keyCode;
    if (cChar == 13) {
      window.event.returnValue = true;
      return true;
    } 
  
    if (oInput.filter){
      sFilters = oInput.filter;
      if(String.fromCharCode(cChar).search(sFilters)){
        window.event.returnValue = false;
        return false;
      }
    }  
    window.event.returnValue = true;
    return true;
  }

  function _FieldChange(oInput){
    if(window.event.srcElement)
      var oInput = window.event.srcElement;
    if(window.event.target)
      var oInput = window.event.target;
    var sValue = oInput.value;
        
    var sClassName = oInput.className.replace(/_wrong/g,'');
    
    oInput.mandatory = oInput.getAttribute('mandatory');
    if (oInput.mandatory == "yes" && sValue.replace(/\s/g,"") == ""){
      oInput.className = sClassName + "_wrong";
      oInput.failed = true;
      oInput.title = "Es Obligatorio";
      if(oInput.form){
        oInput.form.failed = true || oInput.form.failed;
        oInput.caption = oInput.getAttribute('caption'); 
        oInput.form.messages += oInput.caption + " es obligatorio\n";
      }
      return;  
    }
      
    if (oInput.validation && sValue != ""){
      if(sValue.search(oInput.validation)){
        oInput.className = sClassName + "_wrong";
        oInput.failed = true;
        oInput.title = "Es Incorrecto";
        if(oInput.form){
          oInput.form.failed = true || oInput.form.failed;
          oInput.form.messages += oInput.caption + " es incorrecto\n";
        }
        return;
      }
    }
    
    if(oInput.maxlength && sValue != ""){
      if(sValue.length > parseInt(oInput.maxlength)){
        oInput.className = sClassName + "_wrong";
        oInput.failed = true;
        oInput.title = "La longitud maxima es de " + oInput.maxlength;
        if(oInput.form){
          oInput.form.failed = true || oInput.form.failed;
          oInput.form.messages += oInput.caption + " supera su longitud maxima: " + oInput.maxlength + "caracteres\n";
        }
        return;
      }
    }
    
    if(oInput.minlength && sValue != ""){
      if(sValue.length < parseInt(oInput.minlength)){
        oInput.className = sClassName + "_wrong";
        oInput.failed = true;
        oInput.title = "La longitud minima es de " + oInput.minlength;
        if(oInput.form){
          oInput.form.failed = true || oInput.form.failed;
          oInput.form.messages += oInput.caption + " debe tener minimo " + oInput.minlength + "caracteres\n";
        }
        return;
      }
    }
    
    
    if (oInput.type != 'submit'){ 
      oInput.className = sClassName;      
    }
    oInput.failed = false;
    oInput.title = "";
    if(oInput.form){
      oInput.form.failed = false || oInput.form.failed;
    }
  }  
  
  function _enable(){
    for(var i = 0; i < self.elements.length; i++){
      self.elements[i].disabled = false;
    }
  }
  
  function _disable(){
    for(var i = 0; i < self.elements.length; i++){
      if (self.elements[i].disableStatus == undefined) {
        self.elements[i].disableStatus = true;
      }
      self.elements[i].disabled = self.elements[i].disableStatus;
    }
  }
  
  function _activate(){
    for(var i = 0; i < self.elements.length; i++){
      self.elements[i].readOnly = false;
    }
    try{
      self.elements[0].focus();
    }catch(e){
    
    }
  }
  
  function _deactivate(){
    for(var i = 0; i < self.elements.length; i++){
      self.elements[i].readOnly = true;
    }
  }
  
  function _clear(){
    for(var i = 0; i < self.elements.length; i++){
      var oField = self.elements[i];
      switch(oField.type){
        case "text":
        case "textarea":
        case "hidden":
        case "password":      
          oField.className = 'input';
          oField.failed = false;
          oField.value = "";
        break;
        
        case "button":
        break;
        
        case "select-one":        
          oField.failed = false;
          oField.className = 'select';
          oField.value = "";          
        break;          
      }
    }
  }
  
  function _isEmpty(sFields){
    var lResult = true;
    var aFields = sFields.split(',');
    for(var iFields = 0; iFields < aFields.length; iFields++){
      var sField = aFields[iFields]; 
      var oField = self.elements[sField];
      if(oField){
        if(oField.value.replace(/\s/g,"") != ""){
          lResult = false;
          return;  
        }
      }
    }
    return lResult;
  }
  
  function _isFull(sFields){
    var lResult = true;
    var aFields = sFields.split(',');
    for(var iFields = 0; iFields < aFields.length; iFields++){
      var sField = aFields[iFields]; 
      var oField = self.elements[sField];
      if(oField){
        if(oField.value.replace(/\s/g,"") == ""){
          lResult = false;  
          return;
        }
      }
    }
    return lResult;
  }
  
  function _get(oObject, lExpando){
    if(lExpando == undefined || lExpando == null){
      var lExpando = false;
    }
    if(oObject == undefined || oObject == null){
      var oObject = {};
      lExpando = true;
    }
    
    for(var iElement = 0; iElement < self.elements.length; iElement++){
      var oElement = self.elements[iElement];
      
      var sName = oElement.name;
      if(sName == undefined || sName == null || sName == "") continue;
      if(oElement.type == "button" || oElement.type == "submit") continue;

      if(oObject[sName] == undefined || oObject[sName] == null){
        if(!lExpando) continue;
      }
      switch(oElement.type){
        case "checkbox":
          oObject[sName] = oElement.checked;
        break;
        default:
          oObject[sName] = oElement.value;
        break;
      }       
    }
    return oObject;
  }
  
  function _showHelp(){
    var oField = window.event.srcElement;
    var oHelp = oField.ayuda;
    if(oHelp){
      oHelp.style.top = getOffSetTop(oField) + oField.offsetHeight + 2;
      oHelp.style.left = getOffSetLeft(oField) + 2;
      oHelp.style.display = "";
    }
    oHelp = null;
    oField = null; 
  }
  
  function _hideHelp(){
    var oField = window.event.srcElement;
    var oHelp = oField.ayuda;
    if(oHelp){
      oHelp.style.display = "none";
    }
    oHelp = null;
    oField = null; 
  }
  
}


