/* ****************************************************************************
Copyright 2008,
Todos los derechos Reservados
CAMARA DE COMERCIO DE MEDELLIN PARA ANTIOQUIA

Desarrollado Por
CM.COM E.U.
cmhenao@epm.met.co

El uso sin solicitud expresa 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 la camara de 
comercio de Medellin para Antioquia 
**************************************************************************** */

/* ****************************************************************************
Autor: Jhon Alejandro Ramirez Velez
       Desarrollador
       Progress - WebSpeed
       jhalrave@epm.net.co
**************************************************************************** */

/* ****************************************************************************
Libreria de utilidades Varias
**************************************************************************** */
function formatCurrency(sNumber, sSimbol){
  if (sNumber == undefined || sNumber == null){
    if(this){
      sNumber = this.toString();
    }
  }
  if(sSimbol == undefined || sSimbol == null){
    var sSimbol = "$"
  }
  
  sNumber = sNumber.replace(/,/g,"");

  if(!sNumber.match(/^[0-9]*.{0,1}[0-9]*$/)){
    return sNumber;
  }
  sNumber = sNumber.replace(/(^0*)/,"");
  sNumber = sNumber.replace(/^\s*/g,"");
  sNumber = sNumber.replace(/\s*$/,"");
  if(sNumber == ""){
    sNumber = "0";
  }

  var aN = sNumber.split(".");
  var sIPart = aN[0];
  var sDPart = "";
  if(aN.length > 1){
    sDPart = aN[1];
  }
  if(sIPart == ""){
    sIPart = "0";
  }

  var sReturn = "";
  for(var i = 0 ; i < sIPart.length; i++){
    if(sIPart.length - i > 0 && i > 0 && (sIPart.length - i) % 3 == 0){
      sReturn += ",";
    }
    sReturn += sIPart.charAt(i);
  }
  if(sDPart.length > 0){
    sReturn += ".";
    for(var i = 0 ; i < sDPart.length; i++){
      if(i > 0 && (i) % 3 == 0){
        sReturn += ",";
      }
      sReturn += sDPart.charAt(i);
    }
  }
  sReturn = sSimbol + " " + sReturn;
  return sReturn.replace(/^\s/g,"");
}

function unformatCurrency(sNumber, sSimbol){
  if (sNumber == undefined || sNumber == null){
    if(this){
      sNumber = this.toString();
    }
  }
  if(sSimbol == undefined || sSimbol == null){
    var sSimbol = "$"
  }
  sNumber = sNumber.replace(/(^0*)/,"");
  sNumber = sNumber.replace(/^\s*/g,"");
  sNumber = sNumber.replace("$","");
  sNumber = sNumber.replace(/\s*$/,"");
  sNumber = sNumber.replace(sSimbol,"");
  sNumber = sNumber.replace(/,/g,"");
  sNumber = sNumber.replace(/^\s*/g,"");
  if (sNumber == ""){
    sNumber = 0;
  }
  return sNumber;
}

Number.prototype.formatCurrency       = formatCurrency;
Number.prototype.unformatCurrency     = unformatCurrency;
String.prototype.formatCurrency       = formatCurrency;
String.prototype.unformatCurrency     = unformatCurrency;
Object.prototype.formatCurrency       = formatCurrency;
Object.prototype.unformatCurrency     = unformatCurrency;

function _ObjectDisplay(){
  var oWidget = null;
  for(var icount = 0; icount < arguments.length; icount++){
    oWidget = arguments[icount];
    if(oWidget == null){continue};
    switch(oWidget.tagName){
      case "TABLE":
        for(var i = 0; i < oWidget.cells.length; i++){
          var oCell = oWidget.cells[i]; 
          var oDato = this[oCell.name];
          
          if(oCell.expression != undefined && oCell.expression != null){
            var sExp = oCell.expression;
            var sResultExp = this.ReplaceInStr(sExp);
            oCell.innerHTML = sResultExp;
          }else{
            if (oDato != undefined && oDato != null){
              switch(oCell.datatype){
                case "currency":
                  oCell.innerText = oDato.formatCurrency();
                break;
                case "decimal":
                case "integer":
                  oCell.innerText = oDato.formatCurrency(null,"");
                break;
                case "date":
                  oCell.innerText = oDato.toString();
                break;
                default:
                  oCell.innerText = oDato;
                break;
              }
            }
          }          
          oCell = null;
        }
      break;
      case "FORM":
        debugStartGroup("Mostrando en Formulario " + oWidget.name);
        for(var i = 0; i < oWidget.elements.length; i++){
          //debugMessage("Elemento " + oWidget.elements[i].name + " : " + this[oWidget.elements[i].name]);
          var oRef = null;
          if(oWidget.elements[i].object != undefined && oWidget.elements[i].object != null){
            if(this[oWidget.elements[i].object])
              oRef = this[oWidget.elements[i].object][oWidget.elements[i].name];
          }else{
            oRef = this[oWidget.elements[i].name];            
          }
          if (oRef != undefined && oRef != null){            
            switch(oWidget.elements[i].type){
              case "checkbox":
                oWidget.elements[i].checked = false;
                if(oRef == 'yes' || oRef == 'on' || oRef == 'true' || oRef == '1'){
                  oWidget.elements[i].checked = true;
                }
              break;
              case "radio":
                var bSelected = (oRef == 'yes' || oRef == 'on' || oRef == 'true' || oRef == '0');
                srValue = oWidget.elements[i].value.toString();
                var oRef1 = (srValue == 'yes' || srValue == 'on' || srValue == 'true' || srValue == '0');
                if(bSelected && oRef1  || !bSelected && !oRef1)
                  oWidget.elements[i].checked = true;
                else
                  oWidget.elements[i].checked = false;                
              break;
              case "decimal":
              case "integer":
                if(oWidget.elements[i].setValue)
                  oWidget.elements[i].setValue(oRef);
                else
                  oWidget.elements[i].value = oRef;
              break;
              case "select-one":
                if(oWidget.elements[i].setValue)
                  oWidget.elements[i].setValue(oRef);
                else
                  oWidget.elements[i].value = oRef;
                if(oWidget.elements[i].value != oRef){
                  var oOption = document.createElement('OPTION');
                  oOption.selected    = true;
                  oOption.value       = this[oWidget.elements[i].name];
                  oOption.innerHTML   = this[oWidget.elements[i].fieldshow];
                  oWidget.elements[i].appendChild(oOption);
                }  
              break;
              case "button":
              case "submit":
              
              break;
              default:
                if(oWidget.elements[i].setValue)
                  oWidget.elements[i].setValue(oRef);
                else
                  oWidget.elements[i].value = oRef;
              break;
            }
          }
          //debugMessage("Elemento " + oWidget.elements[i].name + " : Valor " + oWidget.elements[i].value);
        }
        debugStopGroup();
      break;
    }  
  }
}

function _ArrayDisplay(oWidget, sSelect){
  if(sSelect == undefined){
    sSelect = null;
  }
  switch(oWidget.tagName){
    case "TABLE":
      var oRowFields = null;
      for(var i = 0; i < oWidget.rows.length; i++){
        if (oWidget.rows[i].name == "fields"){
          oRowFields = oWidget.rows[i];
          break;
        }
      }
      if (oRowFields == null){return;}
      var aRowClass = new Array();
      if(oRowFields.rowclass){
        aRowClass = oRowFields.rowclass.split(",");
      }
      for(i = 0; i < this.length; i++){
        var oRow = oWidget.insertRow();        
        if(aRowClass.length > 0){
          oRow.className = aRowClass[i % (aRowClass.length)];
        }
        if(oRowFields.clickhandler){
          if(window[oRowFields.clickhandler]){
            oRow.attachEvent("onclick", window[oRowFields.clickhandler]);
            oRow.style.cursor = "hand";
          }else{
            var oFnc = eval(oRowFields.clickhandler); 
            if(oFnc)
              oRow.attachEvent("onclick", oFnc);
          }
        }
        oRow.displayObject = this[i];
        oRow.objectIndex = i;
        oRow.table = oWidget;
        for(var j = 0; j < oRowFields.cells.length; j++){
          var fnDisplay = null;
          fnDisplay = eval("window." + oWidget.id.replace(/\./g, "__") + "_" + oRowFields.cells[j].name + "_display;");
          if(fnDisplay){
            var oCell = oRow.insertCell();
            if(oRowFields.cells[j].fieldclass){
              oCell.className = oRowFields.cells[j].fieldclass;
            }
            if(oRowFields.cells[j].clickhandler){
              if(window[oRowFields.cells[j].clickhandler]){
                oCell.attachEvent("onclick", window[oRowFields.cells[j].clickhandler]);
              }
            }
            fnDisplay(oCell, this[i]);
            continue;
          }

          var oCell = oRow.insertCell();
          oCell.innerText = " ";
          if(this[i][oRowFields.cells[j].name]){
            if(oRowFields.cells[j].fieldclass){
              oCell.className = oRowFields.cells[j].fieldclass;
            }
            if(oRowFields.cells[j].clickhandler){
              if(window[oRowFields.cells[j].clickhandler]){
                oCell.attachEvent("onclick", window[oRowFields.cells[j].clickhandler]);
              }
            }
            oCell[oRowFields.cells[j].name] = this[i][oRowFields.cells[j].name];
            switch(oRowFields.cells[j].datatype){
              case "decimal":
              case "integer":
                oCell.innerText = this[i][oRowFields.cells[j].name].formatCurrency(null,"");
              break;
              case "currency":
                oCell.innerText = this[i][oRowFields.cells[j].name].formatCurrency();
              break;
              case "character":
              case "date":
              default:
                oCell.innerText = this[i][oRowFields.cells[j].name];
              break;
            }
          }
        }        
      }
    break;
    case "SELECT":
      oWidget.expression = oWidget.expression || oWidget.getAttribute('expression')
      if(oWidget.expression != undefined && oWidget.expression != null){
        var sExpression = oWidget.expression;
        if(sExpression == "")
          sExpression = 'expression=' + oCell.innerHTML;
        oWidget.expressioner = new cExpression(sExpression);
      }


      for(;oWidget.childNodes.length > 0;){
        oWidget.removeChild(oWidget.childNodes[0]);
      }
      var sField = oWidget.field || oWidget.getAttribute('field');
      var sFieldValue = oWidget.fieldvalue || oWidget.getAttribute('fieldvalue');
      var sLength = oWidget.fieldlength || oWidget.getAttribute('fieldlength') || ""; 
      for(var i = 0; i < this.length; i++){
        var oField = this[i][sField];
        if(oWidget.expressioner){
          oField = oWidget.expressioner.evaluate(this[i]);
        }
        if(oField != undefined){
          var oOption = document.createElement("OPTION");
          if (sLength != ""){
            var sVal = oField.toString();
            if(sVal.length > sLength){
              sVal = oField.toString().substr(0, sLength);
            }
            oOption.innerText = sVal;
          }else
            oOption.innerText = oField;
          oOption.value = this[i][sFieldValue];
          oOption.object = this[i];
          if(sSelect != null){
            if(sSelect == this[i][sFieldValue]){
              oOption.selected = true;
            }
          }
          oWidget.appendChild(oOption);
          oOption = null;
        }
      }
      oWidget.size = this.length;
      oWidget.size = 1;
    break;
  }
}

function _ObjectLoad(oWidget, sObject){
  if(sObject == undefined){
    var sObject = "";
  }
  debugStartGroup("Carga de Formulario a Objeto");
  switch(oWidget.tagName){
    case "FORM":
      for(var i in this){
        if(this[i] instanceof Function){continue;}
        debugMessage("Propiedad " + i);
        if(this[i] instanceof Object){
          this[i].load(oWidget, i);
          continue;
        }
        //debugMessage("Analizando " + i);
        if(oWidget.elements[i]){
          if(sObject != ""){
            //debugMessage("Buscando Objeto " + sObject);
            var oField = oWidget.elements[i];
            if(oField.tagName != undefined){
              if(oField.object != undefined && oField.object != null){
                debugMessage("Tiene Objeto definido " + oField.object);
                if(oField.object == sObject){
                  debugMessage("Cargando Propiedad " + i);
                  if(oField.getValue)
                    this[i] = oField.getValue();
                  else
                    this[i] = oField.value;
                }
              }              
            }else{
              for(var j = 0; j < oField.length; j++){
                //debugMessage("Propiedad " + sObject + "." + i + " esta en widget " + oField[j].value);
                if(oField[j].object != undefined && oField[j].object != null){
                  debugMessage("Tiene Objeto definido " + oField[j].object);
                  if(oField[j].object == sObject){
                    debugMessage("Cargando Propiedad " + i);
                    if(oField[j].getValue)
                      this[i] = oField[j].getValue();
                    else
                      this[i] = oField[j].value;
                  }
                }
              }                        
            }
          }else{
            //debugMessage("Buscando Elemento " + i + ":" + oWidget.elements[i].type);
            switch(oWidget.elements[i].type){
              case "checkbox":
                this[i] = oWidget.elements[i].checked?'yes':'no';
              break;
              default:
                if(oWidget.elements[i].getValue)
                  this[i] = oWidget.elements[i].getValue();
                else
                  this[i] = oWidget.elements[i].value;              
              break;              
            }
            //debugMessage("Propiedad " + i + " cargado con " + this[i]);
          }         
        }
      }
    break;
  }
  debugStopGroup();
}

Object.prototype.display = _ObjectDisplay;
Array.prototype.display = _ArrayDisplay;
Object.prototype.load = _ObjectLoad;

function startUtils(){
//   for(var i = 0; i < document.forms.length; i++){
//     document.forms[i].disable = _FormDisable;
//     document.forms[i].enable = _FormEnable;
//     document.forms[i].fieldHide = _FieldHide;
//     document.forms[i].fieldShow = _FieldShow;
//     if(_FormSerialize){
//       document.forms[i].serialize = _FormSerialize;
//     }
//   }
  if(window.lRequiredLogin){
    if(GetCookie('sessionid') == null){
      document.location = sUrlNotLogin;
    }
  }
  if(window.cDebugger){
    loadStyle('baseline/styles/depuracion.css');
    window.debug = new cDebugger(CONFIG.DEBUG_ENABLE);
  }
}

function getOffSetTop(oEle){
  if(oEle.offsetParent){
    return parseInt(oEle.offsetTop) + getOffSetTop(oEle.offsetParent);
  }else{
    return parseInt(oEle.offsetTop);
  }
}

function getOffSetLeft(oEle){
  if(oEle.offsetParent){
    return parseInt(oEle.offsetLeft) + getOffSetLeft(oEle.offsetParent);
  }else{
    return parseInt(oEle.offsetLeft);
  }
}

function SetCookie( name, value, expires, path, domain, secure ){
  var today = new Date();
  today.setTime( today.getTime() );

  if ( expires ){
    expires = expires * 1000 * 60 * 60 * 24;
  }
  var expires_date = new Date( today.getTime() + (expires) );

  document.cookie = name + "=" +escape( value ) +
  ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
  ( ( path ) ? ";path=" + path : "" ) +
  ( ( domain ) ? ";domain=" + domain : "" ) +
  ( ( secure ) ? ";secure" : "" );
}

function GetCookie( name ) {
  var start = document.cookie.indexOf( name + "=" );
  var len = start + name.length + 1;
  if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ))){
    return null;
  }
  if ( start == -1 ) return null;
  var end = document.cookie.indexOf( ";", len );
  if ( end == -1 ) end = document.cookie.length;
  return unescape( document.cookie.substring( len, end ) );
}

function DeleteCookie( name, path, domain ) {
  if ( GetCookie( name ) ) document.cookie = name + "=" +
  ( ( path ) ? ";path=" + path : "") +
  ( ( domain ) ? ";domain=" + domain : "" ) +
  ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function cDate(){
  var self = this;

  this.init                       = _init;
  this.setValue                   = _setValue;
  this.disable                    = _disable;
  this.enable                     = _enable;
  this.clear                      = _clear;
  
  function _init(){
    if(self.finYear == undefined || self.finYear == null){
      self.finYear = 0;
    }
    if(self.iniYear == undefined || self.iniYear == null){
      self.iniYear = 0;
    }
    if(self.finYear == 0){
      var oDate = new Date();
      self.finYear = oDate.getFullYear();
      oDate = null;
    }
    if(self.iniYear == 0){
      var oDate = new Date();
      self.iniYear = oDate.getFullYear();
      oDate = null;
    }

    if(!self.finYear.toString().search(/^[-+]/)){
      var oDate = new Date();
      self.finYear = oDate.getFullYear() + parseFloat(self.finYear.toString());
      oDate = null;
    }

    if(!self.iniYear.toString().search(/^[-+]/)){
      var oDate = new Date();
      self.iniYear = oDate.getFullYear() + parseFloat(self.iniYear.toString());
      oDate = null;
    }

    var oDate = new Date();
    self.innerHTML = cFecha(self.input, self.iniYear, self.finYear, self.form);
    var oDate1 = new Date();
    debugMessage("HTML Fecha " + (oDate1 - oDate));
    self.field  = self.children(self.children.length - 1);
    self.field.setValue = self.setValue;
    self.field.disable  = self.disable;
    self.field.enable   = self.enable;
    self.field.clear    = self.clear;
    self.field.selector = self.children(self.children.length - 2);
    self.field.dia      = self.children(self.children.length - 3);
    self.field.mes      = self.children(self.children.length - 4);
    self.field.anio     = self.children(self.children.length - 5);
    
    if(self.caption)
      self.field.caption    = self.caption;
    if(self.mandatory)
      self.field.mandatory  = self.mandatory;
    if(self.validation)
      self.field.validation = self.validation;
    if(self.field.form.initField){
      self.field.form.initField(self.field);
    }
    //alert(self.field.name + ":" + self.field.setValue);
  } 
  
  function _setValue(oValor)
  {
    debugMessage(self.field.form.name);
    setDate(self.input, oValor, self.field.form.name);
  }
  
  function _disable(){
    self.field.selector.disabled  = true;
    self.field.dia.disabled       = true;     
    self.field.mes.disabled       = true;         
    self.field.anio.disabled      = true;
    self.field.disabled           = true;        
  }
  
  function _enable(){
    self.field.selector.disabled  = false;
    self.field.dia.disabled       = false;     
    self.field.mes.disabled       = false;         
    self.field.anio.disabled      = false;
    self.field.disabled           = false;        
  }
  
  function _clear(){
    self.field.dia.value 	= -1;     
    self.field.mes.value 	= -1;         
    self.field.anio.value = -1;
    self.field.value = "";
  }
}

function cFecha(sName, initialYear, finalYear, sForm){
  if(sForm == undefined || sForm == null){
    var sForm = "";
  }

  var sMeses = "Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre";
  var aMeses = sMeses.split(",");
  var sFecha = "";
  sFecha = '<select class="selectField" name="mes' + sName + '" onclick="updateDate(\'' + sName + '\',\'' + sForm + '\');" onchange="updateDate(\'' + sName + '\',\'' + sForm + '\');">';
  sFecha += '<option value="-1">Mes</option>';
  for(var i = 1; i <= 12; i++){
    sFecha += '<option value="' + i + '">' + aMeses[i - 1] + '</option>';
  }
  sFecha += '</select>';
  sFecha += '<select class="selectField" name="dia' + sName + '" onclick="updateDate(\'' + sName + '\',\'' + sForm + '\');" onchange="updateDate(\'' + sName + '\',\'' + sForm + '\');">';
  sFecha += '<option value="-1">Día</option>';
  for(var i = 1; i <= 31; i++){
    sFecha += '<option value="' + i + '">' + i + '</option>';
  }
  sFecha += '</select>';
  sFecha += '<select class="selectField" name="anio' + sName + '" onclick="updateDate(\'' + sName + '\',\'' + sForm + '\');" onchange="updateDate(\'' + sName + '\',\'' + sForm + '\');">';
  sFecha += '<option value="-1">Año</option>';
  for(var i = finalYear; i >= initialYear; i--){
    sFecha += '<option value="' + i + '">' + i + '</option>';
  }
  sFecha += '</select><img src="baseline/images/cal.gif" id="image_' + sName + '" onclick="Calendario(\'' + sName + '\', \'' + sForm + '\');" title="Seleccionar Fecha Desde Calendario" style="cursor:hand;">';
  sFecha += '<input type="hidden" name="' + sName + '">';
  return sFecha;
}

function Calendario(sDate, sForm){
 if(sForm == undefined || sForm == null){
   var sForm = ""; 
 }
 //oObj = window.event.srcElement;
// oText = oObj.getAttribute("text");
/// oInput = document.getElementById(oText);
 var vResult = window.showModalDialog("baseline/CMCalendar.html?" + Math.random() + "" + Math.random() + "" + Math.random(), "", "status: No; help : No;resizable: No;dialogHeight: 300px;");
  if (vResult){
    var aDate = vResult.split('/');
    var sDay = aDate[0];
    var sMonth = aDate[1];
    var sYear = aDate[2];
    if(sForm == "")
      var oDay = document.getElementById('dia' + sDate);
    else 
      var oDay = document.forms[sForm].elements['dia' + sDate];
      
    if (oDay){
      oDay.value = sDay;
    }
    if(sForm == "")
      var oMes = document.getElementById('mes' + sDate);
    else 
      var oMes = document.forms[sForm].elements['mes' + sDate];
    if (oMes){
      oMes.value = sMonth;
    }
    if(sForm == "")
      var oAnio = document.getElementById('anio' + sDate);
    else
      var oAnio = document.forms[sForm].elements['anio' + sDate];
      
    if (oAnio){
      oAnio.value = sYear;
      if (oAnio.value == ""){

        oYear = document.createElement("OPTION");
        var oMax = oAnio.options[oAnio.options.length - 1];
        if (parseInt(oMax.value) > parseInt(sYear)){
          oAnio.options.add(oYear);
        }else{
          oAnio.options.add(oYear,1);
        }

        oYear.value = sYear;
        oYear.innerText = sYear;
      }
      oAnio.value = sYear;
    }
    updateDate(sDate, sForm);
  }
}

function setDate(sName, sValue, sForm)
{
  if(sForm == undefined || sForm == null){
    var sForm = "";
  }
  debugStartGroup("Estableciendo Fecha " + sName + " " + sValue + " " + sForm);
  if(sForm != "")
    var oDia = document.forms[sForm].elements['dia' + sName];
  else
    var oDia = document.getElementById('dia' + sName);
  if (oDia == null){
    debugMessage("Dia no encontrado");
    debugStopGroup();
    return;
  }

  if(sForm != "")
    var oMes = document.forms[sForm].elements['mes' + sName];
  else
    var oMes = document.getElementById('mes' + sName);
  if (oMes == null){
    debugMessage("Mes no encontrado");
    debugStopGroup();
    return;
  }

  if(sForm != "")
    var oAnio = document.forms[sForm].elements['anio' + sName];
  else
    var oAnio = document.getElementById('anio' + sName);
  if (oAnio == null){
    debugMessage("A??o encontrado");
    debugStopGroup();
    return;
  }

  var aValue = sValue.toString().replace(/(\s)/g,'').split("/");
  if(aValue.length != 3){
    debugMessage("Fecha no tiene tres elementos");
    oDia.value = "-1";
    oMes.value = "-1";
    oAnio.value = "-1";
    debugStopGroup();
    return;
  }

  oDia.value = parseFloat(aValue[0]);
  oMes.value = parseFloat(aValue[1]);
  oAnio.value = parseFloat(aValue[2]);
  if(oAnio.value != parseFloat(aValue[2])){
	  var oOption = document.createElement('OPTION');
	  oOption.selected    = true;
	  oOption.value       = parseFloat(aValue[2]);
	  oOption.innerHTML   = aValue[2];
	  oAnio.appendChild(oOption);
	}  
  
  
  debugGroup("Valores Fecha ", aValue);
  updateDate(sName, sForm);
  debugStopGroup();
}

function updateDate(sName, sForm)
{
  if(sForm == undefined || sForm == null){
    var sForm = "";
  }
  
  if(sForm == "")
    var oFecha = document.getElementById(sName);
  else 
    var oFecha = document.forms[sForm].elements[sName];

  if(oFecha == null){
    alert("Fecha no encontrado");
    return;
  }
  oFecha.value = "";
  
  if(sForm == "")
    var oDia = document.getElementById('dia' + sName);
  else  
    var oDia = document.forms[sForm].elements['dia' + sName];
    
  if (oDia == null){
    alert("Dia no encontrado");
    return;
  }
  
  if(sForm == "")
    var oMes = document.getElementById('mes' + sName);
  else  
    var oMes = document.forms[sForm].elements['mes' + sName];
  
  if (oMes == null){
    alert("Mes no encontrado");
    return;
  }
  
  if(sForm == "")
    var oAnio = document.getElementById('anio' + sName);
  else  
    var oAnio = document.forms[sForm].elements['anio' + sName];
    
  if (oAnio == null){
    alert("A??o encontrado");
    return;
  }
  if (oDia.value != "-1" && oMes.value != "-1" && oAnio.value != "-1"){
    debugMessage("Estableciendo " + oAnio.value + ": " + parseFloat(oMes.value) + ":" + oDia.value + " en " + sForm);   
    var dt = new Date(oAnio.value, parseFloat(oMes.value)-1, oDia.value);
    oDia.value = dt.getDate();
    oMes.value = dt.getMonth() + 1;
    oFecha.value = oDia.value + "/" + oMes.value + "/" + oAnio.value;
  }else{
//    oDia.value = -1;
//    oMes.value = -1;
//    oAnio.value = -1;
    oFecha.value = "";
  }
}

function cRequestItem(){
  this.name = "";
  this.value = "";
}

function cRequest(){
  this.pagina = "";
  this.parametros = new Array();

  var sLocation = "";

  sLocation = document.location.search;
  sLocation = sLocation.substr(1);

  var parametros = new Array();
  parametros = sLocation.split('&');
  for( var i = 0 ; i < parametros.length; i++){
    var oItem = new cRequestItem();
    var aItem = parametros[i].split('=');
    if (aItem.length = 2){
      oItem.name  = decodeURIComponent == null? unescape(aItem[0]) : decodeURIComponent(aItem[0]);
      oItem.value = decodeURIComponent == null? unescape(aItem[1]) : decodeURIComponent(aItem[1]);
    }
    this.parametros.push(oItem);
  }
  this.GetValue = _GetValue;

  function _GetValue(sName){
    for(var i = 0; i < this.parametros.length; i++){
      var oItem = this.parametros[i];
      if (oItem.name == sName){
        return oItem.value;
      }
    }
    return "";
  }
}

window.request = new cRequest();

function show(ids){
  var aId = ids.split(',');
  for(var i = 0; i < aId.length; i++){
    sId = aId[i];
    var oEl = document.getElementById(sId);
    if (oEl){
      oEl.style.display = "";
    }
  }
}

window.show = show;

function hide(ids){
  var aId = ids.split(',');
  for(var i = 0; i < aId.length; i++){
    sId = aId[i];
    var oEl = document.getElementById(sId);
    if (oEl){
      oEl.style.display = "none";
    }
  }
}

window.hide = hide;

function _FieldHide(ids){
  var aId = ids.split(',');
  for(var i = 0; i < aId.length; i++){
    sId = aId[i];
    var oEl = this.elements[sId];
    if (oEl){
      oEl.style.display = "none";
    }
  }
}

function _FieldShow(ids){
  var aId = ids.split(',');
  for(var i = 0; i < aId.length; i++){
    sId = aId[i];
    var oEl = this.elements[sId];
    if (oEl){
      oEl.style.display = "";
    }
  }
}

function _copyFromObject(oObj){
  for(var i in this){
    if(oObj[i]){
      if(oObj[i] instanceof Object){continue;}
      this[i] = oObj[i];
    }
  }
}

Object.prototype.copyFromObject = _copyFromObject;

function cHour(){
  var self = this;

  this.init       = _init;
  this.setValue   = _setValue;
  this.enable     = _enable;
  this.disable    = _disable;
  this.clear      = _clear;
  
  
  function _init(){
    self.innerHTML = cHora(self.input);
    self.field            = self.children(self.children.length - 1);
    self.field.meridiano  = self.children(self.children.length - 2);
    self.field.minutos    = self.children(self.children.length - 3);
    self.field.horas      = self.children(self.children.length - 4);
    
    self.field.setValue = self.setValue;
    self.field.enable   = self.enable;
    self.field.disable  = self.disable;
    self.field.clear    = self.clear;
    
    
    if(self.caption)
      self.field.caption    = self.caption;
    if(self.mandatory)
      self.field.mandatory  = self.mandatory;
    if(self.validation)
      self.field.validation = self.validation;
    if(self.field.form.initField){
      self.field.form.initField(self.field);
    }
  } 
  
  function _setValue(oValor){
    setHour(self.input, oValor);
  }
  
  function _enable(){
    self.field.disabled           = false;
    self.field.meridiano.disabled = false;
    self.field.minutos.disabled   = false;
    self.field.horas.disabled     = false;
  }
  
  function _disable(){
    self.field.disabled           = true;
    self.field.meridiano.disabled = true;
    self.field.minutos.disabled   = true;
    self.field.horas.disabled     = true;
  }
  
  function _clear(){
    self.field.meridiano.value = '-1';
    self.field.minutos.value   = '-1';
    self.field.horas.value     = '-1';
  }
}


function cHora(sName){
  var sHora = '<select name="horas_' + sName + '" class="selectfield" onchange="updateHour(\'' + sName + '\')">';
  sHora += '<option value="-1">Hora</option>';
  for(var i = 1; i <= 12; i++){
    sHora += '<option value="' + i + '">' + i + '</option>';
  }
  sHora += '</select>';
  sHora += '<select name="minutos_' + sName + '" class="selectfield" onchange="updateHour(\'' + sName + '\')">';
  sHora += '<option value="-1">Min.</option>';
  for(var i = 0; i <= 59; i++){
    sHora += '<option value="' + i + '">' + i + '</option>';
  }
  sHora += '</select>';
  sHora += '<select name="meridiano_' + sName + '" class="selectfield" onchange="updateHour(\'' + sName + '\')">';
  sHora += '<option value="-1">----</option>';
  sHora += '<option value="0">A.M.</option>';
  sHora += '<option value="1">P.M.</option>';
  sHora += '</select>';
  sHora += '<input type="hidden" name="' + sName + '">';
  return sHora;
}

function setHour(sName, iValue){
  debugStartGroup("Hora " + sName + " : " + iValue);
  var oHoras = document.getElementById("horas_" + sName);
  var oMinutos = document.getElementById("minutos_" + sName);
  var oMeridiano = document.getElementById("meridiano_" + sName);
  var oHora = document.getElementById(sName);

  if(oHora == null || oHora == undefined){
    debugMessage("No campo hora");
    debugStopGroup();
    return;
  }
  if(oHoras == null || oHoras == undefined){
    debugMessage("No campo Horas");
    debugStopGroup();
    return;
  }
  if(oMinutos == null || oMinutos == undefined){
    debugMessage("No campo minutos");
    debugStopGroup();
    return;
  }
  if(oMeridiano == null || oMeridiano == undefined){
    debugMessage("No campo meridiano");
    debugStopGroup();
    return;
  }

  if(iValue == "" || iValue == "0"){
    debugMessage("Hora vacia o cero " + iValue);
    oHoras.value = "12";
    oMinutos.value = "0";
    oMeridiano.value = "0";
  }else{
    var iHora = parseInt(iValue / (60*60));
    var iMinutos = parseInt(iValue / (60)) % 60;
    debugMessage("Hora " + iHora);
    oMeridiano.value = "0";
    if(iHora >= 12){
      oMeridiano.value = "1";
    }
    if(iHora > 12){
      iHora -= 12;
    }
    debugMessage("Hora " + iHora);
    debugMessage("Minutos " + iMinutos);
    debugMessage("Meridiano " + oMeridiano.value);
    oHoras.value = iHora;
    oMinutos.value = iMinutos;
    debugMessage("Hora.value " + oHoras.value);
    debugMessage("Minutos.value " + oMinutos.value);
  }
  updateHour(sName);
  debugStopGroup();
}

function updateHour(sName){
  var oHoras = document.getElementById("horas_" + sName);
  var oMinutos = document.getElementById("minutos_" + sName);
  var oMeridiano = document.getElementById("meridiano_" + sName);
  var oHora = document.getElementById(sName);

  if(oHora == null || oHora == undefined){
    return;
  }
  oHora.value = "";
  if(oHoras == null || oHoras == undefined){
    return;
  }
  if(oMinutos == null || oMinutos == undefined){
    return;
  }
  if(oMeridiano == null || oMeridiano == undefined){
    return;
  }

  if(oHoras.value == "-1" || oMinutos.value == "-1" || oMeridiano.value == "-1"){
    return;
  }

  debugMessage("Hora Actualizada: Horas.value " + oHoras.value);
  debugMessage("Hora Actualizada: Minuto.value " + oMinutos.value);
  debugMessage("Hora Actualizada: Meridiano.value " + oMeridiano.value);

  var iHoras = parseInt(oHoras.value) + parseInt(oMeridiano.value) * 12;
  if (iHoras == 12){
    iHoras = 0;
  }
  if (iHoras == 24){
    iHoras = 12;
  }
  var iMinutos = parseInt(oMinutos.value);

  var iTime = (iHoras * 3600) + (iMinutos * 60);
  oHora.value = iTime;
  debugMessage("Hora Actualizada: Horas " + iHoras);
  debugMessage("Hora Actualizada: Minuto " + iMinutos);
  debugMessage("Hora Actualizada " + oHora.value);
}

function _compareDate(sOp, oDate, iAnios, iMeses, iDias){
  var aDate = this.split("/");
  if(aDate.length != 3){
    return false;
  }
  var selfDate = new Date(aDate[2], aDate[1] - 1, aDate[0]);
  var otDate = oDate;
  otDate.setHours(0,0,0,0);
  if(iAnios > 0){
    oDate.setFullYear(oDate.getFullYear() + iAnios);
  }
  if(iMeses > 0){
    oDate.setMonth(oDate.getMonth() + iMeses);
  }
  if(iDias > 0){
    oDate.setDate(oDate.getDate() + iDias);
  }
  switch(sOp){
    case ">=" :
      return selfDate >= otDate;
    break;
    case ">" :
      return selfDate > otDate;
    break;
    case "<=" :
      return selfDate <= otDate;
    break;
    case "<" :
      return selfDate < otDate;
    break;
    case "==" :
      return selfDate == otDate;
    break;
    case "!=" :
      return selfDate != otDate;
    break;
  }
}

function _StringToDate(sDate){
  var aDate = sDate.split("/");
  if(aDate.length != 3){return;}
  debugMessage(aDate[0] + ":" + (aDate[1] - 1) + ":" + aDate[2]);
  this.setDate(aDate[0]);
  this.setMonth(aDate[1] - 1);
  this.setYear(aDate[2]);
  this.setHours(0,0,0,0);
}

Date.prototype.StringToDate = _StringToDate;
Date.prototype.DateToString = _DateToString;
Object.prototype.compareDate = _compareDate;

function _DateToString(sFormat){
  if(sFormat == undefined || sFormat == null)
    var sFormat = "dmy";
  var sString = "";
  for(var iLength = 0; iLength < sFormat.length; iLength++){
    var sItem = sFormat.charAt(iLength);
    switch(sItem){
      case "d":
        sString += (sString==""?"":"/") + this.getDate().toString();
      break;
      case "m":
        sString += (sString==""?"":"/") + (this.getMonth() + 1).toString();
      break;
      case "y":
        sString += (sString==""?"":"/") + this.getFullYear().toString();
      break;
    }
  }
  return sString;
}

function debugMessage(oMsg){
  if(window.debug){
    window.debug.print(oMsg);
  }
}

function debugStartGroup(oMsg){
  if(window.debug){
    window.debug.startGroup(oMsg);
  }
}

function debugStopGroup(){
  if(window.debug){
    window.debug.stopGroup();
  }
}

function debugGroup(sLabel, oObject){
  if(window.debug){
    debugStartGroup(sLabel);
    debugMessage(oObject);
    debugStopGroup();
  }
}

function _Accumulate(sExpresion){
  if(sExpresion == undefined){
    var sExpresion = "";
  }
  if(sExpresion == null){
    sExpresion = "";
  }
  var dResult = 0;
  var sExp = "";
  for(var i = 0; i < this.length; i++){
    var oObj = this[i];
    if (oObj instanceof Object){
      sExp = sExpresion;
      for(var prop in oObj){
        if(oObj[prop] instanceof Object){continue;}
        if(oObj[prop] instanceof Array){continue;}
        sExp = sExp.replace("@" + prop,oObj[prop]);
      }
      try{
        var dItem = parseFloat(eval(sExp));
      }catch(e){
        return NaN;
      }
      if(isNaN(dItem)){
         return NaN;
      }
      dResult += dItem;
    }else{
      var dItem = parseFloat(oObj);
      if(isNaN(dItem)){
         return NaN;
      }
      dResult += dItem;
    }
  }
  return dResult;
}

Array.prototype.accumulate = _Accumulate;

function _ReplaceInStr(sExp, prop){
  if(prop == undefined){
    var prop = "";
  }else{
    if (prop != "")
      prop += ".";
  }
  if(this instanceof Array){

  }
  if(this instanceof Object){
    for(var i in this){
      if(this[i] instanceof Function){continue};
      if(this[i] instanceof Array){
        sExp = sExp.replace("@" + prop + i + ".length" + "@",this[i].length);
        continue;
      }
      if(this[i] instanceof Object){
        sExp = this[i].ReplaceInStr(sExp, prop + i);
        continue;
      }      
      sExp = sExp.replace("@" + prop + i + "@",this[i]);
    }
  }
  return sExp;
}

Array.prototype.ReplaceInStr = _ReplaceInStr;
Object.prototype.ReplaceInStr = _ReplaceInStr;

function initForms(sForms){
  aForms = sForms.split(",");
  //debugStartGroup("Enlace de campos de formulario");
  var oForm = null;
  var oField = null;
  for(var i = 0; i < aForms.length; i++){
    oForm = document.forms[aForms[i]];    
    if(oForm){
      if(oForm.serialize != undefined && oForm.serialize != null){
        return;
      }
      oForm.serialize = _FormSerialize;
      oForm.disable = _FormDisable;
      oForm.enable = _FormEnable;
      oForm.fieldHide = _FieldHide;
      oForm.fieldShow = _FieldShow;      
      oForm.validate = _FormValidate;
      oForm.checked = false;
      oForm.messages = ""; 
      for(var j = 0; j < oForm.elements.length; j++){
        oField = oForm.elements[j];
        oForm.failed = false;                    
        switch(oField.type){
          case "text":
          case "textarea":
          case "hidden":
          case "password":
            //debugMessage(oField.name  + " enlazado");
            oField.attachEvent("onkeypress", FieldKeyPress);
            oField.attachEvent("onfocus", FieldChange);
            oField.attachEvent("onblur", FieldChange);
            oField.failed = false;
            oField.validationEvent = "onblur";
          break;
          case "button":
          
          break;
          case "select-one":
          default:
            if(oField.validate != undefined && oField.validate != "false" && oField.validate != "no"){
              oField.attachEvent("onchange", FieldChange);
              oField.failed = false;
              oField.validationEvent = "onchange";
            }
          break;          
        }
      }
    }
  }
  //debugStopGroup();
}

function _FormValidate(){
  this.messages = "";
  this.failed = false;  
  for(var i = 0; i < this.elements.length; i++){
    var oField = this.elements[i];
    if(oField.validationEvent){    
      this.elements[i].fireEvent(oField.validationEvent);       
    }
  }
}

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;
  }
  var sValue = oInput.value;
  
  if (oInput.mandatory == "yes" && sValue.replace(/\s/g,"") == ""){
    oInput.className = "input_wrong";
    oInput.failed = true;
    oInput.title = "Es Obligatorio";
    if(oInput.form){
      oInput.form.failed = true || oInput.form.failed;
      oInput.form.messages += oInput.caption + " es obligatorio\n";
    }
    return;  
  }
    
  if (oInput.validation && sValue != ""){
    if(sValue.search(oInput.validation)){
      oInput.className = "input_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 = "input";
  }
  oInput.failed = false;
  oInput.title = "";
  if(oInput.form){
    oInput.form.failed = false || oInput.form.failed;
  }
}

function notifyLoad(oEvent){
  if(!oEvent)
    oEvent = window.event;
  if(oEvent.srcElement)
    var oEl = oEvent.srcElement;
  else
    var oEl = oEvent.target;
  if(oEl.readyState == undefined){
    oEl.readyState = 'complete';
  }
  debugMessage(oEl.script + ":" + oEl.readyState);  
  if(oEl.readyState == "loaded" || oEl.readyState == "complete"){
    if(oEl.callback != null || oEl.callback != undefined){
      debugMessage(oEl.script + ": haciendo notificacion de carga");
      var sClass = oEl.script;
      oEl.callback(sClass);
      oEl.notified = true; 
    }    
  }
}

function loadScript(sPath, sScript, oFnc){
  var oScript = document.createElement('SCRIPT');
  oScript.language = "javascript";
  oScript.defer = false;
  oScript.path = sPath;
  oScript.script = sScript;
  oScript.callback = oFnc;
  oScript.name = sScript; 
  oScript.type = "text/javascript";
  oScript.onreadystatechange = notifyLoad;
  oScript.onload = notifyLoad;
  oScript.src = sPath + sScript.replace(/\./g, "/") + ".js";
  document.getElementsByTagName('head')[0].appendChild(oScript);
  return oScript;
}

function loadStyle(sStyle){
  var oStyle  = document.createElement('LINK');
  oStyle.href = sStyle;
  oStyle.rel  = "stylesheet";
  oStyle.type = "text/css";  
  document.getElementsByTagName('head')[0].appendChild(oStyle);
  oStyle = null;
}

var oTimeContainer = null;
function changeTime(){
  if(oTimeContainer == null)
    oTimeContainer = document.getElementById('app_fecha_hora');
  if(oTimeContainer){
    var ot = new Date();
    var sTime = (ot.getDate() < 10? '0' + ot.getDate():ot.getDate()) + "/" + (ot.getMonth() + 1) + "/" + ot.getFullYear();
    var sHora = ((ot.getHours() % 12) < 10?'0' + (ot.getHours() % 12):(ot.getHours() % 12))  + ":";
    if(sHora == "00:"){sHora = '12:';} 
    oTimeContainer.innerText =
      sTime.ToDateString() + " "
      + sHora       
      + (ot.getMinutes() < 10? '0' + ot.getMinutes() : ot.getMinutes()) + ":" 
      + (ot.getSeconds() < 10? '0' + ot.getSeconds() : ot.getSeconds()) 
      + (ot.getHours() < 12?' a.m.':' p.m.');    
  }
  oTimeContainer = null;
  setTimeout("changeTime();",1000);
}

Object.prototype.addListener = _addEventListener; 
Object.prototype.dispatch = _DispathEvent;

function _addEventListener(sEvent, hFunction){
  if(this.eventListeners == undefined || this.eventListeners == null){
    this.eventListeners = new Object();
  }
  if(this.eventListeners[sEvent] == undefined || this.eventListeners[sEvent] == null){
    this.eventListeners[sEvent] = new Array();
  }
  if(this.eventListeners[sEvent].contains(hFunction) > -1){
    return;
  }
  debugMessage("Adding listener for " + sEvent);
  this.eventListeners[sEvent].push(hFunction);
}

function _DispathEvent(oEvent){
  var sEvent = oEvent.name;
  debugMessage("Event Dispatch from: " + this.name + ": " + sEvent);
  if(this.eventListeners != undefined && this.eventListeners != null){
    if(this.eventListeners[sEvent] != undefined && this.eventListeners[sEvent] != null){
      for(var i = 0; i < this.eventListeners[sEvent].length; i++){        
        debugMessage("Dispatching event " + sEvent);
        var bResult = this.eventListeners[sEvent][i](oEvent);
        if(bResult != undefined)
          if(bResult == false || bResult == null){
            debugMessage("Event Cancelado " + sEvent);
            return false;
          }
      }
    }
  }
  return true;
}

function _contains(oEl){
  for(var i = 0; i < this.length; i++){
    var oL = this[i];
    if(oL == oEl){
      return i;
    }
  }
  return -1;
}

Array.prototype.contains = _contains;
String.prototype.ToDateString = _ToDateString;

function _ToDateString(mode){
  var shortDays = ["Dom.", "Lun.", "Mar.", "Mie.", "Jue.", "Vie.", "Sab."];
  var longDays = ["Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"];

  var shortMonths = ["Ene.", "Feb.", "Mar.", "Abr.", "May.", "Jun.", "Jul.", "Ago.", "Sep.", "Oct.", "Nov.", "Dic."];
  var longMonths = ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"];

  aEl = this.split("/");
  if (aEl.length != 3){
    return this;
  }else{
    iDia = aEl[0];
    iMes = aEl[1] - 1;
    iAno = aEl[2];
    oDate = new Date(iAno, iMes, iDia);
    if (mode == "short"){
      sDia = shortDays[oDate.getDay()];
      sMes = shortMonths[oDate.getMonth()];
      iAno = oDate.getFullYear(); 
    }else{
      sDia = longDays[oDate.getDay()];
      sMes = longMonths[oDate.getMonth()];
      iAno = oDate.getFullYear(); 
    }
    return sDia + " " + iDia + " de " + sMes + " de " + iAno;
  }
}

function createWidgetsFromNames(oObj){
  for(var i in oObj.names){
    if(oObj.names[i] instanceof Array){continue;}
    if(oObj.names[i] instanceof Object){continue;}
    if(oObj.names[i] instanceof Function){continue;}
    oObj.widgets[i] = document.getElementById(oObj.names[i]);
    if(oObj.widgets[i] == null){
      oObj.widgets[i] = document.forms[oObj.names[i]];
    }          
    debugMessage("SetWidget " + i + ":" + oObj.widgets[i]);
  }
}

function extendObject(oObject, sClassName){
  oClass = window[sClassName];
  if(oClass == undefined && oClass == null){
    debugMessage("Dont extending " + sClassName);
    return false; 
  }
  try{
    debugMessage("extending " + sClassName);
    oObject[sClassName] = oClass;
    oObject[sClassName]();
    if(oObject.init)
      oObject.init(); 
  }catch(e){
    return false;
  }
  return true;
}

function objectToArray(oObject, oClass){
  var aArray = new Array();

  for(var sProp in oObject){
    /* Filtramos las propieades que sean metodos del object */
    if(oObject[sProp] instanceof Function) continue;
    var oObj = oObject[sProp];
    if(oClass != undefined || oClass != null){
      oObj = new oClass();
      oObj.copyFromObject(oObject[sProp]);
    }
    aArray.push(oObj);
  }
  return aArray;
}

function arrayToObject(aArray, sKey){
  var oObject = {};
  for(var iLength = 0; iLength < aArray.length; iLength++){
    var oObj = aArray[iLength];
    oObject[oObj[sKey]] = oObj;
  }
  return oObject;
}

function keyToUpperCase(field, evt)
{
	if (document.all){
		var c = event.keyCode;
		if (String.fromCharCode(c) == "'" || String.fromCharCode(c) == '"'){
			alert("The character you have entered is not valid for this field")
			return false;
		}else{
			var C = String.fromCharCode(c).toUpperCase().charCodeAt();
			event.keyCode = C;
			return true;
		}
	}else{ 
		return true;
	}	
}

function CompareDateTime(sDate, iTime, oDate, sType){
  if(oDate == undefined || oDate == null){
    var oDate = new Date();
  }
  if(sType == undefined || sType == null){
    sType = '<=';
  }
  var aDate = sDate.split('/');
  if(aDate.length != 3) return false;
  var iHour     = parseFloat(iTime) % 3600;
  var iRest     = iTime - (iHour * 3600);
  var iMinutes  = iRest % 60;
  var iSeconds  = iRest - (iMinutes * 60);   

  var oFecha = new Date();
  oFecha.setFullYear(parseFloat(aDate[2]), parseFloat(aDate[1]) - 1, parseFloat(aDate[0]));
  oFecha.setHours(iHour, iMinutes, iSeconds);
  
  switch(sType){
    case "<=":
      return oFecha <= oDate;    
    break;
    case "==":
      return oFecha <= oDate;    
    break;
    case ">=":
      return oFecha <= oDate;    
    break;
    case "<":
      return oFecha <= oDate;    
    break;
    case ">":
      return oFecha <= oDate;    
    break;
    case "!=":
      return oFecha <= oDate;    
    break;
    default:
      return false;
    break;
  }
}

function _toNumbers(oObject){
  var oResult = {};
  for(var sProp in oObject){
    var oProp = oObject[sProp];
    if(oProp instanceof Function) continue;
    if(oProp instanceof Object) continue;
    if(oProp instanceof Array) continue;

    var sValue = parseFloat(oProp);
    if(isNaN(sValue))
      sValue = 0;
    oResult[sProp] = sValue;
  }
  return oResult;
}

function _getFirstElement(oDomElement){
  for(var iLength = 0; iLength < oDomElement.childNodes.length; iLength++){
    var oChildNode = oDomElement.childNodes[iLength];
    if(oChildNode.nodeType == 1){
      return oChildNode;
    }
    oChildNode = null;
  }
  return null;
}

function _getLastElement(oDomElement){
  for(var iLength = oDomElement.childNodes.length - 1; iLength >= 0; iLength--){
    var oChildNode = oDomElement.childNodes[iLength];
    if(oChildNode.nodeType == 1){
      return oChildNode;
    }
    oChildNode = null;
  }
  return null;
}

function _NodeIterator(oDomElement, lRecursive, nodeType){
  /*  Posibles valores para el argumento nodeType
      1 ELEMENT_NODE 
      2 ATTRIBUTE_NODE 
      3 TEXT_NODE 
      4 CDATA_SECTION_NODE 
      5 ENTITY_REFERENCE_NODE 
      6 ENTITY_NODE 
      7 PROCESSING_INSTRUCTION_NODE 
      8 COMMENT_NODE 
      9 DOCUMENT_NODE 
      10 DOCUMENT_TYPE_NODE 
      11 DOCUMENT_FRAGMENT_NODE 
      12 NOTATION_NODE */
  var self              = this;
  
  if(lRecursive == undefined || lRecursive == null){
    lRecursive = true;
  }

  this.nodeType         = nodeType
  this.recursive        = lRecursive;
  this.domElement       = oDomElement;
  this.elements         = [];
  this.current          = 0;

  this.nextNode         = _nextNode;
  this.prevNode         = _prevNode;
  this.hasNext          = _hasNext;
  this.hasPrev          = _hasNext;

  _indexNode(self.domElement, self.nodeType);

  function _indexNode(oNode, iNodeType){
    for(var iLength = 0; iLength < oNode.childNodes.length; iLength++){
      var oChildNode = oNode.childNodes[iLength];
      if(iNodeType != undefined && iNodeType != null){
        if(oChildNode.nodeType != iNodeType){
          oChildNode = null;
          continue;
        }
      }
      self.elements.push(oChildNode);
      if(self.recursive)
        _indexNode(oChildNode, iNodeType);
      oChildNode = null;
    }
  }

  function _hasNext(){
    return (self.current <= self.elements.length - 1);
  }

  function _hasPrev(){
    return (self.current > 0);
  }

  function _nextNode(){
    if(self.current > self.elements.length - 1){
      self.current = 0;
      return null;
    }
    return self.elements[self.current++];
  }

  function _prevNode(){
    if(self.current <= 0){
      self.current = self.elements.length -1;
      return null;
    }
    return self.elements[self.current--];
  }
}

function _addEventListener(oDomElement, sEventName, fFunction){
  if(oDomElement.addEventListener){
    oDomElement.addEventListener(sEventName, fFunction, false);
    return;
  }
  if(oDomElement.attachEvent){
    oDomElement.attachEvent("on" + sEventName, fFunction);
    return;
  }
}

function _removeEventListener(oDomElement, sEventName, fFunction){
  if(oDomElement.removeEventListener){
    oDomElement.removeEventListener(sEventName, fFunction, false);
    return;
  }
  if(oDomElement.detachEvent){
    oDomElement.detachEvent("on" + sEventName, fFunction);
    return;
  }
}

function _getEvent(oEvent){
  var oEvt = oEvent;
  if(oEvt == undefined || oEvt == null)
    oEvt = window.event;
  if(oEvt.target)
    oEvt.srcElement = oEvt.target;
  if(oEvt.which)
    oEvt.keyCode = oEvt.which;
  return oEvt;
}

function _removeElement(oDomElement, lRecursive){
  if(oDomElement.removeNode){
    return oDomElement.removeNode(lRecursive);
  }
  return oDomElement.parentNode.removeChild(oDomElement);
}

function _getElementValue(oDomElement){
  if(oDomElement.text)
    return oDomElement.text;
  if(oDomElement.nodeType == 3){
    return oDomElement.nodeValue;
  }
  if(oDomElement.childNodes.length == 0)
    return "";
  return oDomElement.childNodes[0].nodeValue;
}
function _getElements(oTable, sTagName){
  var aCells = [];
  var oIterator = new cmcom.utils.NodeIterator(oTable);
  for(;oIterator.hasNext();){
    oNode = oIterator.nextNode();
    if(oNode.tagName == sTagName)
      aCells.push(oNode);
  }
  return aCells;
}
function _fireEvent(oDomElement, sEvent){
  if(oDomElement.fireEvent)
    return oDomElement.fireEvent('on' + sEvent);
    
  var oEvent = document.createEvent("HTMLEvents")
  oEvent.initEvent(sEvent, true, true)
  return oDomElement.dispatchEvent(oEvent);
}

var cmcom = {
              utils:{
                      NodeIterator:_NodeIterator,
                      getFirstElement:_getFirstElement,
                      getLastElement:_getLastElement,
                      extendObject:extendObject,
                      removeElement:_removeElement,
                      getElementValue:_getElementValue
                    },
              event:{
                      addEventListener:_addEventListener,
                      removeEventListener:_removeEventListener,
                      getEvent:_getEvent,
                      fireEvent:_fireEvent
              },
              table:{
                      getElements:_getElements
              }
            };


