/*----------------------------------------------------------------------------*/
/* File:           UTIL.JS                                                    */
/* Description:    JavaScript routines used with permission from the authors  */
/* Author:         Alvaro José Agámez Licha (AAL)                             */
/* Date:           Jan.01/2006                                                */
/* Last Modified:  May.29/2008                                                */
/* Version:        1.0                                                        */
/* Copyright (c), 2006, 2008 Alvaro José Agámez Licha                         */
/*----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
 History
 Jan.01/2006 AAL  File Created.
------------------------------------------------------------------------------*/

// Colección (Constante) que almacena el número de días de cada mes del año
var MONTHDAYS = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var Util = function() {}
Util.Date = function() {}
Util.Random = function() {}
Util.Object = function() {}
Util.Text = function() {}

Util.IsNumeric = function(strValue)
{
  var strNumericPattern = /\d+/;

  try
  {
    if(strNumericPattern.test(strValue))
    {
      return(true);      
    }
    else
    {
      return(false);
    }
  }
  catch(Exception)
  {
    return(false);
  }  
}

Util.IsAlpha = function(strValue)
{
  var strAlphaPattern = /^[a-zA-Z]+$/;

  try
  {
    if(strAlphaPattern.test(strValue))
    {
      return(true);      
    }
    else
    {
      return(false);
    }
  }
  catch(Exception)
  {
    return(false);
  }  
}

Util.IsAlnum = function(strValue)
{
  var strAlnumPattern = /^[a-zA-z0-9]+$/;

  try
  {
    if(strAlnumPattern.test(strValue))
    {
      return(true);      
    }
    else
    {
      return(false);
    }
  }
  catch(Exception)
  {
    return(false);
  }  
}

Util.IsEmail = function(strValue)
{
  var strEmailPattern = /(^[0-9a-zA-Z]+(?:[._][0-9a-zA-Z]+)*)@([0-9a-zA-Z]+(?:[._-][0-9a-zA-Z]+)*\.[0-9a-zA-Z]{2,3})$/;

  try
  {
    if(strEmailPattern.test(strValue))
    {
      return(true);      
    }
    else
    {
      return(false);
    }
  }
  catch(Exception)
  {
    // Lanzar un error en este punto
    alert("ERROR: " + Exception);
    return(false);
  }  
}

/**
 * Calcula un número aleatorio entre un rango de número pasado como parámtro
 * @param Integer intBegin Inicio del rango
 * @param Integer intEnd Final del rango
 * @return Integer Número Aleatorio
 * @see Math.random()
 */
Util.Random.Generate = function(intBegin, intEnd)
{
  if(intBegin != undefined && intEnd != undefined)
  {
    return(Math.round(Math.random()*(intEnd-intBegin)+intBegin));
  }
  else
  {
    return(Math.random());
  }
}

Util.ZeroFormat = function(intNumber, intNumberZeros)
{
  var intIndex, strFormat = "";

  for(intIndex = 1; intIndex<=intNumberZeros; intIndex++)
  {    
    strFormat += "0";
  }

  return(strFormat += intNumber);
}

// MEJORAR ESTA FUNCIÓN USANDO EXPRESIONES REGULARES (?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))
// Agrega el punto de miles a un número pasado como parámetro
Util.AddDots = function(intNumber)
{
  intNumber = Util.Number.RemoveDots(intNumber);
  if(intNumber.length >= 4)
  {
    intNumber = Util.Number.AddDots(intNumber.substring(0, ((intNumber.length - 2) - 1))) + "." + intNumber.substring(((intNumber.length - 2) - 1), intNumber.length);
  }

  return(intNumber);
}

// MEJORAR ESTA FUNCIÓN USANDO EXPRESIONES REGULARES
Util.RemoveDots = function(intNumber)
{
  intNumber = String(intNumber).replace(/,/g, "");

  // Quitar todos los Puntos que existan en la cadena
  while(intNumber.indexOf(".") != -1)
  {
    intNumber = intNumber.replace('.', "");
  }

  intNumber = intNumber.replace("$", "");

  return(intNumber);
}

// MEJORAR ESTA FUNCIÓN USANDO EXPRESIONES REGULARES ^[ \t]+|[ \t]+$
Util.Trim = function()
{
  return(this.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, ""));
}

Util.Date.Format = function(dtmDate, strFormat)
{
  var strFormato = "";

  strFormato = strFormat.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/gi,
    function($1)
    {
      switch ($1.toLowerCase())
      {
        case 'yyyy': return dtmDate.getFullYear();
        case 'mmmm': return strMonthNames[dtmDate.getMonth()];
        case 'mmm':  return strMonthNames[dtmDate.getMonth()].substr(0, 3);
        case 'mm':   return Util.Number.ZeroFormat((dtmDate.getMonth() + 1), 1);
        case 'dddd': return strWeekDays[dtmDate.getDay()];
        case 'ddd':  return strWeekDays[dtmDate.getDay()].substr(0, 3);
        case 'dd':   return dtmDate.getDate();
        case 'hh':   return ((h = dtmDated.getHours() % 12) ? h : 12);
        case 'nn':   return dtmDate.getMinutes();
        case 'ss':   return dtmDate.getSeconds();
        case 'a/p':  return dtmDate.getHours() < 12 ? 'a' : 'p';
        default: return("");
      }
    }
  );
  return(strFormato);
}

Util.Date.GetLastMonthDay = function(intMonth)
{
  intMonth = Number(intMonth);
  return(MONTHDAYS[intMonth]);
}

Util.Object.CreateElement = function(strTag, strName)
{
	try
	{
		var objElement = document.createElement('<' + strTag + ' name="' + strName + '">');
	}
	catch(e)
	{
		var objElement = document.createElement(strTag);
		objElement.name = strName;
	}
	return(objElement);
}

Util.Object.Left = function(objObject)
{
  var intLeft = 0;

  if (objObject.offsetParent)
  {
    while (objObject.offsetParent)
    {
      intLeft += objObject.offsetLeft
      objObject = objObject.offsetParent;
    }
  }
  else 
  {
    if (objObject.x)
    {
      intLeft += objObject.x;
    }
  }

  return(intLeft);
}

Util.Object.Top = function(objObject)
{
  var intTop = 0;

  if (objObject.offsetParent)
  {
    while (objObject.offsetParent)
    {
      intTop += objObject.offsetTop
      objObject = objObject.offsetParent;
    }
  }
  else
  {
    if (objObject.y)
    {
      intTop += objObject.y;
    }
  }

  return(intTop);
}

Util.Object.Height = function(objObject)
{
  return(objObject.offsetHeight);
}

Util.Object.Width = function(objObject)
{
  return(objObject.clientWidth);
}

Util.Object.Toggle = function(strIdentificator, bolCenter)
{
	var objElement = document.getElementById(strIdentificator);

	if(objElement.style.display == "none")
	{
		objElement.style.display = "block";
	}
	else
	{	
		objElement.style.display = "none";
	}

	if(bolCenter)
	{
		objElement.style.top = ((document.body.clientHeight / 2) - (Util.Object.Height(objElement) / 2)) + "px";
		objElement.style.left = ((document.body.clientWidth / 2) - (Util.Object.Width(objElement) / 2)) + "px";
	}
}

Util.Text.Maxlength = function(objObject, intMaxLength)
{
	if(objObject.value.length > intMaxLength)
	{
		objObject.value = objObject.value.substring(0, (intMaxLength - 0));
		return(false);
	}
}