var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb"},
		{string: navigator.vendor, subString: "Apple", identity: "Safari"},
		{prop: window.opera,identity: "Opera"},
		{string: navigator.vendor, subString: "iCab",identity: "iCab"},
		{string: navigator.vendor, subString: "KDE", identity: "Konqueror"},
		{string: navigator.userAgent, subString: "Firefox", identity: "Firefox"},
		{string: navigator.vendor, subString: "Camino", identity: "Camino"},
		{string: navigator.userAgent, subString: "Netscape", identity: "Netscape"},
		{string: navigator.userAgent, subString: "MSIE", identity: "Explorer", versionSearch: "MSIE"},
		{string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv"},
		{string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla"}
	],
	dataOS : [{string: navigator.platform, subString: "Win", identity: "Windows"},{string: navigator.platform, subString: "Mac", identity: "Mac"},{string: navigator.platform, subString: "Linux",identity: "Linux"}]

};
BrowserDetect.init();
/*###############################################################################
  Calendario.js por Juan Espinoza juanmespinoza@gmail.com
  ver 1.0 13/08/2007
  Modificado para funcionar en la pagina LosCedros.com.mx
###############################################################################*/

/*###############################################################################
                        Declaraci�n del objeto CalendarDivObj
###############################################################################*/
function CalendarDivObj(div, tipo)
{
	this.fechaActual = new Date();
	this.fechaActual.setMinutes(0);
	this.fechaHoy = new Date();
	this.div = null;
	this.tipo = 0;
	this.up = "img/flechaD.jpg";
	this.down = "img/flechaI.jpg";
	this.lineUp = "img/calendario/lineUp.png";
	this.lineDown = "img/calendario/lineDown.png";
	this.lineVertical = "img/calendario/lineH.png";
	this.lineHorizontal = "img/calendario/lineV.png";
	this.inicializacionDeVariables();
	/* Clase del Div principal Calendar */
	this.classFlat = "CalendarFlat";
	this.classPop = "CalendarPop";

	this.div = div;

	/* Si el Calendar principal fue proporcionado, ejecutar init() ahora */
	if(this.div&&tipo){
		this.inicializeOptions(div);
		this.tipoCalendario = tipo;
	  	this.init(div);
	}
}
/*###############################################################################
         Funci�n que regresa el objeto barra Ayuda
###############################################################################*/
CalendarDivObj.prototype.getBarraAyuda=function()
{
	var texto = document.createElement("a");
		texto.innerHTML = "";
		texto.appendChild(document.createTextNode("Ayuda"));
		texto.className="CalendarioBarraAyudaTexto";

	var BarraAyuda = document.createElement("div");
		BarraAyuda.appendChild(texto);
		BarraAyuda.className="CalendarioBarraAyuda";
		
	this.textoAyuda = texto;
	return BarraAyuda;
}
/*###############################################################################
               Funcion de inicializaci�n de un objeto Calendar
###############################################################################*/
CalendarDivObj.prototype.change = function(e)
{
	for(i=0; i < e.calendario.childNodes.length;) {
		e.calendario.removeChild(e.calendario.childNodes[i])
	}
	if(this.tipo==1){
		e.calendario.appendChild(this.getBarraPresentacion());
		e.calendario.appendChild(this.getCuerpoCalendario());
		e.calendario.appendChild(this.getBarraAyuda());
		e.calendario.appendChild(this.getControlesCalendario(this.tipo, this.alineacion));
	} else {
		e.calendario.appendChild(this.getControlesCalendario(this.tipo, this.alineacion));
		e.calendario.appendChild(this.getCuerpoCalendario());
		e.calendario.appendChild(this.getBarraAyuda());
	}
	if(this.tipoReloj!=0){
		this.refreshSelectorHora();
		/*document.body.removeChild(e.calendario.selectorHora);
		e.calendario.selectorHora = this.getSelectorHora(this.tipoReloj)
		document.body.appendChild(e.calendario.selectorHora);
		e.calendario.selectorHora.style.top = (findPos(e.calendario)[1]+e.calendario.offsetHeight)+"px";
		e.calendario.selectorHora.style.left = findPos(e.calendario)[0]+"px";*/
	}
	return false;
};
/*###############################################################################
         Funci�n que regresa el objeto Controles
###############################################################################*/
CalendarDivObj.prototype.getControlesCalendario=function(tipo,alineacion)
{
	var controles = document.createElement("div");
	if(tipo==1){
		controles.appendChild(this.getBarraExtra());
		controles.appendChild(this.getMeses());
		if(!alineacion||alineacion==0)	controles.className = "CalendarioControlesCenter";
		else if(alineacion==1) controles.className = "CalendarioControlesLeft";
			else if(alineacion==2) controles.className = "CalendarioControlesRight";
	} else if(tipo==0){
		controles=this.getBarraInicioControl();
	}
	return controles;
}
/*###############################################################################
         Funci�n que regresa el objeto barra Inicio Control
###############################################################################*/
CalendarDivObj.prototype.getBarraInicioControl=function()
{
	var tituloPpal = "Calendario";
	var iconoSrc = this.iconoSrc;
	var fechaAnio = this.fechaActual.getFullYear();
	var fechaMes = this.fechaActual.getMonth()
	var icono = document.createElement("img");
		icono.src = iconoSrc;
		icono.className = "CalendarioBarraInicioControlIcono";


	var anteriorMes = document.createElement("img");
		anteriorMes.src = this.down;
		anteriorMes.className="CalendarioControlesFlechas anteriorMes";
		anteriorMes.onmouseover = this.changeBarraAyuda;
		anteriorMes.onclick = this.monthClick;
	var siguienteMes = document.createElement("img");
		siguienteMes.src = this.up;
		siguienteMes.className="CalendarioControlesFlechas siguienteMes";
		siguienteMes.onmouseover = this.changeBarraAyuda;
		siguienteMes.onclick = this.monthClick;
	var mesNombre = document.createElement("span");
		mesNombre.className="CalendarioBarraInicioControlFechaMesNombre";
		mesNombre.appendChild(document.createTextNode(this.getMesNombre(fechaMes)));
	var controlMes = document.createElement("div");
		controlMes.className="CalendarioBarraInicioControlFechaMesControles";
		controlMes.appendChild(anteriorMes);
		controlMes.appendChild(siguienteMes);		
		controlMes.appendChild(mesNombre);
	var mes = document.createElement("div");
		mes.className="CalendarioBarraInicioControlFechaMes";
		mes.appendChild(controlMes);	


	var anteriorAnio = document.createElement("img");
		anteriorAnio.src = this.down;
		anteriorAnio.className="CalendarioControlesFlechas";
		anteriorAnio.onmouseover = this.changeBarraAyuda;
		anteriorAnio.onclick = this.yearClick;
	var siguienteAnio = document.createElement("img");
		siguienteAnio.src = this.up;
		siguienteAnio.className="CalendarioControlesFlechas";
		siguienteAnio.onmouseover = this.changeBarraAyuda;
		siguienteAnio.onclick = this.yearClick;
	var anioNombre = document.createElement("span");
		anioNombre.className="CalendarioBarraInicioControlFechaAnioNombre";
		anioNombre.appendChild(document.createTextNode(fechaAnio));
	var controlAnio = document.createElement("div");
		controlAnio.className="CalendarioBarraInicioControlFechaAnioControles";
//		controlAnio.appendChild(anteriorAnio);	
		controlAnio.appendChild(anioNombre);
//		controlAnio.appendChild(siguienteAnio);		
	var anio = document.createElement("div");
		anio.className="CalendarioBarraInicioControlFechaAnio";
		anio.appendChild(controlAnio);	

	var controlFecha = document.createElement("div");
		controlFecha.className="CalendarioBarraInicioControlFecha";
		controlFecha.appendChild(mes);
		controlFecha.appendChild(anio);
		
	var BarraInicioControl = document.createElement("div");
		BarraInicioControl.appendChild(icono);
		BarraInicioControl.appendChild(controlFecha);
		BarraInicioControl.className="CalendarioBarraInicioControl";
		
	if(BrowserDetect.browser.search(/explorer/i)>=0){
		anteriorMes.setAttribute("mes",fechaMes-1);
		anteriorMes.setAttribute("cal",this);
		anteriorMes.setAttribute("ayuda","Mes anterior");
		siguienteMes.setAttribute("mes",fechaMes+1);
		siguienteMes.setAttribute("cal",this);
		siguienteMes.setAttribute("ayuda","Mes siguiente");
		anteriorAnio.setAttribute("anio",fechaAnio-1);
		anteriorAnio.setAttribute("cal",this);
		anteriorAnio.setAttribute("ayuda","Pasar al "+(fechaAnio-1));
		siguienteAnio.setAttribute("anio",fechaAnio+1);
		siguienteAnio.setAttribute("cal",this);
		siguienteAnio.setAttribute("ayuda", "Pasar al "+(fechaAnio+1));
	}else{
		anteriorMes.mes = fechaMes-1;
		anteriorMes.cal = this;
		anteriorMes.ayuda = "Mes anterior"
		siguienteMes.mes = fechaMes+1;
		siguienteMes.cal = this;
		siguienteMes.ayuda = "Mes siguiente"
		anteriorAnio.anio = fechaAnio-1;
		anteriorAnio.cal = this;
		anteriorAnio.ayuda = "Pasar al "+(fechaAnio-1);
		siguienteAnio.anio = fechaAnio+1;
		siguienteAnio.cal = this;
		siguienteAnio.ayuda = "Pasar al "+(fechaAnio+1);
	}
	return BarraInicioControl;
}
/*###############################################################################
         Funci�n que regresa el objeto barra extra
###############################################################################*/
CalendarDivObj.prototype.getBarraExtra=function()
{
	var anio = this.fechaActual.getFullYear();
	var actual = document.createElement("a");
		actual.appendChild(document.createTextNode(anio));
		actual.className="CalendarioBarraExtraAniosActual";
	var anterior = document.createElement("a");
		anterior.appendChild(document.createTextNode(anio-1));
		anterior.className="CalendarioBarraExtraAniosAnterior";
		anterior.anio = anio-1;
		anterior.cal = this;
		anterior.onclick = this.yearClick;
	var siguiente = document.createElement("a");
		siguiente.appendChild(document.createTextNode(anio+1));
		siguiente.className="CalendarioBarraExtraAniosSiguiente";
		siguiente.anio = anio+1;
		siguiente.cal = this;
		siguiente.onclick = this.yearClick;
	var anios = document.createElement("div");
		anios.appendChild(anterior);
		anios.appendChild(actual);
		anios.appendChild(siguiente);
		anios.className="CalendarioBarraExtraAnios";

	 var hoy = document.createElement("div");
		hoy.appendChild(document.createTextNode("Hoy"));
		hoy.className=hoy.className="CalendarioBarraExtraHoy";
		hoy.cal = this;
		hoy.onclick = this.todayClick;

	var BarraExtra = document.createElement("div");
		BarraExtra.className="CalendarioBarraExtra";
		BarraExtra.insertBefore(hoy, BarraExtra.firstChild);
		BarraExtra.insertBefore(anios, BarraExtra.firstChild);
	return BarraExtra;
}
/*###############################################################################
         Funci�n que regresa el objeto meses
###############################################################################*/
CalendarDivObj.prototype.getMeses=function()
{
	var fondo = document.createElement("div");
		fondo.className = "CalendarioMesesFondo";
	var meses = document.createElement("div");
		meses.className="CalendarioMeses";
		meses.appendChild(fondo);
	for(var i = 0 ; i< 12; i++){
		var mes = document.createElement("div");
			mes.appendChild(document.createTextNode(this.getMesNombre(i)));
			mes.className="CalendarioMesesMes";
			mes.cal = this;
			mes.mes = i;
			mes.onclick = this.monthClick;
		fondo.appendChild(mes);
	}
	return meses;
}
CalendarDivObj.prototype.getCuerpoCalendario=function()
{
	var cuerpoDias = document.createElement("div");
		cuerpoDias.className = "CalendarioCuerpoDias";
	barraDias = this.getBarraDias();
	dias = this.getDias(new Date(this.fechaActual));
	cuerpoDias.appendChild(barraDias);
	cuerpoDias.appendChild(dias);
	return cuerpoDias
}
/*###############################################################################
         Funci�n que regresa el objeto barra dias
###############################################################################*/
CalendarDivObj.prototype.getBarraDias=function()
{
	BarraDias = document.createElement("div");
		BarraDias.className="CalendarioCuerpoDiasBarraDias";
	diaNum = this.diaInicial;
	for(var i = 0 ; i< 7; i++){
		var dia = document.createElement("div");
			dia.appendChild(document.createTextNode(this.getDiaNombreCorto(diaNum)));
			dia.className="CalendarioCuerpoDiasBarraDiasNombre";
		BarraDias.appendChild(dia);
		diaNum++;
		if(diaNum==7) diaNum = 0;
	}
	return BarraDias;
}
/*###############################################################################
         Funci�n que regresa el objeto Dias
###############################################################################*/
CalendarDivObj.prototype.getDias=function(fecha)
{
	var Dias = document.createElement("div");
		Dias.className="CalendarioCuerpoDiasDias";
	var fin=0;
	fecha.setDate(1);
	diaNum = this.diaInicial;
	if(this.diaInicial>0)finDeSemana = this.diaInicial-1;
	else finDeSemana = 6;
	var primero = fecha.getDay();
	var mesInicio = "false";
	var mesTermino = "false";
	var diasMesActual = this.getDiasMes(fecha.getMonth(), fecha.getFullYear());
	var mesAnterior = 0;
		if(fecha.getMonth()==0) mesAnterior = 11;
		else mesAnterior = fecha.getMonth()-1;
	var diasMesAnterior = this.getDiasMes(mesAnterior, fecha.getFullYear())-primero+this.diaInicial+1;
	var diaActual=1;
	for(var i = 0 ; i< 42&&fin==0; i++){
		if(diaNum == primero) mesInicio = "true";

		var dia = document.createElement("div");
		if(mesInicio == "false"){
			dia.appendChild(document.createTextNode(""+(diasMesAnterior+i)));
			dia.className="CalendarioCuerpoDiasDiasDiaInactivo";
		} else if(mesTermino == "false"){
				if(true){
					dia.appendChild(document.createTextNode(""+diaActual));
					dia.className="CalendarioCuerpoDiasDiasDia";
					dia.dia = diaActual;
					dia.mes = fecha.getMonth();
					dia.anio = fecha.getFullYear();
					dia.cal = this;
					if(this.tipo==1)	{
						dia.ayuda = "Fecha: "+dia.anio+"-"+this.getMesNombre(dia.mes)+"-"+dia.dia;
						dia.onmouseover = this.changeBarraAyuda;
					}
					mesCorrecto = dia.mes+1;
					if(mesCorrecto<10) mesCorrecto = "0"+mesCorrecto;
					diaCorrecto = dia.dia;
					if(diaCorrecto<10) diaCorrecto = "0"+diaCorrecto;
					fechaDelDia = diaCorrecto+"-"+mesCorrecto+"-"+dia.anio;
					if(this.marcados.match(fechaDelDia)){
						dia.className=dia.className + " diaMarcado";
						dia.id=('dia'+fechaDelDia);
					}
					if(diaActual==this.fechaHoy.getDate()-1&&fecha.getMonth()==this.fechaHoy.getMonth()&&fecha.getFullYear()==this.fechaHoy.getFullYear())
						dia.className=dia.className + " hoy";
					diaActual++;
					if(diaActual>diasMesActual){
						mesTermino = "true";
						diaActual=1;
						if(diaNum==finDeSemana) fin=1;
					}
				}
			} else {
					dia.appendChild(document.createTextNode(""+diaActual));
					dia.className="CalendarioCuerpoDiasDiasDiaInactivo";
					diaActual++;
					if(diaNum==finDeSemana) fin=1;
			}
		Dias.appendChild(dia);
		diaNum++;
		if(diaNum==7) diaNum = 0;
	}
	return Dias;
}
/*###############################################################################
         Funci�n que regresa el objeto barra presentacion
###############################################################################*/
CalendarDivObj.prototype.getBarraPresentacion=function()
{

	var icono = document.createElement("img");
		icono.src = this.iconoSrc;
		icono.className = "CalendarioBarraPresentacionIcono";

	var activo = document.createElement("div");
		activo.innerHTML = "";
		activo.appendChild(document.createTextNode(this.getMesNombre(this.fechaActual.getMonth())+" "+this.fechaActual.getFullYear()));
		activo.className="CalendarioBarraPresentacionActivo";

	var BarraPresentacion = document.createElement("div");
		BarraPresentacion.appendChild(icono);
		BarraPresentacion.appendChild(activo);
		BarraPresentacion.className="CalendarioBarraPresentacion";
		
	return BarraPresentacion;
}
CalendarDivObj.prototype.inicializacionDeVariables=function()
{
	this.mesesNum = [31,28,31,30,31,30,31,31,30,31,30,31];
	this.mesesNomCorto = ["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"];
	this.mesesNom = ["ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"];
	this.diasNomCorto = ["D","L","M","M","J","V","S"];
	this.diasNom = ["Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"];
	this.diaInicial = 0;
}
CalendarDivObj.prototype.yearClick=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	this.cal.fechaActual.setFullYear(this.anio);
	this.cal.change(this.cal);
	return false;
};
CalendarDivObj.prototype.monthClick=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	this.cal.fechaActual.setMonth(this.mes);
	this.cal.change(this.cal);
	//event.stopPropagation();

	return false;
};
CalendarDivObj.prototype.todayClick=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	this.cal.fechaActual.setMonth(this.cal.fechaHoy.getMonth());
	this.cal.fechaActual.setDate(this.cal.fechaHoy.getDate());
	this.cal.fechaActual.setFullYear(this.cal.fechaHoy.getFullYear());
	
	this.cal.change(this.cal);

	return false;
};
CalendarDivObj.prototype.dayClick=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	this.cal.fechaActual.setDate(this.dia);
	if(this.cal.tipoCalendario.search(/flat/i)>=0){mensajitoFecha(this.cal.parseLink(this.cal.div.getAttribute("diaLink")));}
	else this.cal.insertDate(this);
	
	
  return false;
};
CalendarDivObj.prototype.hourClick=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	this.cal.fechaActual.setHours(this.hora);
	if(this.cal.tipoReloj==2) this.cal.updateFrame();
	this.cal.change(this.cal);
	event.cancelBubble=true;
	this.cal.insertDate(this);	
	
  return false;
};
CalendarDivObj.prototype.hourChange=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	var keynum;
	var keychar;
	var numcheck;
	
	if(window.event) // IE
	  {
	  keynum = event.keyCode;
	  }
	else if(event.which) // Netscape/Firefox/Opera
	  {
	  keynum = event.which;
	  }
	keychar = String.fromCharCode(keynum);
	numcheck = /\d/;
	if(keynum&&keynum!=8&&keynum!=13){
		if(numcheck.test(keychar)){
			nuevoValor = this.value.concat(keychar);
			if(nuevoValor>=0 && nuevoValor<=23){
				this.value = nuevoValor.slice(1,3);
			} else {
				this.value = keychar;
			}
			this.cal.fechaActual.setHours(this.value);
			if(this.cal.tipoReloj==2) this.cal.updateFrame();
			this.cal.change(this.cal);
			event.cancelBubble=true;
			this.cal.insertDate(this);
		} else {
			return false;
		}
		return numcheck.test(keychar);
	} else {
		return true;
	}
	
};
CalendarDivObj.prototype.minuteClick=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	this.cal.fechaActual.setMinutes(this.minuto);
	if(this.cal.tipoReloj==2) this.cal.updateFrame();
	this.cal.change(this.cal);
	event.cancelBubble=true;
	this.cal.insertDate(this);

  return false;
};
CalendarDivObj.prototype.minuteChange=function(event)
{
  /* Esta funcion solo debe ser llamada por la funci�n onClick de un elemento
     <A> tag.

     Como esta funci�n fue llamada desde el evento onClick, la variable "this"
     hace referencia al elemento <A> que dispar� el evento onClick (no al 
     objeto CalendarDivObj).
  */
	var keynum;
	var keychar;
	var numcheck;
	
	if(window.event) // IE
	  {
	  keynum = event.keyCode;
	  }
	else if(event.which) // Netscape/Firefox/Opera
	  {
	  keynum = event.which;
	  }
	keychar = String.fromCharCode(keynum);
	numcheck = /\d/;
	if(keynum&&keynum!=8&&keynum!=13){
		if(numcheck.test(keychar)){
			nuevoValor = this.value.concat(keychar);
			if(nuevoValor>=0 && nuevoValor<=59){
				this.value = nuevoValor.slice(1,3);
			} else {
				this.value = keychar;
			}
			this.cal.fechaActual.setMinutes(this.value);
			if(this.cal.tipoReloj==2) this.cal.updateFrame();
			this.cal.change(this.cal);
			event.cancelBubble=true;
			this.cal.insertDate(this);
		} else {
			return false;
		}
		return numcheck.test(keychar);
	} else {
		return true;
	}

};
CalendarDivObj.prototype.changeBarraAyuda=function(event)
{
		var campo = this.cal.textoAyuda;
		var texto = this.ayuda;
		campo.innerHTML = "";
		campo.appendChild(document.createTextNode(texto));
	return false;
}

CalendarDivObj.prototype.activarCalendario=function(event)
{
	var target = null;
	try{
		target = document.getElementById(this.trigger.getAttribute("target"));
	}
	catch(e){
		target = document.getElementById(this.getAttribute("target"));
	}
	if(this.cal.className.search("Unhidden")<0){
		this.cal.style.top = (findPos(target)[1]+target.offsetHeight)+"px";
		this.cal.style.left = (findPos(target)[0]-90)+"px";
		this.cal.className = this.cal.className.replace("Hidden","Unhidden");
/*		this.cal.style.height = "0px";
		for (var i=0;i<175;i++){	
			this.cal.style.height = i + "px";
		}*/
		$(this.cal ).hide().slideDown('slow');
		if(this.cal.tipoReloj!=0){
			if(this.cal.tipoReloj==1){
				this.cal.selectorHora.style.top = (findPos(calendario)[1]+calendario.offsetHeight)+"px";
				this.cal.selectorHora.style.left = findPos(calendario)[0]+"px";
			} else {
				this.cal.selectorHora.style.top = findPos(calendario)[1]+"px";
				this.cal.selectorHora.style.left = (findPos(calendario)[0]+calendario.offsetWidth)+"px";
			}
			this.cal.selectorHora.className = this.cal.selectorHora.className.replace("Hidden","Unhidden");
		}
	
		if(BrowserDetect.browser.search(/explorer/i)>=0){
			return false;
		}else{
		event.cancelBubble=true;
		event.returnValue=false;
		return false;
		}
	} else {
		$(this.cal ).slideUp('slow',function(){this.cal.className = this.cal.className.replace("Unhidden","Hidden");});
//		this.cal.className = this.cal.className.replace("Unhidden","Hidden");
		if(this.cal.tipoReloj!=0){
			this.cal.selectorHora.className = this.cal.selectorHora.className.replace("Unhidden","Hidden");
		}
	}
	event.stopPropagation();
}

/*###############################################################################
             Funciones de apoyo a los eventos
###############################################################################*/
CalendarDivObj.prototype.desactivarCalendario=function(event)
{
		
	/*this.cal.className = this.cal.className.replace("Unhidden","Hidden");
	if(this.cal.tipoReloj!=0){
		this.cal.selectorHora.className = this.cal.selectorHora.className.replace("Unhidden","Hidden");
	}
	this.onclick() = this.activarCalendario;*/
}
CalendarDivObj.prototype.insertDate=function(dia)
{
	var target = document.getElementById(dia.cal.div.getAttribute("target"));
	var fecha = new Date(dia.cal.fechaActual);
	var diaNum = fecha.getDate();
	var mes = fecha.getMonth()+1;
	var hora = fecha.getHours();
	var minuto = fecha.getMinutes();
	if(diaNum<10) diaNum = "0"+diaNum;
	if(mes<10) mes = "0"+mes;
	if(hora<10) hora = "0"+hora;
	if(minuto<10) minuto = "0"+minuto;
	if(dia.cal.tipoReloj!=0)  diaNum += " "+hora+":"+minuto;
	target.value = fecha.getFullYear()+"-"+mes+"-"+diaNum;
}
CalendarDivObj.prototype.parseLink=function(link)
{
	link = link.replace("[day]",this.fechaActual.getDate());
	link = link.replace("[month]",(this.fechaActual.getMonth()+1));
	link = link.replace("[year]",this.fechaActual.getFullYear());
	return link;
}
CalendarDivObj.prototype.getSelectorHora=function(tipo)
{
	var selectorHora = document.createElement("div");
	selectorHora.className = "CalendarioRelojBaseSmall";
	if(tipo==2)	{
		selectorHora.appendChild(this.getRelojito());
		this.updateFrame();
		selectorHora.className = "CalendarioRelojBaseBig";
	}
	var controlHora = this.getControlHora();
	selectorHora.controlHora = controlHora;
	selectorHora.appendChild(controlHora);
	this.selectorHora=selectorHora
	return selectorHora;
}
CalendarDivObj.prototype.refreshSelectorHora=function()
{
	var selectorHora = this.selectorHora;
	var horaActual = this.fechaActual.getHours();
	var minutoActual = this.fechaActual.getMinutes()

	selectorHora.controlHora.hora.anterior.hora = horaActual-1;
	selectorHora.controlHora.hora.siguiente.hora = horaActual+1;
	if(horaActual<10) horaActual = "0"+horaActual;
	selectorHora.controlHora.hora.actual.value="";
	selectorHora.controlHora.hora.actual.value=horaActual;

	selectorHora.controlHora.minuto.anterior.minuto = minutoActual-15;
	selectorHora.controlHora.minuto.siguiente.minuto = minutoActual+15;
	if(minutoActual<10) minutoActual = "0"+minutoActual;
	selectorHora.controlHora.minuto.actual.value = "";
	selectorHora.controlHora.minuto.actual.value = minutoActual;

	return false;

}

CalendarDivObj.prototype.getRelojito=function()
{
	var reloj = document.createElement("div");
	reloj.className = "CalendarioRelojito";
	this.reloj = reloj;
	return reloj;
}
CalendarDivObj.prototype.getControlHora=function()
{
	var horaActual = this.fechaActual.getHours();
	var minutoActual = this.fechaActual.getMinutes()


	var anteriorHora = document.createElement("img");
		anteriorHora.src = this.down;
		anteriorHora.className="CalendarioControlesFlechas";
		anteriorHora.hora = horaActual-1;
		anteriorHora.cal = this;
		anteriorHora.ayuda = "Hora anterior"
		anteriorHora.onmouseover = this.changeBarraAyuda;
		anteriorHora.onclick = this.hourClick;
	var siguienteHora = document.createElement("img");
		siguienteHora.src = this.up;
		siguienteHora.className="CalendarioControlesFlechas";
		siguienteHora.hora = horaActual+1;
		siguienteHora.cal = this;
		siguienteHora.ayuda = "Hora siguiente"
		siguienteHora.onmouseover = this.changeBarraAyuda;
		siguienteHora.onclick = this.hourClick;
	var horaValor = document.createElement("input");
		horaValor.type = "text";
		horaValor.maxLength="2";
		horaValor.size="1";
		horaValor.cal=this;
		horaValor.className="CalendarioRelojHoraControlHora";
		if(horaActual<10) horaActual = "0"+horaActual;
		horaValor.value=horaActual;
		horaValor.onkeypress = this.hourChange;
	var controlHora = document.createElement("div");
		controlHora.className="CalendarioRelojHoraControl";
		controlHora.appendChild(siguienteHora);		
		controlHora.appendChild(horaValor);
		controlHora.appendChild(anteriorHora);
	var hora = document.createElement("div");
		hora.className="CalendarioRelojHora";
		hora.appendChild(controlHora);	


	var anteriorMinuto = document.createElement("img");
		anteriorMinuto.src = this.down;
		anteriorMinuto.className="CalendarioControlesFlechas";
		anteriorMinuto.minuto = minutoActual-15;
		anteriorMinuto.cal = this;
		anteriorMinuto.ayuda = "Minuto anterior"
		anteriorMinuto.onmouseover = this.changeBarraAyuda;
		anteriorMinuto.onclick = this.minuteClick;
	var siguienteMinuto = document.createElement("img");
		siguienteMinuto.src = this.up;
		siguienteMinuto.className="CalendarioControlesFlechas";
		siguienteMinuto.minuto = minutoActual+15;
		siguienteMinuto.cal = this;
		siguienteMinuto.ayuda = "Minuto siguiente"
		siguienteMinuto.onmouseover = this.changeBarraAyuda;
		siguienteMinuto.onclick = this.minuteClick;
	var minutoValor = document.createElement("input");
		minutoValor.type="text";
		minutoValor.maxLength="2";
		minutoValor.size="1";
		minutoValor.cal=this;
		minutoValor.className="CalendarioRelojMinutoControlMinuto";
		if(minutoActual<10) minutoActual = "0"+minutoActual;
		minutoValor.value=minutoActual;
		minutoValor.onkeypress = this.minuteChange;
	var controlMinuto = document.createElement("div");
		controlMinuto.className="CalendarioRelojMinutoControl";
		controlMinuto.appendChild(siguienteMinuto);		
		controlMinuto.appendChild(minutoValor);
		controlMinuto.appendChild(anteriorMinuto);	
	var minuto = document.createElement("div");
		minuto.className="CalendarioRelojMinuto";
		minuto.appendChild(controlMinuto);	

	var separador = document.createElement("div");
		separador.className="CalendarioRelojSeparador";
		separador.appendChild(document.createTextNode(" : "));	
	var controlHora = document.createElement("div");
		controlHora.className="CalendarioReloj";
		controlHora.appendChild(hora);
		controlHora.appendChild(separador);
		controlHora.appendChild(minuto);

	controlHora.hora = hora;
	controlHora.minuto = minuto;
	controlHora.hora.anterior = anteriorHora;
	controlHora.hora.siguiente = siguienteHora;
	controlHora.hora.actual = horaValor;
	controlHora.minuto.anterior = anteriorMinuto;
	controlHora.minuto.siguiente = siguienteMinuto;
	controlHora.minuto.actual = minutoValor;
	return controlHora;
}

CalendarDivObj.prototype.drawLine=function( lineIndex, x1, y1, x2, y2 )
{
	objectHandle = document.getElementById( "line"+ lineIndex );
	var reloj = this.reloj;
	if( !objectHandle )
	{
		var line = document.createElement("img");
		line.id = "line"+lineIndex;
		line.className = "CalendarioRelojLine";
		reloj.appendChild(line);
		objectHandle = line;
	}

	this.updateLine( objectHandle, x1, y1, x2, y2 );
}

CalendarDivObj.prototype.updateLine=function( lineObjectHandle, Ax, Ay, Bx, By )
{
	var
		xMin		= Math.min( Ax, Bx ),
		yMin		= Math.min( Ay, By ),
		xMax		= Math.max( Ax, Bx ),
		yMax		= Math.max( Ay, By ),
		boxWidth	= Math.max( xMax-xMin, 1 ),
		boxHeight	= Math.max( yMax-yMin, 1 ),
		tmp			= Math.min( boxWidth, boxHeight, 256 ),
		lineIndex	= (Bx-Ax)*(By-Ay)<0?0:1;

	while( tmp>>=1 )
		lineIndex+=2;
	if(lineIndex==0 || lineIndex==1){
		if(lineIndex ==1)
			lineObjectHandle.src = this.lineVertical;//"img/lineUp.png";
		else
			lineObjectHandle.src = this.lineHorizontal;//"img/lineUp.png";
	
	} else {
		if((lineIndex%2)==0)
			lineObjectHandle.src = this.lineUp;//"img/lineUp.png";
		else
			lineObjectHandle.src = this.lineDown;//"img/lineDown.png";
	}
	with( lineObjectHandle.style )
	{
		width = boxWidth +"px";
		height = boxHeight +"px";
		left = xMin +"px";
		top = yMin +"px";
	}
}

CalendarDivObj.prototype.updateFrame=function()
{
	var
		posBaseTop = 0,//findPos(this.reloj)[1],
		posBaseLeft = 0,//findPos(this.reloj)[0],
		minAngle	= (45+this.fechaActual.getMinutes())/30*Math.PI,
		houAngle	= ( 9+this.fechaActual.getHours())/6*Math.PI;
	this.drawLine( 1, posBaseLeft+50, posBaseTop+50, posBaseLeft+50+40*Math.cos( minAngle ), posBaseTop+50+40*Math.sin( minAngle ) );
	this.drawLine( 2, posBaseLeft+50, posBaseTop+50, posBaseLeft+50+30*Math.cos( houAngle ), posBaseTop+50+30*Math.sin( houAngle ) );
}
CalendarDivObj.prototype.inicializeOptions = function(e)
{
	var opciones = this.getOptionsArray(e.getAttribute("opciones"));
	this.iconoSrc = e.getAttribute("icono");
	this.diaLink = e.getAttribute("diaLink");
	this.marcados = e.getAttribute("marcar");
	if(!this.marcados)this.marcados="";
	this.tipoReloj = 0;
	this.alineacion=0;
	for(var i=0; i<opciones.length; i++){
		switch(this.getOption(opciones[i])){
			case 0:
				break;
			case 1:
				if(this.getOptionValue(opciones[i]).search(/basic/i)>=0)
					this.tipo=0;
				else this.tipo=1;
				break;
			case 2:
				if(this.getOptionValue(opciones[i]).search(/basic/i)>=0)
					this.tipoReloj=1;
				else this.tipoReloj=2;
				break;
			case 3:
				break;
		}
	}
}
CalendarDivObj.prototype.getOptionsArray = function(opcionesString)
{
	return opcionesString.split(";");
}
CalendarDivObj.prototype.getOptionValue = function(opcion)
{
	return opcion.split(":")[1];
}
CalendarDivObj.prototype.getOption = function(opcion)
{
	if(opcion.search(/controles:/i)>=0) return 1;
	if(opcion.search(/selectorHora:/i)>=0) return 2;
	return 0;
}
/*###############################################################################
         Funciones de formatos de dias y meses
###############################################################################*/
/* Funci�n que regresa el nombre corto del dia */
CalendarDivObj.prototype.getDiaNombreCorto=function(dia)
{
	var nombre = this.diasNomCorto[dia];
	return nombre;
}
/* Funci�n que regresa el nombre del dia */
CalendarDivObj.prototype.getDiaNombre=function(dia)
{
	var nombre = this.diasNom[dia];
	return nombre;
}
/*Funci�n que regresa el nombre corto del mes*/
CalendarDivObj.prototype.getMesNombreCorto=function(mes)
{
	var nombre = this.mesesNomCorto[mes];
	return nombre;
}
/*Funci�n que regresa el nombre del mes*/
CalendarDivObj.prototype.getMesNombre=function(mes)
{
	var nombre = this.mesesNom[mes];
	return nombre;
}
/*Funci�n que regresa el n�mero de dias del mes*/
CalendarDivObj.prototype.getDiasMes=function(mes, anio)
{
	var dias = this.mesesNum[mes];
	var tipoAnio = this.getAnioBisiesto(anio);
	if(mes==1&&tipoAnio==1){
		return 29;
	}
	return dias;
}
/*Funci�n que regresa 1 si el a�o es bisiesto y 0 si no lo es*/
CalendarDivObj.prototype.getAnioBisiesto=function(anio)
{
	if(((anio % 4 == 0) && (anio % 100 != 0)) || (anio % 400 == 0)) return 1;
	return 0;
}
/*###############################################################################
               Funcion de inicializaci�n de un objeto Calendar
###############################################################################*/
CalendarDivObj.prototype.init = function(e)
{
	calendario = document.createElement("div");
	this.calendario = calendario;
	if(this.tipo==1){
		calendario.appendChild(this.getBarraPresentacion());
		calendario.appendChild(this.getCuerpoCalendario());
		calendario.appendChild(this.getBarraAyuda());
		calendario.appendChild(this.getControlesCalendario(this.tipo, this.alineacion));
		calendario.className = "CalendarioBig";
	} else {
		calendario.appendChild(this.getControlesCalendario(this.tipo, this.alineacion));
		calendario.appendChild(this.getCuerpoCalendario());
		calendario.appendChild(this.getBarraAyuda());
		calendario.className = "CalendarioSmall";
	}
	if(this.tipoCalendario.search(/flat/i)>=0){
		e.appendChild(calendario);
	}
	else {
		calendario.className += " CalendarioPopHidden";
		var target = document.getElementById(e.getAttribute("target"));
		if(BrowserDetect.browser.search(/explorer/i)>=0)
		{
			e.setAttribute("cal",calendario);
			target.setAttribute("cal",calendario);
			target.setAttribute("trigger",e);
			calendario.setAttribute("div",e);
			calendario.setAttribute("cal",calendario);
			calendario.setAttribute("tipoReloj",this.tipoReloj);
			if(this.tipoReloj!=0){
				calendario.setAttribute("selectorHora",this.getSelectorHora(this.tipoReloj));
				calendario.selectorHora.className += " CalendarioPopHidden";
				document.body.appendChild(calendario.selectorHora);
				calendario.selectorHora.style.top = (findPos(calendario)[1]+calendario.offsetHeight)+"px";
				calendario.selectorHora.style.left = findPos(calendario)[0]+"px";
			}
		}else{
			e.cal = calendario;
			target.cal = calendario;
			target.trigger = e;
			calendario.div = e;
			calendario.cal = calendario;
			calendario.tipoReloj = this.tipoReloj;
			if(this.tipoReloj!=0){
				calendario.selectorHora = this.getSelectorHora(this.tipoReloj);
				calendario.selectorHora.className += " CalendarioPopHidden";
				document.body.appendChild(calendario.selectorHora);
				calendario.selectorHora.style.top = (findPos(calendario)[1]+calendario.offsetHeight)+"px";
				calendario.selectorHora.style.left = findPos(calendario)[0]+"px";
			}
		}
		e.onclick = this.activarCalendario;
		$('body').click(function(){
			$(".CalendarioSmall").slideUp('slow',function(){
				this.cal.className = this.cal.className.replace("Unhidden","Hidden");
			});
		});
		document.body.appendChild(calendario);
		target.onclick = this.activarCalendario;
		//calendario.onclick = this.desactivarCalendario;
	}
}
/*###############################################################################
         Funci�n que inicializa todos los objetos Calendar del documento
###############################################################################*/
function CalendarConvert()
{
  /* Esta funcion encuentra todos los elementos DIV que tienen la clase Calendar 
     del documento, despues los combierte a la interfaz Calendar.

  */
  var
    tempObj, /* Objeto temporal Calendar */
    i; /* indice para el ciclo */

  /* Se crea un objeto Calendar para obtener el valor del classMain */
  	tempObj = new CalendarDivObj();

	var calendarFlats = getElementsByClass(tempObj.classFlat);
  	for (i=0; i < calendarFlats.length; i++) {
		calendarFlats[i].Calendar = new CalendarDivObj(calendarFlats[i], "Flat");
  	}
	var calendarPops = getElementsByClass(tempObj.classPop);
  	for (i=0; i < calendarPops.length; i++) {
		calendarPops[i].Calendar = new CalendarDivObj(calendarPops[i], "Popup");
  	}
	
  return this;
}

/*###############################################################################
           Funciones de apoyo para el calendario
###############################################################################*/
/* Funcion que regresa un arreglo de objetos con la clase definida */
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if (node == null) node = document;
	if (tag == null) tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if (pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}
/* Funcion que regresa la posicion del objeto en la pantalla en pixeles */
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}
/* funcion que regresa el valor true si la tecla precionada es un numero o es valida*/
function justNumbers(e)
{
	var keynum;
	var keychar;
	var numcheck;
	
	if(window.event) // IE
	  {
	  keynum = e.keyCode;
	  }
	else if(e.which) // Netscape/Firefox/Opera
	  {
	  keynum = e.which;
	  }
	keychar = String.fromCharCode(keynum);
	numcheck = /\d/;
	if(keynum&&keynum!=8&&keynum!=13){
		return numcheck.test(keychar);
	} else {
		return true;
	}
}

/*###############################################################################
           Funci�n para iniciar Calendar desde el evento window.onload
###############################################################################*/

function CalendarConvertOnLoad()
{
  /* Esta funci�n agrega CalendarConvert al evento window.onload para que corra
     despues de que el documento termine de cargar.
  */
  var oldOnLoad;


  /* Taken from: http://simon.incutio.com/archive/2004/05/26/addLoadEvent */

  oldOnLoad = window.onload;
   if (typeof window.onload != 'function') {
    window.onload = function() {
      CalendarConvert();
    };
  } else {
    window.onload = function() {
      oldOnLoad();
       CalendarConvert();
    };
  }
}

/*###############################################################################
                         Ejecuta CalendarConvertOnLoad
###############################################################################*/
  CalendarConvertOnLoad();
  
