//===========================================================
//Constantes globales
//===========================================================

var _NUMERIC  = 1;
var _DATE     = 2;
var _STRING   = 3;
var _EMAIL    = 4;

//===========================================================
//Funciones de uso común para el manejo de inputs tipo select
//===========================================================


/*******************************************************
Regresa el valor del (primer) elemento seleccionado.
*******************************************************/
function getSelectedValue(combo){
  if(combo.selectedIndex >= 0)
    return combo.options[combo.selectedIndex].value;
  else
    return null;
}
  

/*******************************************************
Regresa una lista separada por comas con los valores de
todos los elementos seleccionados.
*******************************************************/
function getSelectedList(combo){
  var i, res = "";
  for(i=0; i < combo.length; i++)
    if(combo.options[i].selected) res = res + combo.options[i].value + ",";
  return res.substring(0,res.length-1);
}
  

/*******************************************************
Regresa la cantidad de elementos seleccionados.
*******************************************************/
function getSelectedCount(combo){
  var i,j = 0;
  for(i=0; i < combo.length; i++)
    if(combo.options[i].selected) j++;
  return j;
}
  
  
/*******************************************************
Regresa una lista separada por comas con los valores de
todos los elementos cuyo valor y descripción no esten
vacios (no importa si hay o no elementos seleccionados).
*******************************************************/
function getNotEmptyList(combo){
  var i, res = "";
  for(i=0; i < combo.length; i++)
    if(combo.options[i].value > 0) res = res + combo.options[i].value + ",";
  return res.substring(0,res.length-1);
}
  

/*********************************************************
Regresa la cantidad de elementos cuyo valor y descripcion
no estan vacios.
*********************************************************/
function getNotEmptyCount(combo){
  var i,j = 0;
  for(i=0; i < combo.length; i++)
    if(combo.options[i].value > 0) j++;
  return j;
}



//==================================================================
//Funciones comunes de validación de datos.
//==================================================================

/******************************************************
Verifica que "val" sea un dato numérico.
******************************************************/
function isNumeric(val){
  return !isNaN(val);
}


/******************************************************
Verifica que "dtmDate" sea una representación válida de
una fecha en el formato yyyy/mm/dd
*******************************************************/
function isDate(dtmDate){
  var dd,mm,yy,idd,imm,iyy,sf,format;
  var Args = isDate.arguments;
  var dias = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  if(Args.length > 0)
    format = Args[1];
  else
    format = GetDateFormat();
  sf = dtmDate;
  yy = sf.substring(0,sf.indexOf("/"));
  mm = sf.substring(sf.indexOf("/")+1,sf.lastIndexOf("/"));
  dd = sf.substring(sf.lastIndexOf("/")+1,sf.length);
  idd = parseInt(dd,10);
  imm = parseInt(mm,10);
  iyy = parseInt(yy,10);
  if(isNaN(idd) || isNaN(imm) || isNaN(iyy)) return false;
  if(yy.length != 4) return false;
  if((iyy % 400) == 0)
     dias[2] = 29;
  else
    if((iyy % 4 == 0) && (iyy % 100 != 0)) dias[2] = 29;
  if(mm.length > 2) return false;
  if(imm < 1 || imm > 12) return false;
  if(dd.length > 2) return false;
  if(idd < 1 || idd > dias[imm-1]) return false;
  return true;
}


/**********************************************************
Reemplaza todas las ocurrencias de "searchfor" en "str" con
"replacewith"
**********************************************************/
function replace(str,searchfor,replacewith){
  var s, i;
  s = str;
  i = s.indexOf(searchfor);
  while(i>=0){
    s = s.substring(0,i) + replacewith + s.substring(i+searchfor.length,s.length);
    i = s.indexOf(searchfor);
  }
  return s;
}


/*************************************************************
Reemplaza los caracteres CRLF, "'" y """ con |, ´ y ´´ respectiva-
mente. Estos caracteres suelen provocar errores al ejecutar
querys a una base de datos. 
Las ocurrencias de |, ´ y ´´ que el usuario hubiera
tecleado premeditadamente, serán reemplazadas.
*************************************************************/
function EncodeText(val){
  var str
  str = replace(val, "\x0D\x0A", "|");
  str = replace(str, "'", "´");
  str = replace(str, "\"", "´´");
  return str;
}


/*************************************************************
Invierte el proceso realizado por EncodeText.
*************************************************************/
function DecodeText(val){
  var str
  str = replace(val, "|", "\x0D\x0A");
  str = replace(str, "´", "'");
  str = replace(str, "´´", "\"");
  return str;
}

  
/*************************************************************
Reemplaza todos los caracteres alfabéticos de str, excepto el
punto "."
*************************************************************/  
function surpChars(str){
  var i, c, res='', orig = new String(str);
  for(i=0; i <= orig.length-1; i++) {
    c = orig.charAt(i);
    if((c >= '0' && c <= '9') || c == '.') res = res + c;
  }
  return res;
}



//=============================================================
//Manejadores de eventos genericos para validación de formas
//=============================================================

/******************************************************************
EditChange.  Manejador del evento onchange o onkeypress de un
input tipo text que sólo admite cierto tipo de dato, ya sea numerico,
fechas o texto libre. Avisa inmediatamente al usuario y lo instruye
para corregir el error.

Los parámetros corresponden al objeto que genera el evento (generalmente
se usará this) y el tipo de dato que debe validarse (cualquiera de las
constantes definidas en esta libreria: _NUMERIC, _DATE, _EMAIL, _STRING).
*******************************************************************/
var _EditControls = new Array();

function EditControl(sender, dttype, caption, nullable)
{
  this.Sender = sender;
  this.dtType = dttype;
  this.Caption = caption;
  this.Nullable = nullable;
}

function AddControl(sender, dttype, caption, nullable)
{
  _EditControls[_EditControls.length] = new EditControl(sender, dttype, caption, nullable);
}

function GetControl(sender){
  var i;
  for(i=0; i < _EditControls.length; i++)
    if(_EditControls[i].Sender == sender.name) return _EditControls[i];
  return null;
}

function _EditChange(sender){
  alert(sender);
}

function EditChange(sender){
  var i, control;
  alert(sender);
  if(sender != null)
  {
    control = GetControl(sender);
    alert(control);
    if(control == null) return Error("El control " + sender.name + " no ha sido agregado a la lista.");
    switch(control.dtType)
    {
     case _NUMERIC:
        if(document.forma[control.Sender].value == "" && !control.Nullable)
          return Error("El campo \"" + control.Caption + "\" no debe estar vacio.");
        else
          if(sender.value != "" && !isNumeric(sender.value))
            return Error("El campo \"" + control.Caption + "\" sólo admite datos numéricos.");
        break;
     case _DATE:
        if(sender.value == "/0/" && !control.Nullable)
          return Error("El campo \"" + control.Caption + "\" no debe estar vacio.");
        else
          if(sender.value != "/0/" && !isDate(sender.value))
            return Error("El campo \"" + control.Caption + "\" sólo admite fechas en el formato dd mm yyyy.");
        break;
     case _STRING:
       if(sender.value == "" && !control.Nullable)
         return Error("El campo \"" + control.Caption + "\" no debe estar vacio.");
       break;
     case _EMAIL:
       {
         var str = sender.value;
         if(sender.value == "" && !control.Nullable)
           return Error("El campo \"" + control.Caption + "\" no debe estar vacio.");
         else
           if(sender.value != "" &&  !(str.indexOf("@") > 0 && str.indexOf("@") < str.length-1 && str.length > 2))
             return Error("El campo \"" + control.Caption + "\" no es válido.");
       }
    }
  }
  else
  {
    for(i=0; i < _EditControls.length; i++)
      if(!EditChange(_EditControls[i].Sender)) return false;
  }
  return true;
}

function Error(msg)
{
  alert(msg);
  return false;
}
