

// Expresiones regulares

var whitespace= " \t\n\r"
var white= /[\b]|\b/
var reWhitespace = /^\s+$/

// ************ Lista de mensajes de error
var eVacio="Debe introducir un valor.";
var eNumerico="Debe introducir un valor numérico entero.";
var eNumericoReal="Debe introducir un valor numérico real.";
var eNumericoRealPositivo="Debe introducir un valor numérico real positivo.";
var eTexto="Debe introducir una cadena de texo.";
var ePassword="Debe introducir una cadena con formato alfanumérico, y con un mínimo de 5 caracteres y un máximo de 10 caracteres.";
var eFecha="Debe introducir una fecha (dd/mm/yyyy).";
var eHora="Debe introducir una hora (hh:mm:ss o hh:mm).";
var eEmail="Debe introducir una dirección de correo e-mail.";
var eZip="Debe introducir un código Postal.";
var eTlfno="Debe introducir un número de teléfono.";
var eNIF="Debe introducir un N.I.F.";
var eCIF="Debe introducir un C.I.F.";
var eLongitud="Se ha superado la longituda máxima permitida.";
var eLongAnexo="El tamaño del añexo debe ser inferior a 1MB.";
var eCombo="Debe seleccionar un valor en el combo"

var ePreCustom="Introdujo un formato no válido en el campo ";
var ePostCustom="\nEl formato correcto es ";
var ePostCustom2="\n\t donde # es un número \n\t       ? es una letra \n\t       ! es un número o una letra \n\t       y * es cualquier carácter.";

function check()
{
   return valida_c( true );
}

function checkss()
{
   return valida_c( false );  	// sin hacer submit
}

function valida_c( bsubmit )
{
var res;  // respuesta de la función

var anexo=/(\d)*_a_/;       // Validación de longitud máxima en anexos
var email=/(\d)*_e_/;       // validación de campos de email
var cadena=/(\d)*_c_/;      // validación de texto (cadenas)
var numerico=/(\d)*_n_/;    // validación de campos numéricos sin decimal
var real=/(\d)*_r_/;        // validación de campos numéricos con decimal
var realpositivo=/(\d)*_rp_/;        // validación de campos numéricos positivos con decimal
var blancos=/(\d)*_b_/;     // Eliminación de espacios en blanco al inicio
var vacio=/(\d)*_v_/;       // Detección de campos vacios
var zip=/(\d)*_z_/;         // Detección de ZIP
var tlf=/(\d)*_t_/;         // Detección de TLF
var nif=/(\d)*_nif_/;       // Detección de nif
var cif=/(\d)*_cif_/;       // Detección de cif
var fecha=/(\d)*_f_/;       // Detección de fechas
var hora=/(\d)*_h_/;        // Detección de horas
var password=/(\d)*_p_/;    // validación campos de password
var combo=/(\d)*_cb_/;


var i=0;         //   indice de elementos
var j=0;         //   indice para los formularios
var texto;       //   Almacena el campo value del elemento actualmente referenciado
var validar;     //   Almacena el valor del campo validar del objeto actual, este campo indica el tipo de
                 //   comprobación al que se va a someter el campo
var decimales;   //   nuevo atributo para el campo, que indica el número de decimales del float.
                 //   Asociado a _r_
var longitud;    //   Máxima longitud para los campos TEXTAREA

var nombre;      //   almacena la propiedad 'nombre' del campo
var name;        //   almacena la propiedad 'name' del campo
var nombreCampo; //   almacena uno de los dos anteriores
var mensaje="";  //   Almacena los mensajes de error que se visualizarán
var error="";    //   Indica si en el campo actual se ha detectado algún error
var cadError="";


while (document.forms[j])
{
  i=0;
  while (document.forms[j].elements[i])
  {
    texto = document.forms[j].elements[i].value;
    if( texto != null && texto.length > 0 && stripWhitespace( texto ) == "" ){
       document.forms[j].elements[i].value = "";
    }
    
    /*if(texto != null) {

        texto2 = xml(texto);
        document.forms[j].elements[i].value = texto2;

    }*/

    validar = document.forms[j].elements[i].validar;
    texto = document.forms[j].elements[i].value;
    nombre = document.forms[j].elements[i].nombre;
    name = document.forms[j].elements[i].name;
    disabled = document.forms[j].elements[i].disabled;

    if( nombre )
       nombreCampo = nombre;
    else
       nombreCampo = name;

    if (validar)
    {
      // Comprobaciones

      if (vacio.exec(validar))          // Detección de campos vacios
      {
         if(isWhitespace(texto))
         {
            error="error"
            cadError = nombreCampo + ": " + eVacio
         }
      }

      if( error == "" && !texto=="" )
      {

         if (blancos.exec(validar))          // Eliminación de espacios en blanco iniciales
         {
            document.forms[j].elements[i].value=stripInitialWhitespace(texto);
         }

         if (anexo.exec(validar))
         {

	         if(!isWhitespace(texto))       // Si es vacio no chequeo
	         {

				if(isAnexoBadLong(texto))
	               {
	                  error="error";
	                  cadError= nombreCampo +": " + eLongAnexo;
	               }
	          }
         }


         if (cadena.exec(validar))          // Campo de texto
         {
            if (!isCadena(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eTexto;
            }
            else {
               longitud = document.forms[j].elements[i].longitud;
               if( texto.length > longitud )
               {
                  error="error";
                  cadError= nombreCampo +": " + eLongitud;
               }
            }
         }

         if (realpositivo.exec(validar))    // Campo numerico positivo con decimales (real)
         {
            texto = stripWhitespace( texto );
            decimales = document.forms[j].elements[i].decimales;
            if( isNumeric(decimales) )
            {
               if (!isRealDecPositivo(texto, decimales))
               {
                  error="error"
                  cadError = nombreCampo + ": " + eNumericoRealPositivo + " (máx. " + decimales + " decimales)";
               }
            }
            else {

               if (!isRealPositivo(texto))
               {
                  error="error"
                  cadError = nombreCampo + ": " + eNumericoRealPositivo;
               }
            }
         }

         if (real.exec(validar))          // Campo numerico con decimales (real)
         {
            texto = stripWhitespace( texto );
            decimales = document.forms[j].elements[i].decimales;
            if( isNumeric(decimales) )
            {
               if (!isRealDec(texto, decimales))
               {
                  error="error"
                  cadError = nombreCampo + ": " + eNumericoReal + " (máx. " + decimales + " decimales)";
               }
            }
            else {
               if (!isReal(texto))
               {
                  error="error"
                  cadError = nombreCampo + ": " + eNumericoReal;
               }
            }
         }

         if (password.exec(validar))          // Campo password
         {
            if (!isPassword(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + ePassword
            }
         }

         if (fecha.exec(validar))          // Campo de fecha
         {
            texto = stripWhitespace( texto );
            if (!isFecha(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eFecha
            }
         }

         if (hora.exec(validar))          // Campo de hora
         {
            texto = stripWhitespace( texto );
            if (!isHora(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eHora
            }
         }

         if (email.exec(validar))          // Campo de email
         {
            texto = stripWhitespace( texto );
            if (!isEmail(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eEmail
            }
         }

         if (numerico.exec(validar))          // Detección de campos numéricos
         {
            texto = stripWhitespace( texto );
            if (!isNumeric(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eNumerico
            }
         }

         if (zip.exec(validar))          // Detección de ZIP
         {
            texto = stripWhitespace( texto );
            if (!isZip(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eZip
            }
         }

         if (tlf.exec(validar))          // Detección de número de Tlf
         {
            texto = stripWhitespace( texto );
            if (!isTlf(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eTlfno
            }
         }

         if (nif.exec(validar))          // Detección de NIF
         {
            texto = stripWhitespace( texto );
            if (!isNif(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eNIF
            }
         }

         if (cif.exec(validar))           // Detección de CIF
         {
            texto = stripWhitespace( texto );
            if (!isCif(texto))
            {
               error="error"
               cadError = nombreCampo + ": " + eCIF
            }
         }
         if (combo.exec(validar))
         {
         	if( (texto=="0" || texto==null) && !disabled)
         	{
         		error="error"
         		cadError = nombreCampo + ": " + eCombo
         	}
         }
      }

      // si se ha detectado un error en algún lado se saca el msg de error especificado en el campo

      if (error=="error") {
         mensaje = mensaje  + cadError + "\n"
         error=""
         cadError=""
      }
    }

    i=i+1
  }
  j=j+1
}

if (!mensaje=="") {
  mensaje="Se han encontrado los siguientes errores en los campos del formulario:  \n \n" + mensaje;
  alert(mensaje);
  res = false;
}
else {
   res = true;
   if( bsubmit==true ) {
      j=0;
      while (document.forms[j])
      {
      	
	i=0;
	/*
  	while (document.forms[j].elements[i])
  	{
		texto = document.forms[j].elements[i].value;
		if(texto != null) 
		{
		        texto2 = xml(texto);
        		document.forms[j].elements[i].value = texto2;
    		}
		i++;
	}*/
/*
while (document.forms[j])
{
  i=0;
  while (document.forms[j].elements[i])
*/
         document.forms[j].submit();
         j = j + 1;
      }
    }
 }

 return res;
}


function isAnexoBadLong(s)
{
 var fso, f;
 fso = new ActiveXObject("Scripting.FileSystemObject");
 f = fso.GetFile(s);
 return (f.size>1000000);
}


function isWhitespace(s)
{
   return( isEmpty(s) || reWhitespace.test(s) )
}

function isEmpty(s)
{
   return ((s==null)||(s.length ==0));
}

function charInString (c, s)
{
    for (i = 0; i < s.length; i++)
    {
       if (s.charAt(i) == c) return true;
    }
    return false
}

function stripWhitespace(s)
{
   if( s.length > 0 ) {
      s = stripFinalWhitespace( s );
      s = stripInitialWhitespace( s );
   }

   return s;
}




function xml(s)


{
    var aux = s;

    pos = aux.indexOf("&");


    while( pos != -1 ) {

	if (aux.substring(pos,pos+5)!='&amp;'){
       		aux = aux.substring(0, pos) + "&amp;" + aux.substring(pos + 1, aux.length);
	}
       		pos = aux.indexOf("&", pos + 1);
    }

    while( aux.indexOf("'") != -1) {
       aux = aux.replace("'","&apos;");
    }

    while( aux.indexOf('<') != -1) {
       aux = aux.replace('<', '&lt;');
    }

    while( aux.indexOf('>') != -1) {
       aux = aux.replace('>','&gt;');
    }


    return aux;
}

	

function stripFinalWhitespace (s)
{
    var i = s.length - 1;

    while ((i > 0) && charInString (s.charAt(i), whitespace))
       i--;

    return s.substring (0, i + 1);
}

function stripInitialWhitespace (s)
{
    var i = 0;

    while ((i < s.length) && charInString (s.charAt(i), whitespace))
       i++;

    return s.substring (i, s.length);
}

function isEmail (email)
{
   var reEmail;
   reEmail = /^[A-Za-z0-9_]+\.{0,1}[A-Za-z0-9_]+\@[A-Za-z0-9_]+\.[A-Za-z0-9_]+/;
   return reEmail.test(email);
}

function isZip(s)
{
   return (s.length==5)&&(isNumeric(s));
}

function isTlf(s)
{
   return (s.length==13)&&(isAlfaNumeric(s));
}

function isAlfaNumeric(s)
{
   var alfaNum=/^[A-NO-Za-no-z0-9]*$/;
   return alfaNum.test(s);
}


function isNif(s)
{
   var n_nif=/^[0-9]{8}[A-Za-z]$/;
   return n_nif.test(s);
}

function isCif(s)
{
   var c_cif=/^[A-Za-z][0-9]{8}$/;
   return c_cif.test(s);
}

function isCadena(s)
{
   var cad = /(')+/;  // caracteres excluyentes
   return !cad.test(s);
}

function isNumeric (num)
{
   var reNumeric = /^(-)?\d+$/;
   return reNumeric.test(num);
}

function isNumericPositivo (num)
{
   var reNumeric = /^\d+$/;
   return reNumeric.test(num);
}

function isReal(s)
{
   var dec = /^(-)?\d+(\.)\d+$/;

   if( dec.test(s) )
      return true;
   else
      return isNumeric(s);
}

function isRealPositivo(s)
{
   var dec = /^\d+(\.)\d+$/;
   if( dec.test(s) )
      return true;
   else
      return isNumericPositivo(s);
}

function isRealDec(s, nro_dec)
{
   if( isReal(s) )
   {
      sArray=s.split(".");
      if( sArray.length > 2 )
         return false;
      else
      {
         if( sArray.length == 2 )
         {
            var dec = sArray[1];
            if( dec.length > nro_dec )
               return false;
            else
               return true;
         }
         else
            return true;
      }
   }
   else
      return false;
}

function isRealDecPositivo(s, nro_dec)
{
   if( isRealPositivo(s) )
   {
      sArray=s.split(".");
      if( sArray.length > 2 )
         return false;
      else
      {
         if( sArray.length == 2 )
         {
            var dec = sArray[1];
            if( dec.length > nro_dec )
               return false;
            else
               return true;
         }
         else
            return true;
      }
   }
   else
      return false;
}

function isPassword(s)
{
   var passw = /^[A-Za-z0-9]{5,10}$/;
   return passw.test(s);
}


//function isFecha(s)
//{
//   var f_fecha=/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}/;
//   return(f_fecha.test(s))
//}

function isFecha(s)
{
    sArray = s.split("/")
    if ( (sArray.length < 3) || (sArray.length > 3))
        return false;
    day = sArray[0];
    month = sArray[1];
    year = sArray[2];

    if (isDate(year, month, day))
       return true;
    else
       return false;
}

var daysInMonth = new Array(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   // must programmatically check this
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

function isDate (year, month, day)
{
    if (! (isYear(year) && isMonth(month) && isDay(day))) return false;

    var intYear  = parseInt(year);
    var intMonth = parseInt(month);
    var intDay   = parseInt(day);

    if (intDay > daysInMonth[intMonth]) return false;
    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
    return true;
}

function isYear (s)
{
    if (!isNumeric(s)) return false;
    return (s.length == 4);
}

function isMonth (s)
{
   return isIntegerInRange(s, 1, 12);
}

function isDay (s)
{
   return isIntegerInRange (s, 1, 31);
}

function daysInFebruary (year)
{
    return ( ((year % 2 == 0) && (!(year % 100 == 0) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isIntegerInRange (s, a, b)
{
    if (!isNumeric(s)) return false;
    var num = Number(s);
    return ((num >= a) && (num <= b));
}

function isHora(hora)
{
    var h, m, s, haySeg = false;
    var sArray = hora.split(":")
    if ( (sArray.length < 2) || (sArray.length > 3))
        return false;

    if( sArray.length == 3 )
       haySeg = true;

    h = sArray[0];
    m = sArray[1];
    if( haySeg == true ) s = sArray[2];

    if( !isIntegerInRange(h, 0, 23) )
       return false;

    if( !isIntegerInRange(m, 0, 59) )
       return false;

    if( haySeg == true ) {
       if( !isIntegerInRange(s, 0, 59) )
          return false;
    }

    return true;
}

function comprobarVigencia(fdesde,fhasta) {
	temp1=fdesde.indexOf('/',1)
	temp2=fdesde.substring(temp1,fdesde.length)
	d1=fdesde.substring(0,temp1)
	d2=temp2.substring(1,temp2.indexOf('/',1))
	d3=temp2.substring(temp2.indexOf('/',1)+1,temp2.length)
	temp1=fhasta.indexOf('/',1)
	temp2=fhasta.substring(temp1,fhasta.length)
	dh1=fhasta.substring(0,temp1)
	dh2=temp2.substring(1,temp2.indexOf('/',1))
	dh3=temp2.substring(temp2.indexOf('/',1)+1,temp2.length)
	fecha1=d3+d2+d1
	fecha2=dh3+dh2+dh1
	if (fecha1>fecha2)
	check();
	else{
		if (fecha1.length < fecha2.length)
			alert('El formato de fecha debe ser: dd/mm/aaaa');
		else
			alert('La fecha introducida no es valida, debe ser mayor que ' + fhasta);
	}
}



	function comprobarPuja(cov, cantidadpuj, ultpuj, canmin ) {
		pujaValida = false;

				//if (document.all.item("COV").value=="true") {
				if (cov.value=="true") {
					//if (document.all.item("CANTIDADPUJ").value>0) {
					if (cantidadpuj.value>0) {
						//if ((document.all.item("CANTIDADPUJ").value < eval (eval(document.all.item("ULTPUJ").value) - eval(document.all.item("CANMIN").value))) {
						if ((cantidadpuj.value < eval (ultpuj.value) - eval(canmin.value))) {
							pujaValida = true;
							check();
						}
						else
							alert("  La puja no ha sido correcta. Debe ser inferior a la última puja en la cantidad minima indicada.");
					}
					else
							alert("  La puja no ha sido correcta. Debe introducir una cantidad superior a 0.");					
				}
				else {
					//if (((document.all.item("CANTIDADPUJ").value>eval (eval(document.all.item("CANMIN").value) + eval(document.all.item("ULTPUJ").value))) {
					if ( cantidadpuj.value > eval (eval(canmin.value) + eval(ultpuj.value) ) ) {
						pujaValida = true;
						check();	
					}
					else
						alert("  La puja no ha sido correcta. Debe ser superior a la última puja en la cantidad minima indicada");		
				}				
}
function contrasenaNoValida(){
	alert('Las contraseñas no coinciden');
}
function confirmar(){
	return confirm('Está a punto de eliminar este registro ¿Está seguro?');
}


// Calendario Inicio

var weekend = [0,6];
var weekendColor = "#e0e0e0";
var fontface = "Verdana";
var fontsize = 2;

var gNow = new Date();
var ggWinCal;
isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;

Calendar.Months = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];

// Non-Leap year Month days..
Calendar.DOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Leap year Month days..
Calendar.lDOMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function Calendar(p_item, p_WinCal, p_month, p_year, p_format) {
	if ((p_month == null) && (p_year == null))	return;

	if (p_WinCal == null)
		this.gWinCal = ggWinCal;
	else
		this.gWinCal = p_WinCal;
	
	if (p_month == null) {
		this.gMonthName = null;
		this.gMonth = null;
		this.gYearly = true;
	} else {
		this.gMonthName = Calendar.get_month(p_month);
		this.gMonth = new Number(p_month);
		this.gYearly = false;
	}

	this.gYear = p_year;
	this.gFormat = p_format;
	this.gBGColor = "white";
	this.gFGColor = "black";
	this.gTextColor = "black";
	this.gHeaderColor = "black";
	this.gReturnItem = p_item;
}

Calendar.get_month = Calendar_get_month;
Calendar.get_daysofmonth = Calendar_get_daysofmonth;
Calendar.calc_month_year = Calendar_calc_month_year;
Calendar.print = Calendar_print;

function Calendar_get_month(monthNo) {
	return Calendar.Months[monthNo];
}

function Calendar_get_daysofmonth(monthNo, p_year) {
	/* 
	Check for leap year ..
	1.Years evenly divisible by four are normally leap years, except for... 
	2.Years also evenly divisible by 100 are not leap years, except for... 
	3.Years also evenly divisible by 400 are leap years. 
	*/
	if ((p_year % 4) == 0) {
		if ((p_year % 100) == 0 && (p_year % 400) != 0)
			return Calendar.DOMonth[monthNo];
	
		return Calendar.lDOMonth[monthNo];
	} else
		return Calendar.DOMonth[monthNo];
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
	/* 
	Will return an 1-D array with 1st element being the calculated month 
	and second being the calculated year 
	after applying the month increment/decrement as specified by 'incr' parameter.
	'incr' will normally have 1/-1 to navigate thru the months.
	*/
	var ret_arr = new Array();
	
	if (incr == -1) {
		// B A C K W A R D
		if (p_Month == 0) {
			ret_arr[0] = 11;
			ret_arr[1] = parseInt(p_Year) - 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) - 1;
			ret_arr[1] = parseInt(p_Year);
		}
	} else if (incr == 1) {
		// F O R W A R D
		if (p_Month == 11) {
			ret_arr[0] = 0;
			ret_arr[1] = parseInt(p_Year) + 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) + 1;
			ret_arr[1] = parseInt(p_Year);
		}
	}
	
	return ret_arr;
}

function Calendar_print() {
	ggWinCal.print();
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
	/* 
	Will return an 1-D array with 1st element being the calculated month 
	and second being the calculated year 
	after applying the month increment/decrement as specified by 'incr' parameter.
	'incr' will normally have 1/-1 to navigate thru the months.
	*/
	var ret_arr = new Array();
	
	if (incr == -1) {
		// B A C K W A R D
		if (p_Month == 0) {
			ret_arr[0] = 11;
			ret_arr[1] = parseInt(p_Year) - 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) - 1;
			ret_arr[1] = parseInt(p_Year);
		}
	} else if (incr == 1) {
		// F O R W A R D
		if (p_Month == 11) {
			ret_arr[0] = 0;
			ret_arr[1] = parseInt(p_Year) + 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) + 1;
			ret_arr[1] = parseInt(p_Year);
		}
	}
	
	return ret_arr;
}

// This is for compatibility with Navigator 3, we have to create and discard one object before the prototype object exists.
new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
	var vCode = "";
	var vHeader_Code = "";
	var vData_Code = "";
	
	// Begin Table Drawing code here..
	vCode = vCode + "<TABLE BORDER=1 BGCOLOR=\"" + this.gBGColor + "\">";
	
	vHeader_Code = this.cal_header();
	vData_Code = this.cal_data();
	vCode = vCode + vHeader_Code + vData_Code;
	
	vCode = vCode + "</TABLE>";
	
	return vCode;
}

Calendar.prototype.show = function() {
	var vCode = "";
	
	this.gWinCal.document.open();

	// Setup the page...
	this.wwrite("<html>");
	this.wwrite("<head><title>Calendario</title>");
	this.wwrite("</head>");

	this.wwrite("<body " + 
		"link=\"" + this.gLinkColor + "\" " + 
		"vlink=\"" + this.gLinkColor + "\" " +
		"alink=\"" + this.gLinkColor + "\" " +
		"text=\"" + this.gTextColor + "\">");
	this.wwriteA("<FONT FACE='" + fontface + "' SIZE=2><B>");
	this.wwriteA(this.gMonthName + " " + this.gYear);
	this.wwriteA("</B><BR>");

	// Show navigation buttons
	var prevMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, -1);
	var prevMM = prevMMYYYY[0];
	var prevYYYY = prevMMYYYY[1];

	var nextMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, 1);
	var nextMM = nextMMYYYY[0];
	var nextYYYY = nextMMYYYY[1];
	
	this.wwrite("<TABLE WIDTH='100%' BORDER=1 CELLSPACING=0 CELLPADDING=0 BGCOLOR='#e0e0e0'><TR><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "'" +
		");" +
		"\"><<<\/A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "'" +
		");" +
		"\"><<\/A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"javascript:window.print();\">Print</A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" +
		");" +
		"\">><\/A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "'" +
		");" +
		"\">>><\/A>]</TD></TR></TABLE><BR>");

	// Get the complete calendar code for the month..
	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);

	this.wwrite("</font></body></html>");
	this.gWinCal.document.close();
}

Calendar.prototype.showY = function() {
	var vCode = "";
	var i;
	var vr, vc, vx, vy;		// Row, Column, X-coord, Y-coord
	var vxf = 285;			// X-Factor
	var vyf = 200;			// Y-Factor
	var vxm = 10;			// X-margin
	var vym;				// Y-margin
	if (isIE)	vym = 75;
	else if (isNav)	vym = 25;
	
	this.gWinCal.document.open();

	this.wwrite("<html>");
	this.wwrite("<head><title>Calendar</title>");
	this.wwrite("<style type='text/css'>\n<!--");
	for (i=0; i<12; i++) {
		vc = i % 3;
		if (i>=0 && i<= 2)	vr = 0;
		if (i>=3 && i<= 5)	vr = 1;
		if (i>=6 && i<= 8)	vr = 2;
		if (i>=9 && i<= 11)	vr = 3;
		
		vx = parseInt(vxf * vc) + vxm;
		vy = parseInt(vyf * vr) + vym;

		this.wwrite(".lclass" + i + " {position:absolute;top:" + vy + ";left:" + vx + ";}");
	}
	this.wwrite("-->\n</style>");
	this.wwrite("</head>");

	this.wwrite("<body " + 
		"link=\"" + this.gLinkColor + "\" " + 
		"vlink=\"" + this.gLinkColor + "\" " +
		"alink=\"" + this.gLinkColor + "\" " +
		"text=\"" + this.gTextColor + "\">");
	this.wwrite("<FONT FACE='" + fontface + "' SIZE=2><B>");
	this.wwrite("Year : " + this.gYear);
	this.wwrite("</B><BR>");

	// Show navigation buttons
	var prevYYYY = parseInt(this.gYear) - 1;
	var nextYYYY = parseInt(this.gYear) + 1;
	
	this.wwrite("<TABLE WIDTH='100%' BORDER=1 CELLSPACING=0 CELLPADDING=0 BGCOLOR='#e0e0e0'><TR><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', null, '" + prevYYYY + "', '" + this.gFormat + "'" +
		");" +
		"\" alt='Prev Year'><<<\/A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"javascript:window.print();\">Imprimir</A>]</TD><TD ALIGN=center>");
	this.wwrite("[<A HREF=\"" +
		"javascript:window.opener.Build(" + 
		"'" + this.gReturnItem + "', null, '" + nextYYYY + "', '" + this.gFormat + "'" +
		");" +
		"\">>><\/A>]</TD></TR></TABLE><BR>");

	// Get the complete calendar code for each month..
	var j;
	for (i=11; i>=0; i--) {
		if (isIE)
			this.wwrite("<DIV ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");
		else if (isNav)
			this.wwrite("<LAYER ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");

		this.gMonth = i;
		this.gMonthName = Calendar.get_month(this.gMonth);
		vCode = this.getMonthlyCalendarCode();
		this.wwrite(this.gMonthName + "/" + this.gYear + "<BR>");
		this.wwrite(vCode);

		if (isIE)
			this.wwrite("</DIV>");
		else if (isNav)
			this.wwrite("</LAYER>");
	}

	this.wwrite("</font><BR></body></html>");
	this.gWinCal.document.close();
}

Calendar.prototype.wwrite = function(wtext) {
	this.gWinCal.document.writeln(wtext);
}

Calendar.prototype.wwriteA = function(wtext) {
	this.gWinCal.document.write(wtext);
}

Calendar.prototype.cal_header = function() {
	var vCode = "";
	
	vCode = vCode + "<TR>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Dom</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Lun</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Mar</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Mie</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Jue</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Vie</B></FONT></TD>";
	vCode = vCode + "<TD WIDTH='16%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Sab</B></FONT></TD>";
	vCode = vCode + "</TR>";
	
	return vCode;
}

Calendar.prototype.cal_data = function() {
	var vDate = new Date();
	vDate.setDate(1);
	vDate.setMonth(this.gMonth);
	vDate.setFullYear(this.gYear);

	var vFirstDay=vDate.getDay();
	var vDay=1;
	var vLastDay=Calendar.get_daysofmonth(this.gMonth, this.gYear);
	var vOnLastDay=0;
	var vCode = "";

	/*
	Get day for the 1st of the requested month/year..
	Place as many blank cells before the 1st day of the month as necessary. 
	*/

	vCode = vCode + "<script type=\"text/javascript\">"
	vCode = vCode + "we=open('','principal')"
	vCode = vCode + "</script>"
	
	vCode = vCode + "<TR>";
	for (i=0; i<vFirstDay; i++) {
		vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(i) + "><FONT SIZE='2' FACE='" + fontface + "'> </FONT></TD>";
	}

	// Write rest of the 1st week
	for (j=vFirstDay; j<7; j++) {
		vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" + 
			"<A HREF='#' " + 
				"onClick=\"self.opener.document." + this.gReturnItem + ".value='" + 
				this.format_data(vDay) + 
				"';window.close();\">" + 
				this.format_day(vDay) + 
			"</A>" + 
			"</FONT></TD>";
		vDay=vDay + 1;
	}
	vCode = vCode + "</TR>";

	// Write the rest of the weeks
	for (k=2; k<7; k++) {
		vCode = vCode + "<TR>";

		for (j=0; j<7; j++) {
			vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" + 
				"<A HREF='#' " + 
					"onClick=\"we.document." + this.gReturnItem + ".value='" + 
					this.format_data(vDay) + 
					"';window.close();\">" + 
				this.format_day(vDay) + 
				"</A>" + 
				"</FONT></TD>";
			vDay=vDay + 1;

			if (vDay > vLastDay) {
				vOnLastDay = 1;
				break;
			}
		}

		if (j == 6)
			vCode = vCode + "</TR>";
		if (vOnLastDay == 1)
			break;
	}
	
	// Fill up the rest of last week with proper blanks, so that we get proper square blocks
	for (m=1; m<(7-j); m++) {
		if (this.gYearly)
			vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j+m) + 
			"><FONT SIZE='2' FACE='" + fontface + "' COLOR='gray'> </FONT></TD>";
		else
			vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j+m) + 
			"><FONT SIZE='2' FACE='" + fontface + "' COLOR='gray'>" + m + "</FONT></TD>";
	}
	
	return vCode;
}

Calendar.prototype.format_day = function(vday) {
	var vNowDay = gNow.getDate();
	var vNowMonth = gNow.getMonth();
	var vNowYear = gNow.getFullYear();

	if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == vNowYear)
		return ("<FONT COLOR=\"RED\"><B>" + vday + "</B></FONT>");
	else
		return (vday);
}

Calendar.prototype.write_weekend_string = function(vday) {
	var i;

	// Return special formatting for the weekend day.
	for (i=0; i<weekend.length; i++) {
		if (vday == weekend[i])
			return (" BGCOLOR=\"" + weekendColor + "\"");
	}
	
	return "";
}

Calendar.prototype.format_data = function(p_day) {
	var vData;
	var vMonth = 1 + this.gMonth;
	vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
	var vMon = Calendar.get_month(this.gMonth).substr(0,3).toUpperCase();
	var vFMon = Calendar.get_month(this.gMonth).toUpperCase();
	var vY4 = new String(this.gYear);
	var vY2 = new String(this.gYear.substr(2,2));
	var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;

	switch (this.gFormat) {
		case "MM\/DD\/YYYY" :
			vData = vMonth + "\/" + vDD + "\/" + vY4;
			break;
		case "MM\/DD\/YY" :
			vData = vMonth + "\/" + vDD + "\/" + vY2;
			break;
		case "MM-DD-YYYY" :
			vData = vMonth + "-" + vDD + "-" + vY4;
			break;
		case "MM-DD-YY" :
			vData = vMonth + "-" + vDD + "-" + vY2;
			break;

		case "DD\/MON\/YYYY" :
			vData = vDD + "\/" + vMon + "\/" + vY4;
			break;
		case "DD\/MON\/YY" :
			vData = vDD + "\/" + vMon + "\/" + vY2;
			break;
		case "DD-MON-YYYY" :
			vData = vDD + "-" + vMon + "-" + vY4;
			break;
		case "DD-MON-YY" :
			vData = vDD + "-" + vMon + "-" + vY2;
			break;

		case "DD\/MONTH\/YYYY" :
			vData = vDD + "\/" + vFMon + "\/" + vY4;
			break;
		case "DD\/MONTH\/YY" :
			vData = vDD + "\/" + vFMon + "\/" + vY2;
			break;
		case "DD-MONTH-YYYY" :
			vData = vDD + "-" + vFMon + "-" + vY4;
			break;
		case "DD-MONTH-YY" :
			vData = vDD + "-" + vFMon + "-" + vY2;
			break;

		case "DD\/MM\/YYYY" :
			vData = vDD + "\/" + vMonth + "\/" + vY4;
			break;
		case "DD\/MM\/YY" :
			vData = vDD + "\/" + vMonth + "\/" + vY2;
			break;
		case "DD-MM-YYYY" :
			vData = vDD + "-" + vMonth + "-" + vY4;
			break;
		case "DD-MM-YY" :
			vData = vDD + "-" + vMonth + "-" + vY2;
			break;

		default :
			vData = vMonth + "\/" + vDD + "\/" + vY4;
	}

	return vData;
}

function Build(p_item, p_month, p_year, p_format) {
	var p_WinCal = ggWinCal;
	gCal = new Calendar(p_item, p_WinCal, p_month, p_year, p_format);

	// Customize your Calendar here..
	gCal.gBGColor="white";
	gCal.gLinkColor="black";
	gCal.gTextColor="black";
	gCal.gHeaderColor="darkgreen";

	// Choose appropriate show function
	if (gCal.gYearly)	gCal.showY();
	else	gCal.show();
}

function show_calendar() {
	/* 
		p_month : 0-11 for Jan-Dec; 12 for All Months.
		p_year	: 4-digit year
		p_format: Date format (mm/dd/yyyy, dd/mm/yy, ...)
		p_item	: Return Item.
	*/

	p_item = arguments[0];
	if (arguments[1] == null)
		p_month = new String(gNow.getMonth());
	else
		p_month = arguments[1];
	if (arguments[2] == "" || arguments[2] == null)
		p_year = new String(gNow.getFullYear().toString());
	else
		p_year = arguments[2];
	if (arguments[3] == null)
		p_format = "DD/MM/YYYY";
	else
		p_format = arguments[3];

	vWinCal = window.open("", "Calendar", 
		"width=250,height=250,status=no,resizable=no,top=200,left=200");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, p_month, p_year, p_format);
}
/*
Yearly Calendar Code Starts here
*/
function show_yearly_calendar(p_item, p_year, p_format) {
	// Load the defaults..
	if (p_year == null || p_year == "")
		p_year = new String(gNow.getFullYear().toString());
	if (p_format == null || p_format == "")
		p_format = "DD/MM/YYYY";
	var vWinCal = window.open("", "Calendar", "scrollbars=yes");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, null, p_year, p_format);
}
// Calendario Fin 