var gn_timeOut = 0; // Milisegundos, con 0 el calendario no desaparecera
var gn_diaInicio = 1; // 0=domingo, 1=lunes

// preload images
var imgUp = new Image(8,12);
imgUp.src = 'fuentes/global/dfim/globales/up.gif';
var imgDown = new Image(8,12);
imgDown.src = 'fuentes/global/dfim/globales/down.gif';

// Usado para timeout por las funciones de auto-ocultamiento
var timeoutId = false;

// the now standard browser sniffer class
function Browser()
{
	this.dom = document.getElementById?1:0;
	this.ie4 = (document.all && !this.dom)?1:0;
	this.ns4 = (document.layers && !this.dom)?1:0;
	this.ns6 = (this.dom && !document.all)?1:0;
	this.ie5 = (this.dom && document.all)?1:0;
	this.ok = this.dom || this.ie4 || this.ns4;
	this.plataforma = navigator.platform;
}
var browser = new Browser();

// dom browsers require this written to the HEAD section

if (browser.dom || browser.ie4)
{
	document.writeln('<style>');
	document.writeln('#container {');
	document.writeln('position : absolute;');
	document.writeln('left : 100px;');
	document.writeln('top : 100px;');
	//Ancho ventana aqui y en [ document.writeln('clip:rect(0px 132px ' + height + 'px -10px);'); ]
	document.writeln('width : 132px;');;
	browser.platform=='Win32' ?height=134:height=145;
	document.writeln('height : ' + height +'px;');
	//px px px px
	document.writeln('clip:rect(0px 132px ' + height + 'px -10px);');
	//document.writeln('overflow : hidden;');
	document.writeln('visibility : hidden;');
	document.writeln('background-color : #ffffff');
	document.writeln('}');
	document.writeln('</style>')
	document.write('<div id="container"');
	if (gn_timeOut) 
		document.write(' onmouseout="calendarTimeout();" onmouseover="if (timeoutId) clearTimeout(timeoutId);"');
	document.write('></div>');
}

var g_Calendario;  // Objeto calendario

function calendarTimeout()
{
	if (browser.ie4 || browser.ie5)
	{
		if (window.event.srcElement && window.event.srcElement.name!='month') 
			timeoutId=setTimeout('g_Calendario.oculta();',gn_timeOut);
	}
	if (browser.ns6 || browser.ns4)
	{
		timeoutId=setTimeout('g_Calendario.oculta();',gn_timeOut);
	}
}

// Constructor para clase calendario
function Calendar()
{
	g_Calendario = this;
	
	// Valores que necesitará la clase
	this.diasDeLaSemana = new Array("Do","Lu","Ma","Mi","Ju","Vi","Sa");
	this.meses = new Array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
	this.diasEnElMes = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

	if (browser.ns4)
	{
		var tmpLayer = new Layer(127);
		if (gn_timeOut)
		{
			tmpLayer.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
			tmpLayer.onmouseover = function(event) { if (timeoutId) clearTimeout(timeoutId); };
			tmpLayer.onmouseout = function(event) { timeoutId=setTimeout('g_Calendario.oculta()',gn_timeOut);};
		}
		tmpLayer.x = 100;
		tmpLayer.y = 100;
		tmpLayer.bgColor = "#ffffff";
	}
	if (browser.dom || browser.ie4)
	{
		var tmpLayer = browser.dom?document.getElementById('container'):document.all.container;
	}
	this.containerLayer = tmpLayer;
	if (browser.ns4 && browser.platform=='Win32') 
	{
		this.containerLayer.clip.height=134;
		this.containerLayer.clip.width=127;
	}
}

Calendar.prototype.getFirstDOM = function() 
{
	var laFecha = new Date();
	laFecha.setDate(1);
	laFecha.setMonth(this.mes);
	laFecha.setFullYear(this.anno);
	return laFecha.getDay();
}

Calendar.prototype.obtDiasEnElMes = function ()
{
	if (this.mes!=1) 
	{
		return this.diasEnElMes[this.mes]
	}
	else 
	{
		// Es Año bisiesto
		if (Date.esAnnoBisiesto(this.anno)) 
		{
			return 29;
		}
		else 
		{
			return 28;
		}
	}
}

Calendar.prototype.haceHtmlCal = function()
{
	var tmpStr = '<form onSubmit="this.year.blur();return false;"><table width="100%" border="0" cellspacing="0" cellpadding="2" class="calBorderColor"><tr><td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="" class="calBgColor">';

	tmpStr += '<tr>';
	tmpStr += '<td colspan="2" class="bgCerrar" align="right">';
	tmpStr += '<a class="cerrar" href="javascript:g_Calendario.cerraCal();">Cerrar</a>&nbsp;';
	tmpStr += '</td>';
	tmpStr += '</tr>';
	
	tmpStr += '<tr>';
	tmpStr += '<td width="60%" class="cal" align="left">';
	if (this.usaComboBox) 
	{
		tmpStr += '<select class="month" name="month" onchange="g_Calendario.selectCambia(this);">';
		for (var i=0;i<this.meses.length;i++)
		{
			tmpStr += '<option value="' + i + '"'
			if (i == this.mes) 
				tmpStr += ' selected';
			tmpStr += '>' + this.meses[i] + '</option>';
		}

	tmpStr += '</select>';

	} 
	else 
	{
		tmpStr += '<table border="0" cellspacing="0" cellpadding="1"><tr><td class="calMonthsColor"><a href="javascript: g_Calendario.cambiaMes(-1);"><img name="calendar" src="fuentes/global/dfim/globales/down.gif" width="8" height="12" border="0" alt=""></a></td><td class="calMonthsColor" width="100%" align="center">' + this.meses[this.mes] + '</td><td class="calMonthsColor"><a href="javascript: g_Calendario.cambiaMes(+1);"><img name="calendar" src="fuentes/global/dfim/globales/up.gif" width="8" height="12" border="0" alt=""></a></td></tr></table>';
	}
	tmpStr += '</td>';
	/* 
	obs : por alguna razon si el evento es cambiado a 'onChange' en vez de 'onBlur' IE se cae (4 y 5)!
	*/
	tmpStr += '<td width="40%" align="right" class="cal">';

	if (this.usaComboBox) 
	{
		tmpStr += '<input class="year" type="text" size="';
		// get round NS4 win32 lenght of year input problem
		(browser.ns4 && browser.platform=='Win32')?tmpStr += 1:tmpStr += 4;
		tmpStr += '" name="year" maxlength="4" onBlur="g_Calendario.inputCambia(this);" value="' + this.anno + '">';
	}
	else
	{
		tmpStr += '<table border="0" cellspacing="0" cellpadding="1" class="calMonthsColor"><tr><td class="calMonthsColor"><a href="javascript: g_Calendario.cambiaAnno(-1);"><img name="calendar" src="fuentes/global/dfim/globales/down.gif" width="8" height="12" border="0" alt=""></a></td><td class="calMonthsColor" width="100%" align="center">' + this.anno + '</td><td class="calMonthsColor"><a href="javascript: g_Calendario.cambiaAnno(+1);"><img name="calendar" src="fuentes/global/dfim/globales/up.gif" width="8" height="12" border="0" alt=""></a></td></tr></table>'
	}
	tmpStr += '</td>';
	tmpStr += '</tr>';
	tmpStr += '</table>';
	var iContador = 1;

	var iFirstDOM = (7+this.getFirstDOM()-gn_diaInicio)%7; // evita que quede en loop

	// Nro de dias del mes 31-30-28, etc.
	var iDiasEnElMes = this.obtDiasEnElMes(); 

	tmpStr += '<table width="100%" border="0" cellspacing="0" cellpadding="1" class="calBgColor">';
	tmpStr += '<tr>';
	// Imprime dìas de la semana: Lun, Mar, ....
	for (var i=0;i<7;i++)
	{
		tmpStr += '<td align="center" class="calDaysColor">' + this.diasDeLaSemana[(gn_diaInicio+i)%7] +'</td>';
	}
	tmpStr += '</tr>';
	var ls_fechdesde = parseInt('' + this.desdeAnno + this.desdeMes + this.desdeDia,10);
	var ls_fechhasta = parseInt('' + this.hastaAnno + this.hastaMes + this.hastaDia,10);
	var ls_fechcompara;

	for (var j=1;j<=6;j++)
	{
		tmpStr += '<tr>';
		for (var i=1;i<=7;i++)
		{
			tmpStr += '<td width="16" align="center" '

			if ( (7*(j-1) + i)>=iFirstDOM+1  && iContador <= iDiasEnElMes)
			{
				if (iContador==this.dia && this.anno==this.oAnno && this.mes==this.oMes)
					tmpStr += 'class="calHighlightColor"';
				else 
				{
					if (i==7-gn_diaInicio || i==((7-gn_diaInicio)%7)+1) 
						tmpStr += 'class="calWeekend"';
					else 
						tmpStr += 'class="cal"';
				}	
				tmpStr += '>';


				ls_fechcompara = parseInt('' + this.anno + padCeros(this.mes) + padCeros(iContador),10);

				if (ls_fechcompara >= ls_fechdesde && ls_fechcompara <= ls_fechhasta) 
				{
					ls_fecha_a_pintar = parseInt('' + this.anno + padCeros(this.mes + 1) + padCeros(iContador),10);
					if (gs_feriados.indexOf(ls_fecha_a_pintar) > -1)
						tmpStr += '<a class="calferiado" href="javascript:g_Calendario.clickDia(' + iContador + ');">' + iContador + '</a>';
					else
						tmpStr += '<a class="cal" href="javascript: g_Calendario.clickDia(' + iContador + ');">' + iContador + '</a>';
				} 
				else
				{
					tmpStr += '<span class="disabled">' + iContador + '</span>';
				}
				iContador++;
			}
			else
			{
				if  (i==7-gn_diaInicio || i==((7-gn_diaInicio)%7)+1) 
					tmpStr += 'class="calWeekend"'; 
				else 
					tmpStr +='class="cal"';
				tmpStr += '>&nbsp;';
			}
			tmpStr += '</td>'
		}
		tmpStr += '</tr>'
	}
	tmpStr += '</table></td></tr></table></form>'
	return tmpStr;
}

Calendar.prototype.selectCambia = function(obj)
{
//	  this.mes = browser.ns6 ? this.containerLayer.ownerDocument.forms[0].month.selectedIndex:this.containerLayer.document.forms[0].month.selectedIndex;
	this.mes = obj.selectedIndex;
	this.escribeTexto(this.haceHtmlCal());
}

Calendar.prototype.inputCambia = function(obj)
{
//	  var tmp = browser.ns6?this.containerLayer.ownerDocument.forms[0].year:this.containerLayer.document.forms[0].year;
	var tmp = obj;
	if (tmp.value >=1900 || tmp.value <=2100)
	{
		this.anno = tmp.value;
		this.escribeTexto(this.haceHtmlCal());
	}
	else
	{
		tmp.value = this.anno;
	}
}

Calendar.prototype.cambiaAnno = function(incr)
{
	(incr==1)?this.anno++:this.anno--;
	this.escribeTexto(this.haceHtmlCal());
}
Calendar.prototype.cambiaMes = function(incr)
{
	if (this.mes==11 && incr==1)
	{
		this.mes = 0;
		this.anno++;
	} else {
	if (this.mes==0 && incr==-1)
	{
		this.mes = 11;
		this.anno--;
	} else 
	{
		(incr==1)?this.mes++:this.mes--;
	}
	}
	this.escribeTexto(this.haceHtmlCal());
}

Calendar.prototype.clickDia = function(dia)
{
	var tmp = eval('document.' + this.objContieneFecha);
	tmp.value = this.formateaFecha(dia,this.mes,this.anno);
	if (browser.ns4) 
		this.containerLayer.hidden=true;
	if (browser.dom || browser.ie4)
	{
		this.containerLayer.style.visibility='hidden';
	}
}

Calendar.prototype.cerraCal = function()
{
	if (browser.ns4) 
		this.containerLayer.hidden=true;
	if (browser.dom || browser.ie4)
	{
		this.containerLayer.style.visibility='hidden';
	}
}

Calendar.prototype.formateaFecha = function(dia, mes, anno)
{
	var delim = eval('/\\' + this.fechaDelim + '/g');
	switch (this.formatoFecha.replace(delim,""))
	{
		case 'ddmmmyyyy': return padCeros(dia) + this.fechaDelim + this.meses[mes].substr(0,3) + this.fechaDelim + anno;
		case 'ddmmyyyy' : return padCeros(dia) + this.fechaDelim + padCeros(mes+1) + this.fechaDelim + anno;
		case 'mmddyyyy' : return padCeros((mes+1)) + this.fechaDelim + padCeros(dia) + this.fechaDelim + anno;
		case 'yyyymmdd' : return anno + this.fechaDelim + padCeros(mes+1) + this.fechaDelim + padCeros(dia);
		default         : alert('Formato de fecha incorrecto');
	}
}

Calendar.prototype.escribeTexto = function(str)
{
	if (browser.ns4)
	{
		this.containerLayer.document.open();
		this.containerLayer.document.write(str);
		this.containerLayer.document.close();
	}
	if (browser.dom || browser.ie4)
	{
		this.containerLayer.innerHTML = str;
	}
}

// función g_Calendario.ver
// Parámetros:
//
// event        : valor obigatorio event (Propiedades del evento)
// objeto text  : Aqui el calendario asigna la fecha
// Usa Combo box: True para que el calendario despliegue los meses en una combo box y el año en una textbox
//                False para usar flechas para incrementar o decrementar el mes y el año
// Formato Fecha: String con cadena que representa el formato de despliegue de la fecha 
//                (Ej: dd/mm/yyyy, mm/dd/yyyy, dd/mmm/yyyy, dd-mmm-yyyy, dd-mm-yyyy, yyyy-mm-dd)
// X e Y        : posición X e y donde se dibujara el calendario. La posición (0,0) corresponde a la ubición donde parte
//                el objeto que se uso para llamar al calendario.
Calendar.prototype.ver = function(event, target, busaComboBox, formatoFecha, xPos, yPos, desdeFecha, hastaFecha)
{
	this.desdeFecha     = desdeFecha || new Date(1900,0,1);
	this.desdeDia       = padCeros(this.desdeFecha.getDate());
	this.desdeMes  = padCeros(this.desdeFecha.getMonth());
	this.desdeAnno = this.desdeFecha.getFullYear();
	this.hastaFecha     = hastaFecha || new Date(3000,0,1);
	this.hastaDia  = padCeros(this.hastaFecha.getDate());
	this.hastaMes  = padCeros(this.hastaFecha.getMonth());
	this.hastaAnno = this.hastaFecha.getFullYear();
	this.usaComboBox    = busaComboBox;
	this.formatoFecha   = formatoFecha || 'dd/mm/yyyy';

	switch (this.formatoFecha)
	{
		case 'dd-mmm-yyyy':
		case 'dd-mm-yyyy':
		case 'yyyy-mm-dd':
			this.fechaDelim = '-';
			break;
		case 'dd/mm/yyyy':
		case 'mm/dd/yyyy':
		case 'dd/mmm/yyyy':
			this.fechaDelim = '/';
			break;
	}

	if (browser.ns4) 
	{
		if (!this.containerLayer.hidden) 
		{
			this.containerLayer.hidden=true;
			return;
		}
	}
	if (browser.dom || browser.ie4)
	{
		if (this.containerLayer.style.visibility=='visible') 
		{
			this.containerLayer.style.visibility='hidden';
			return;
		}
	}

	if (browser.ie5 || browser.ie4)
	{
		var event = window.event;
	}
	if (browser.ns4){
		this.containerLayer.x = event.x+10;
		this.containerLayer.y = event.y-5;
	}
	if (browser.ie5 || browser.ie4)
	{
		var obj = event.srcElement;
		x = 0;
		while (obj.offsetParent != null) 
		{
			x += obj.offsetLeft;
			obj = obj.offsetParent;
		}

		x += obj.offsetLeft;
		y = 0;
		var obj = event.srcElement;
		while (obj.offsetParent != null) 
		{
			y += obj.offsetTop;
			obj = obj.offsetParent;
		}
		y += obj.offsetTop;

		//        this.containerLayer.style.left = x+35;
		//IE
		this.containerLayer.style.left = x + xPos;
		if (event.y>0)
		this.containerLayer.style.top = y + yPos;
	}
	
	if (browser.ns6)
	{
		this.containerLayer.style.left = event.pageX+xPos;
		this.containerLayer.style.top = event.pageY+yPos;
	}

	this.objContieneFecha = target;
	var tmp = eval('document.' + this.objContieneFecha);

	if (tmp && tmp.value && tmp.value.split(this.fechaDelim).length==3 && tmp.value.indexOf('d')==-1)
	{
		var atmp = tmp.value.split(this.fechaDelim)

		switch (this.formatoFecha)
		{
			case 'dd-mmm-yyyy':
			case 'dd/mmm/yyyy':
				for (var i=0;i<this.meses.length;i++)
				{
					if (atmp[1].toLowerCase()==this.meses[i].substr(0,3).toLowerCase())
					{
						this.mes = this.oMes = i;
						break;
					}	
				}
				this.dia = parseInt(atmp[0],10);
				this.anno = this.oAnno = parseInt(atmp[2],10);
				break;
			case 'dd/mm/yyyy':
			case 'dd-mm-yyyy':
				this.mes = this.oMes = parseInt(atmp[1]-1,10);
				this.dia = parseInt(atmp[0],10);
				this.anno = this.oAnno = parseInt(atmp[2],10);
				break;
			case 'mm/dd/yyyy':
			case 'mm-dd-yyyy':
				this.mes = this.oMes = parseInt(atmp[0]-1,10);
				this.dia = parseInt(atmp[1],10);
				this.anno = this.oAnno = parseInt(atmp[2],10);
			break;
			case 'yyyy-mm-dd':
				this.mes = this.oMes = parseInt(atmp[1]-1,10);
				this.dia = parseInt(atmp[2],10);
				this.anno = this.oAnno = parseInt(atmp[0],10);
			break;
		}
	}
	else
	{ // Si no hay fecha se usa fecha de hoy
		var laFecha = new Date();
		this.anno = this.oAnno = laFecha.getFullYear();
		this.mes = this.oMes = laFecha.getMonth();
		this.dia = this.oDia = laFecha.getDate();
	}
	this.escribeTexto(this.haceHtmlCal());

	// se visualiza
	if (browser.ns4) 
	{
		this.containerLayer.hidden=false;
	}
	if (browser.dom || browser.ie4){
		this.containerLayer.style.visibility='visible';
	}
}

Calendar.prototype.oculta = function()
{
	if (browser.ns4) 
		this.containerLayer.hidden = true;
	if (browser.dom || browser.ie4)
	{
		this.containerLayer.style.visibility='hidden';
	}
}

function handleDocumentClick(e)
{
	if (browser.ie4 || browser.ie5) 
		e = window.event;

	if (browser.ns6)
	{
		var bTest = (e.pageX > parseInt(g_Calendario.containerLayer.style.left,10) && e.pageX <  (parseInt(g_Calendario.containerLayer.style.left,10)+125) && e.pageY < (parseInt(g_Calendario.containerLayer.style.top,10)+125) && e.pageY > parseInt(g_Calendario.containerLayer.style.top,10));
		if (e.target.name!='imgCalendar' && e.target.name!='month'  && e.target.name!='year' && e.target.name!='calendar' && !bTest)
		{
			g_Calendario.oculta();
		}
	}
	if (browser.ie4 || browser.ie5)
	{
		// extra test to see if user clicked inside the calendar but not on a valid date, we don't want it to disappear in this case
		var bTest = (e.x > parseInt(g_Calendario.containerLayer.style.left,10) && e.x <  (parseInt(g_Calendario.containerLayer.style.left,10)+125) && e.y < (parseInt(g_Calendario.containerLayer.style.top,10)+125) && e.y > parseInt(g_Calendario.containerLayer.style.top,10));
		if (e.srcElement.name!='imgCalendar' && e.srcElement.name!='month' && e.srcElement.name!='year' && !bTest & typeof(e.srcElement)!='object')
		{
			g_Calendario.oculta();
		}
	}
	if (browser.ns4) 
		g_Calendario.oculta();
}

function padCeros(num) 
{
	return ((num <= 9) ? ("0" + num) : num);
}

Date.esAnnoBisiesto = function(year)
{ 
	if (year%4==0 && ((year%100!=0) || (year%400==0))) 
		return true; 
	else 
		return false; 
}

Date.diasEnAnno = function(year)
{ 
	if (Date.esAnnoBisiesto(year)) 
		return 366; 
	else 
		return 365;
}

var DAY = 1000*60*60*24;
Date.prototype.sumDias = function(num)
{
	return new Date((num*DAY)+this.valueOf());
}

window.onload=function()
{
	new Calendar(new Date());
	if (browser.ns4)
	{
		if (typeof document.NSfix == 'undefined')
		{
			document.NSfix = new Object();
			document.NSfix.initWidth=window.innerWidth;
			document.NSfix.initHeight=window.innerHeight;
		}
	}
}

if (browser.ns4) 
	window.onresize = function()
	{
		if (document.NSfix.initWidth!=window.innerWidth || document.NSfix.initHeight!=window.innerHeight) 
			window.location.reload(false);
	} // ns4 soluciona bug en redimensionar
/*
window.document.onclick=handleDocumentClick;
window.onerror = function(msg,url,line)
{
  alert('******* an error has occurred ********' +
  '\n\nPlease check that' +
  '\n\n1)You have not added any code to the body onload event,'
  +  '\nif you want to run something as well as the calendar initialisation'
  + '\ncode, add it to the onload event in the calendar library.'
  + '\n\n2)You have set the parameters correctly in the g_Calendario.show() method '
  + '\n\nSee www.totallysmartit.com\\examples\\calendar\\simple.asp for examples'
  + '\n\n------------------------------------------------------'
  + '\nError details'
  + '\nText:' + msg + '\nurl:' + url + '\nline:' + line);
}
*/