/* ****************************************************************************
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.objects             = {};
  
  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;         
      if(oField.object != undefined && oField.object != null){
        if(self.objects[oField.object] == undefined)
          self.objects[oField.object] = [];
        self.objects[oField.object].push(oField);
      }      
      
      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;          
      }
    }
  }
  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.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(sObject){
    if(sObject == undefined || sObject == null){
      var sObject = "";
    }
    if(sObject != ""){
      if(self.objects[sObject] == undefined || self.objects[sObject] == null){
        return;
      }
      for(var i = 0; i < self.objects[sObject].length; i++){
        self.objects[sObject][i].readOnly = false;
      }      
    }else{
      for(var i = 0; i < self.elements.length; i++){
        self.elements[i].readOnly = false;
      }
    }    
  }
  
  function _deactivate(sObject){
    if(sObject == undefined || sObject == null){
      var sObject = "";
    }
    if(sObject != ""){
      if(self.objects[sObject] == undefined || self.objects[sObject] == null){
        return;
      }
      for(var i = 0; i < self.objects[sObject].length; i++){
        self.objects[sObject][i].readOnly = true;
      }      
    }else{
      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 _set(){
    
  }
  
  function _get(oObject){
    var lExpando = false;
    if(oObject == undefined || oObject == null){
      var oObject = {};
      lExpando = true;
    }
    
    for(var i = 0; i < self.elements.length; i++){
      var oField = self.elements[i];
      if(oField.name == undefined || oField.name == null || oField.name == ""){
        continue;
      }
      if(oField.type == 'button' || oField.type == 'submit'){
        continue;
      }        
      
      if(oField.object == undefined || oField.object == null){
        if(oObject[oField.name] == undefined){
          if(!lExpando) continue;
        }
      }else{
        if(oObject[oField.object] == undefined){
          if(!lExpando) continue;
          oObject[oField.object] = {};
        }
        if(oObject[oField.object][oField.name] == undefined){
          if(!lExpando) continue;
        }
      }  

      
      var sValue = "";
      switch(oField.type){
        case "checkbox":
          sValue = oField.checked?'yes':'no';
        break;
        default:
          sValue = oField.value;              
        break;
      }
      
      if(oField.object == undefined || oField.object == null){
        oObject[oField.name] = sValue;
      }else{
        oObject[oField.object][oField.name] = sValue;
      }                              
    }
    return oObject;
  }  
}

