/* ****************************************************************************
Copyright 2005,
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
**************************************************************************** */

/* ****************************************************************************
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'){
                  oWidget.elements[i].checked = true;
                }
              break;
              case "decimal":
              case "integer":
                if(oWidget.elements[i].setValue)
                  oWidget.elements[i].setValue(oRef);
                else
                  oWidget.elements[i].value = oRef;
              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){
  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.innerHTML = "";
      var sField = oWidget.field;
      var sFieldValue = oWidget.fieldvalue;
      for(var i = 0; i < this.length; i++){
        var oOption = document.createElement("OPTION");
        oOption.innerText = this[i][sField];
        oOption.value = this[i][sFieldValue];
        oOption.object = this[i];
        oWidget.appendChild(oOption);
      }
    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(){
  if(sHTMLMessageBox != undefined){
    var oMsg = document.createElement("DIV");
    oMsg.innerHTML = sHTMLMessageBox;
    document.body.appendChild(oMsg);  
  }
  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){
    window.debug = new cDebugger(bDebugEnable);
  }
}

function scrollMessage(){
  oMsgBox = document.getElementById('messageBox');
  if (oMsgBox){
    window.status = document.body.scrollTop;
    oMsgBox.style.top = document.body.scrollTop + parseInt((document.body.offsetHeight) / 3);
  }
}

function messageBox(sMessage, bDisplay){
  oMsgBox = document.getElementById('messageBox');
  if (oMsgBox == null){return;}
  if (bDisplay){
    if (oMsgBox){
      var oMsg = document.getElementById('messageArea');
      oMsgBox.style.position = "absolute";
      oMsgBox.style.left = parseInt((document.body.offsetWidth - 396) / 2);
      oMsgBox.style.top = document.body.scrollTop + parseInt((document.body.offsetHeight) / 3);
      oMsgBox.style.width = "396px";
      oMsg.innerText = sMessage;
      oMsgBox.style.display = "";
      //document.body.attachEvent("onscroll", scrollMessage);
      //document.body.attachEvent("onmousewheel", scrollMessage);
    }else{
      alert("Espere un momento por favor...\nEstamos realizando la solicitud");
    }
  }else{
    if (oMsgBox){
      oMsgBox.style.display = "none";
      document.body.detachEvent("onscroll", scrollMessage);
      document.body.detachEvent("onmousewheel", scrollMessage);
    }
  }
//   if (bDisplay){
//     window.hide(app.content.id);
//     window.show(app.loading);    
//   }else{
//     window.hide(app.loading);
//     window.show(app.content.id);
//   }
}

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 _FormEnable(){
  for(var i = 0; i < this.elements.length; i++){
    this.elements[i].disabled = false;
  }
}

function _FormDisable(){
  for(var i = 0; i < this.elements.length; i++){
    if (this.elements[i].disableStatus == undefined) {
      this.elements[i].disableStatus = true;
    }
    this.elements[i].disabled = this.elements[i].disableStatus;
  }
}

function _TableDeleteRange(to, from){
  if (from == undefined) {from = this.rows.length;}
  if (from > this.rows.length) {from = this.rows.length;}
  for(var i = from; i > to; i--){
    this.deleteRow(i - 1);
  }
}

function _TableFromObject(oObject, clickhandler){
  var aField = new Array();
  try{
    sField = this.getAttribute('fields');
    if(sField == "" || sField == null){
      var o = oObject[0];
      for(var i in o){
        if(typeof(o[i]) == "function"){continue;}
        aField.push(i);
      }
      sField = aField.join(',');
    }
    for(var i = 0; i < oObject.length; i++){
      var oRow = this.insertRow();
      oRow.className = "row" + ((i%2) + 1);
      oRow.style.cursor = "hand";
      oRow.attachEvent("onclick", clickhandler)
      var o = oObject[i];
      for(j in o){
        if(o[j] == undefined){continue;}
        if(typeof(o[j]) == "function"){continue;}
        if (sField.indexOf(j) != -1){
          var oCell = oRow.insertCell();
          oCell.innerText = o[j];
        }
        oRow[j] = o[j];
      }
    }

  }catch(e){
    alert(e.message);
  }
}

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 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 = '<span id="con_' + sName + '"><select class="selectField" name="mes' + sName + '" onclick="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 + '\');">';
  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 + '\');">';
  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;"></span>';
  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){
  debugStartGroup("Estableciendo Fecha " + sName + " " + sValue);
  oDia = document.getElementById('dia' + sName);
  if (oDia == null){
    debugMessage("Dia no encontrado");
    debugStopGroup();
    return;
  }
  oMes = document.getElementById('mes' + sName);
  if (oMes == null){
    debugMessage("Mes no encontrado");
    debugStopGroup();
    return;
  }
  oAnio = document.getElementById('anio' + sName);
  if (oAnio == null){
    debugMessage("Año no encontrado");
    debugStopGroup();
    return;
  }

  var aValue = sValue.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]);
  debugGroup("Valores Fecha ", aValue);
  updateDate(sName);
  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 no encontrado");
    return;
  }

  if (oDia.value != "-1" && oMes.value != "-1" && oAnio.value != "-1"){
    debugMessage("Estableciendo " + oAnio.value + ": " + oMes.value + ":" + parseFloat(oMes.value));   
    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 cHora(sName){
  var sHora = '<input type="hidden" name="' + sName + '">';
  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="0">A.M.</option>';
  sHora += '<option value="1">P.M.</option>';
  sHora += '</select>';
  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 = -1;
    oMinutos.value = -1;
    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;
Object.prototype.compareDate = _compareDate;

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(){
  var oEl = window.event.srcElement;
  debugMessage(oEl.script + ":" + oEl.readyState);  

  if(oEl.readyState == "loaded" || oEl.readyState == "complete"){
    if(oEl.callback != null || oEl.callback != undefined){
      //if(oEl.notified == undefined || oEl.notified == false){
        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.src = sPath + sScript.replace(/\./g, "/") + ".js";
  document.getElementsByTagName('head')[0].appendChild(oScript);
  return oScript;
}

function loadStyle(sStyle){
  var oStyle = document.createElement('<LINK href="' + sStyle + '" rel="stylesheet" type="text/css">');  
  document.getElementsByTagName('head')[0].appendChild(oStyle);
}

function changeTime(){
  var oTime = document.getElementById('app_fecha_hora');
  if(oTime){
    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:';} 
    oTime.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.');    
  }
  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]);
  }
}
