Calendar=(
	function() {

		/* Constructor */
		function y(at){
			at=at||{};
			// Prepara los valores de configuración, permitiendo overrides
			this.args = at = arrayWithOverrides(at,{
				animation:!c, 
				cont:null, 
				bottomBar:true,
				date:true, 
				fdow:translate("fdow"), 
				min:null, 
				max:null, 
				reverseWheel:false,
				selection:[], 
				checkin:{},
				checkout:{},
				enableHotelToolbar:false,
				selectionType:y.SEL_SINGLE, 
				weekNumbers:false, 
				align:"Bl/ / /T/r", 
				inputField:null,
				trigger:null, 
				dateFormat:"%Y-%m-%d", 
				opacity:j?1:3, 
				titleFormat:"%b %Y", 
				showTime:false, 
				timePos:"right", 
				time:true, 
				minuteStep:5,
				leftMonths: false,		// Nuevo: colocar los nombres de los meses a la izquierda
				multipleMonths: false, // Nuevo
				enableRestrictions: true, // Nuevo: permite evitar dias de entrada, de salida, intermedios...
				enableYearArrows: true,
				monthColumns: 1, // NUevo
				monthRows: 2, // Nuevo. Funciona si multipleMonths es true
				disabled:ad, 
				dateInfo:ad, 
				onChange:ad, 
				onSelect:ad, 
				onTimeChange:ad, 
				onFocus:ad, 
				onBlur:ad
			});
			this.checkin = new Object();
			this.checkout = new Object();

			this.handlers={};
			var P=this, D=new Date();
			at.min=ToDate(at.min);
			at.max=ToDate(at.max);
			if(at.date===true){
					at.date=D
			}
			if(at.time===true){
					at.time=D.getHours()*100+Math.floor(D.getMinutes()/at.minuteStep)*at.minuteStep
			}
			this.date=ToDate(at.date);
			this.time=at.time;
			this.fdow=at.fdow;
			m("onChange onSelect onTimeChange onFocus onBlur".split(/\s+/),
				function(av){
					var au=at[av];
					if(!(au instanceof Array)){
							au=[au]
					}
					P.handlers[av]=au
				}
			);
			this.selection=new y.Selection(at.selection,at.selectionType,R,this);
			var ar=K.call(this);
			if(at.cont){
					W(at.cont).appendChild(ar)
			}
			if(at.trigger){
					this.manageFields(at.trigger,at.inputField,at.dateFormat)
			}
		}

		var S=navigator.userAgent, s=/opera/i.test(S), ai=/Konqueror|Safari|KHTML/i.test(S), j=/msie/i.test(S)&&!s&&!(/mac_powerpc/i.test(S)), c=j&&/msie 6/i.test(S), x=/gecko/i.test(S)&&!ai&&!s&&!j, q=y.I18N={};
		var l=y.prototype;
		y.SEL_NONE=0; 
		y.SEL_SINGLE=1; 
		y.SEL_MULTIPLE=2; 
		y.SEL_WEEK=3; 
		y.dateToInt=dateToString; 
		y.intToDate=PartsToDate; 
		y.printDate=ab;
		y.formatString=k; 
		y.i18n=translate; 

		y.LANG=
			function(P,D,ar){
				q.__=q[P]={
					name:D,data:ar
				}
			};

		y.setup=
			function(D){
				return new y(D)
			};

// Métodos de l

		l.moveTo=
			function(aG,aD){
				aG=ToDate(aG);
				var az = this.args;
				var mincopy = az.min ? new Date(az.min): null;
				var aC=af(aG,this.date,true),au, aH=mincopy&&af(aG,mincopy);
/*				var fakeaI=max&&af(aG,max);
				var xmax = new Date(az.max);
				if( xmax != null ) {
					xmax.setMonth(xmax.getMonth()+1);
				}
				var fakeaI=xmax&&af(aG,xmax); */
				var aI=az.max&&af(aG,az.max);
				if(!az.animation){
					aD=false
				}
				ae(aH!=null&&aH<=1,[this.els.navPrevMonth,this.els.navPrevYear],"DynarchCalendar-navDisabled");
				ae(aI!=null&&aI>=-1,[this.els.navNextMonth,this.els.navNextYear],"DynarchCalendar-navDisabled");
				if(aH<-1){
					aG=mincopy;
					au=1;
					aC=0
				}
				if(aI>1){
					aG=az.max;
					au=2;
					aC=0
				}
				this.date=aG;
				this.refresh(!!aD);
				this.callHooks("onChange",this,aG,aD);
				if(aD&&!(aC==0&&aD==2)){
					if(this._bodyAnim){
						this._bodyAnim.stop()
					}
					var aw=this.els.body, ax=createElement("div","DynarchCalendar-animBody-"+U[aC],aw), aF=aw.firstChild, av=am(aF)||0.7, ay=au?Z.brakes:aC==0?Z.shake:Z.accel_ab2, aE=aC*aC>4, ar=aE?aF.offsetTop:aF.offsetLeft, aB=ax.style, aA=aE?aw.offsetHeight:aw.offsetWidth;
					if(aC<0){
						aA+=ar
					}else{
						if(aC>0){
							aA=ar-aA
						} else { 
							aA=Math.round(aA/7);
							if(au==2){
								aA=-aA
							}
						}
					}
					if(!au && aC!=0){
						var P=ax.cloneNode(true), D=P.style, at=2*aA;
						P.appendChild(aF.cloneNode(true));
						D[aE?"marginTop":"marginLeft"]=aA+"px";
						aw.appendChild(P)
					}
					aF.style.visibility="hidden";
					ax.innerHTML=multipleMonthsHtml(this);
					this._bodyAnim=ap({
						onUpdate:v(
							function(aK,aM){
								var aL=ay(aK);
								if(P){
									var aJ=aM(aL,aA,at)+"px"
								}
								if(au){
									aB[aE?"marginTop":"marginLeft"]=aM(aL,aA,0)+"px"
								} else {
									if(aE||aC==0){
										aB.marginTop=aM(aC==0?ay(aK*aK):aL,0,aA)+"px";
										if(aC!=0){
											D.marginTop=aJ
										}
									}
									if(!aE||aC==0){
										aB.marginLeft=aM(aL,0,aA)+"px";
										if(aC!=0){
											D.marginLeft=aJ
										}
									}
								}
								if(this.args.opacity>2&&P){
									am(P,1-aL);
									am(ax,aL)
								}
							},this),
						onStop:v(
							function(aJ){
								aw.innerHTML=multipleMonthsHtml(this,aG);
								this._bodyAnim=null
							},this)
					})
				}
				this._lastHoverDate=null;
				return aH>=-1&&aI<=1
			};

		l.isDisabled=
			function(D){
				var P=this.args;
				/*console.log(D + "," + P.min + ":" + (P.min && af(D,P.min)<0) +","+ 
					(P.max&&af(D,P.max)>0) +","+ P.disabled(D));*/
				return(P.min&&af(D,P.min)<0) || (P.max&&af(D,P.max)>0) || P.disabled(D)
			};

		l.toggleMenu=
			function(){
				u(this,!this._menuVisible)
			};

		l.refresh=
			function(D){
				var P=this.els;
				if(!D){
					P.body.innerHTML=multipleMonthsHtml(this) //contentsHtml(this)
				}
				P.title.innerHTML=monthHeader(this);
				P.yearInput.value=this.date.getFullYear()
			};

		l.redraw=
			function(){
				var D=this.els;
				this.refresh();
				D.dayNames.innerHTML=columnHeaders(this);
				D.menu.innerHTML=menuHtml(this);
				if(D.bottomBar){
					if( this.args.enableHotelToolbar ) {
						D.bottomBar.innerHTML=hotelToolbarHtml(this);
					} else {
						D.bottomBar.innerHTML=bottomHtml(this);
					}
				}
				t(D.topCont,v(
					function(ar){
						var P=r[ar.className];
						if(P){
							D[P]=ar
						}
						if(ar.className=="DynarchCalendar-menu-year"){
							p(ar,this._focusEvents);D.yearInput=ar
						} else {
							if(j){
								ar.setAttribute("unselectable","on")
							}
						}
					},this)
				);
				this.setTime(null,true)
			};

		// Nuevo: resetear todos los checkins
		l.clearCheckIn=
			function() {
				this.checkin = new Object();
				this.checkout = new Object();
			};
		// Nuevo: restringir dia de entrada
		l.allowCheckIn=
			function(D,S) {
				if(S != null) {
					this.checkin[D] = S;
					this.checkout[calcTomorrow(D)] = S;
				} 
				var ret = this.checkin[D];
				if( ret == null ) {
					return true;
				}
				return ret;
			};

		// Nuevo: impedir la seleccion de dias en grisecito
		l.isWithinRange = function(D,S) {
				var ret = this.getDateElement(D);
				if( ret == null )
					return false;
				var cl = ret.getAttribute("class");
				if( cl == null ) {
					return true;
				}
				if(cl.indexOf("disabled") != -1)
					return false;
				return true;
		};

		// Nuevo: restringir dia de salida
		l.allowCheckOut=
			function(D,S) {
				if( S != null ) {
					this.checkout[D] = S;
				}
				var ret = this.checkout[D];
				if( ret == null ) {
					return true;
				}
				return ret;
			};

		// Nuevo: averiguar si la seleccion es valida
		l.isSelectionValid = function() {
			var d = this.selection.sel[0];
			if( d.length < 2 ) {
				return false;
			}
			if( d[0] == d[1] ) {
				return false;
			}
			var start=stringToDate(d[0]);
			var end = stringToDate(d[1]);
			if( d[0] > d[1] ) {
				start = stringToDate(d[1]);
				end = stringToDate(d[0]);
			}
			var days = Math.floor((end - start) / 86400000) + 1;
			if(this.args.enableRestrictions) {
				// Revisar los checkin
				var cur = start;
				var i;
				for(i=0; i<(days-1); ++i) {
					if(!this.allowCheckIn(dateToString(cur)))
						return false;
					if(!this.isWithinRange(dateToString(cur)))
						return false;
					cur.setDate(cur.getDate() + 1);
				}
			}
			return true;
		}

		// Nuevo
		l.getDateElement = function (D) {
				var E = this.els.body;
				var divs = E.getElementsByTagName("DIV");
				var c;
				for( c = 0; c < divs.length; ++c) {
					var div = divs[c];
					var attr = div.getAttribute("dyc-date");
					if(attr==D)
						return div;
				}
				return null;
		}

		// NUevo
		l.refreshToolbar = function() {
			if( this.args.enableHotelToolbar ) {
				this.els.bottomBar.innerHTML = hotelToolbarHtml(this);
			}
		}

		function calcTomorrow(D) {
				var d = stringToDate(D);
				d.setDate(d.getDate() + 1);
				return dateToString(d);
		}

		function calcYesterday(D) {
				var d = stringToDate(D);
				d.setDate(d.getDate() - 1);
				return dateToString(d);
		}

		function stringToDate(D) {
			return new Date(D.toString().substr(0,4), D.toString().substr(4,2) - 1, D.toString().substr(6,2));
		}

		l.setLanguage=
			function(D){
				var P=y.setLanguage(D);
				if(P){
					this.fdow=P.data.fdow;
					this.redraw()
				}
			};




		y.setLanguage=
			function(D){
				var P=q[D];
				if(P){
					q.__=P
				}
				return P
			};

		l.focus=
			function(){
				try{
					this.els[this._menuVisible?"yearInput":"focusLink"].focus()
				} catch(D) {
				}
				i.call(this)
			};

		l.blur=
			function(){
			this.els.focusLink.blur();
			this.els.yearInput.blur();
			z.call(this)};

		l.showAt=
			function(P,ax,av){
				if(this._showAnim){
				this._showAnim.stop()}av=av&&this.args.animation;
				var aw=this.els.topCont, ar=this, D=this.els.body.firstChild, au=D.offsetHeight, at=aw.style; at.position="absolute"; 
				at.left=P+"px"; 
				at.top=ax+"px";
				at.zIndex=10000;
				at.display="";
				if(av){
					D.style.marginTop=-au+"px";
					this.args.opacity>1&&am(aw,0);
					this._showAnim=ap({
						onUpdate:
							function(ay,az){
								D.style.marginTop=-az(Z.accel_b(ay),au,0)+"px";ar.args.opacity>1&&am(aw,ay)
							},
						onStop:
							function(){
								ar.args.opacity>1&&am(aw,"");ar._showAnim=null
							}
					})
				}
			};

		l.hide=
			function(){
				var at=this.els.topCont, P=this, D=this.els.body.firstChild, ar=D.offsetHeight, au=J(at).y;
				if(this.args.animation){
					if(this._showAnim){
						this._showAnim.stop()
					}
					this._showAnim=ap({
					onUpdate:
						function(av,aw){
							P.args.opacity>1&&am(at,1-av);
							D.style.marginTop=-aw(Z.accel_b(av),0,ar)+"px";
							at.style.top=aw(Z.accel_ab(av),au,au-10)+"px"
						},
					onStop:
						function(){
							at.style.display="none";
							D.style.marginTop="";
							P.args.opacity>1&&am(at,"");
							P._showAnim=null
						}
					})
				} else {
					at.style.display="none"
				}
				this.inputField=null
			};

		l.popup=
			function(D,at){
				D=W(D);
				if(!at){
					at=this.args.align
				}
				at=at.split(/\x2f/);
				var ar=J(D), aw=this.els.topCont, ay=aw.style, au, ax=getScreenInfo();
				ay.visibility="hidden";
				ay.display="";
				this.showAt(0,0);
				document.body.appendChild(aw);
				au={x:aw.offsetWidth,y:aw.offsetHeight};
				function P(az){
					var aA={x:av.x,y:av.y};
					if(!az){
						return aA
					}
					if(/B/.test(az)){
						aA.y+=D.offsetHeight
					}
					if(/b/.test(az)){
						aA.y+=D.offsetHeight-au.y
					}
					if(/T/.test(az)){
						aA.y-=au.y
					}
					if(/l/.test(az)){
						aA.x-=au.x-D.offsetWidth
					}
					if(/L/.test(az)){
						aA.x-=au.x
					}
					if(/R/.test(az)){
						aA.x+=D.offsetWidth
					}
					if(/c/i.test(az)){
						aA.x+=(D.offsetWidth-au.x)/2
					}
					if(/m/i.test(az)){
						aA.y+=(D.offsetHeight-au.y)/2
					}
					return aA
				}
				var av=ar;
				av=P(at[0]);
				if(av.y<ax.y){
					av.y=ar.y;
					av=P(at[1])
				}
				if(av.x+au.x>ax.x+ax.w){
					av.x=ar.x;
					av=P(at[2])
				}
				if(av.y+au.y>ax.y+ax.h){
					av.y=ar.y;
					av=P(at[3])
				}
				if(av.x<ax.x){
					av.x=ar.x;
					av=P(at[4])
				}
				this.showAt(av.x,av.y,true);
				ay.visibility="";
				this.focus()
			};

		l.manageFields=
			function(ar,P,D){
				P=W(P);
				p(W(ar),"click",v(
				function(){
					this.inputField=P;
					this.dateFormat=D;
					if(this.selection.type==y.SEL_SINGLE){
						var aw,av,au,at;
						aw=/input|textarea/i.test(P.tagName)?P.value:(P.innerText||P.textContent);
						if(aw){
							av=/(^|[^%])%[bBmo]/.exec(D);
							au=/(^|[^%])%[de]/.exec(D);
							if(av&&au){
								at=av.index<au.index
							}
							aw=Calendar.parseDate(aw,at);
							if(aw){
								this.moveTo(aw);
								this.selection.set(aw,false,true)
							}
						}
					}
					this.popup(ar)
				},this))
			};


		l.callHooks=
			function(ar){
				var at=b(arguments,1),D=this.handlers[ar],P=0;
					for(;P<D.length;++P){
						D[P].apply(this,at)
					}
				};

		l.addEventListener=
			function(P,D){
				this.handlers[P].push(D)
			};

		l.removeEventListener=
			function(at,ar){
				var D=this.handlers[at], P=D.length;
				while(--P>=0){
					if(D[P]===ar){
						D.splice(P,1)
					}
				}
			};

		l.getTime=
			function(){
				return this.time
			};

		l.setTime=
			function(au,P){
				if(this.args.showTime){
					au=this.time=au!=null?au:this.time;
					var ar=this.getHours(), D=this.getMinutes(), at=ar<12;
					if(this.args.showTime==12){
						if(ar==0){
							ar=12
						}
						if(ar>12){
							ar-=12
						}
						this.els.timeAM.innerHTML=translate(at?"AM":"PM")
					}
					if(ar<10){
						ar="0"+ar
					}
					if(D<10){
						D="0"+D
					}
					this.els.timeHour.innerHTML=ar;
					this.els.timeMinute.innerHTML=D;
					if(!P){
						this.callHooks("onTimeChange",this,au)
					}
				}
			};

		l.getHours=
			function(){
				return Math.floor(this.time/100)
			};

		l.getMinutes=
			function(){
				return this.time%100
			};

		l.setHours=
			function(D){
				if(D<0){
					D+=24
				}
				this.setTime(100*(D%24)+this.time%100)
			};

		l.setMinutes=
			function(D){
				if(D<0){
					D+=60
				}
				this.setTime(100*this.getHours()+(D%60))
			};

		l._getInputYear=
			function(){
				var D=parseInt(this.els.yearInput.value,10);
				if(isNaN(D)){
					D=this.date.getFullYear()
				}
				return D
			};

		l._showTooltip=
			function(D){
				var P="",at,ar=this.els.tooltip;
				if(D){
					D=PartsToDate(D);
					at=this.args.dateInfo(D);
					if(at&&at.tooltip){
						P="<div class='DynarchCalendar-tooltipCont'>"+ab(D,at.tooltip)+"</div>"
					}
				}
				ar.innerHTML=P
			};


/************************************************
 * Funciones globales de generación de la vista *
 ************************************************/

		var ah=" align='center' cellspacing='0' cellpadding='0'";

		/* Crea la fila de encabezados (wk, Mo, Tu, We...). Antes era h(D) */
		function columnHeaders(D){
			var ar=["<table",ah,"><tr>"], P=0;
			if(D.args.weekNumbers){
				ar.push("<td><div class='DynarchCalendar-weekNumber'>",translate("wk"),"</div></td>")
			}
			while(P<7){
				var at=(P+++D.fdow)%7;
				ar.push("<td><div", translate("weekend").indexOf(at)>=0?" class='DynarchCalendar-weekend'>":">", translate("sdn")[at], "</div></td>")
			}
			ar.push("</tr></table>");
			return ar.join("")
		}

		// Nuevo: mas de un mes a la vez
		function multipleMonthsHtml(aw,aG,aD) {	
			var av=[], aA=0;
			var drawingMonth = aG||aw.date;
			var row=0, column=0;
			var finalRow = (aw.args.multipleMonths ? aw.args.monthRows - 1 : 0 );
			var finalCol = (aw.args.multipleMonths ? aw.args.monthColumns - 1 : 0 );
			av[aA++]="<table>";
			var firstMonth = true;
			for( row = 0; row <= finalRow; row++ ) {
				av[aA++]="<tr>";
				for( col = 0; col <= finalCol; col++ ) {
					var lastMonth = (col == finalCol) && (row == finalRow);
					av[aA++]="<td>";
					av[aA++]=contentsHtml(aw,drawingMonth,aD, (col > 0) || (row > 0), firstMonth, lastMonth);
					drawingMonth.setMonth(drawingMonth.getMonth() + 1);
					av[aA++]="</td>";
					firstMonth = false;
				}
				av[aA++]="</tr>";
			}
			av[aA++]="</table>";
			drawingMonth.setMonth(drawingMonth.getMonth() - (finalRow+1) * (finalCol+1));
			return av.join("");
		}


		/* Dibuja el contenido del calendario.
		   Nuevo: si multipleMonths es true, oculta los dias de otros meses */
		function contentsHtml(aw,aG,aD,withHeader,withBottom){
			aG=aG||aw.date;
			aD=aD||aw.fdow;
			aG=new Date(aG);
			var av=[], aA=0;
			var aI=aG.getMonth(), D=aw.args.weekNumbers;
			aG.setDate(1);
			var az=(aG.getDay()-aD)%7;
			if(az<0){
				az+=7
			}
			aG.setDate(-az);aG.setDate(aG.getDate()+1);
			var aE=new Date(), at=aE.getDate(), P=aE.getMonth(), aJ=aE.getFullYear(); 
			if( withHeader ) {
				av[aA++] = fakeHeader(aw);
			}

			av[aA++]="<table class='DynarchCalendar-bodyTable'"+ah+">";
			/* aC es la fila de fechas. Con 6 entran días del mes pasado y del próximo */
			for(var aC=0;aC<6;++aC){
				// Tal vez nos debamos saltar la fila
				if( aw.args.multipleMonths ) {
					if( ( aC > 0 ) && aG.getMonth() != aI ) {
						continue;
					}
				}
				av[aA++]="<tr class='DynarchCalendar-week";
				if(aC==0){
					av[aA++]=" DynarchCalendar-first-row"
				}
				if(aC==5){
					av[aA++]=" DynarchCalendar-last-row"
				}
				av[aA++]="'>";
				// Nuevo: nombre del mes en el lateral
				if( aw.args.leftMonths && !aC ) {
					av[aA++]="<td rowspan=6 style='vertical-align: bottom' width=20><div style=vertical-align:bottom'><img style='vertical-align: bottom' src='/generatexto.php?text="+ab(aw.date, aw.args.titleFormat)+"' /></div></td>";
				}
				if(D){
					/* Coloca el número de semana */
					av[aA++]="<td class='DynarchCalendar-first-col'><div class='DynarchCalendar-weekNumber'>"+a(aG)+"</div></td>"
				}
				/* Coloca el día */
				for(var aB=0;aB<7;++aB){
					var aF=aG.getDate(), ay=aG.getMonth(), au=aG.getFullYear(), ar=10000*au+100*(ay+1)+aF, aH=aw.selection.isSelected(ar), ax=aw.isDisabled(aG); av[aA++]="<td class='";
					var doShow = true;
					if(ay!=aI){
						if( aw.args.multipleMonths ) {
							doShow = false;
							ax = true;
						}
					}

					if(aB==0&&!D){
						av[aA++]=" DynarchCalendar-first-col"
					}
					if(aB==0&&aC==0){
						aw._firstDateVisible=ar
					}
					if(aB==6){
						av[aA++]=" DynarchCalendar-last-col";
						if(aC==5){
							aw._lastDateVisible=ar
						}
					}
					if(aH && doShow){
						av[aA++]=" DynarchCalendar-td-selected"
					}
					av[aA++]="'><div dyc-type='date' unselectable='on' ";
					if( doShow ) {
						av[aA++] = "dyc-date='"+ar+"' ";
					}
					if(ax){
						av[aA++]="disabled='1' "
					}
					av[aA++]="class='DynarchCalendar-day";
					if(translate("weekend").indexOf(aG.getDay())>=0){
						av[aA++]=" DynarchCalendar-weekend"
					}
					if(ay!=aI){
						if( !doShow ) {
							av[aA++]=" DynarchCalendar-day-hidden";
						} else {
							av[aA++]=" DynarchCalendar-day-othermonth";
						}
					} else {
						// Es de este mes, pero tal vez no pueda ser seleccionado
						if(ax){
								av[aA++]=" DynarchCalendar-day-disabled"
						}
					}
					if(aF==at&&ay==P&&au==aJ){
						av[aA++]=" DynarchCalendar-day-today"
					}
					if( aw.args.enableRestrictions && doShow ) {
						if( (!aw.allowCheckIn(ar) ) && (!aw.allowCheckOut(ar) ) ) {
							av[aA++]=" DynarchCalendar-day-reserved";
						} else {
							if( !aw.allowCheckIn(ar) ) {
								av[aA++]=" DynarchCalendar-day-mustcheckout";
							} else if( !aw.allowCheckOut(ar) ) {
								av[aA++]=" DynarchCalendar-day-onlycheckin";
							}
					
						}
					}

					if(aH && doShow){
						av[aA++]=" DynarchCalendar-day-selected"
					}
					ax=aw.args.dateInfo(aG);
					if(ax&&ax.klass){
						av[aA++]=" "+ax.klass
					}
					if( doShow ) {
						av[aA++]="'>"+aF+"</div></td>";
					} else {
						av[aA++]="'>&nbsp;</div></td>";
					}
					aG.setDate(aF+1)
				}
				av[aA++]="</tr>"
			}
			av[aA++]="</table>";

			return av.join("")
		}

		function fakeHeader(D){
			// Nuevo: con nombre del mes en el lateral, no mostramos el mes aqui
			if( D.args.leftMonths ) {
				return "";
			}

			var P=["<table class='DynarchCalendar-topCont'",ah,"><tr><td><div class='DynarchCalendar'>","<div class='DynarchCalendar-topBar'><table class='DynarchCalendar-titleContSub'",ah,"><tr><td><div  class='DynarchCalendar-titleSub'>",
			"<div unselectable='on'>"+ ab(D.date, D.args.titleFormat) +"</div>",
			"</div></td></tr></table>"];
			//P.push(columnHeaders(D));
			P.push("</div></td></tr></table>");
			return P.join("")
		}

		function monthTableHeader(D){
			// Nuevo: con nombre del mes en el lateral, no mostramos el mes aqui
			var P=["<table class='DynarchCalendar-topCont'",ah,"><tr><td><div class='DynarchCalendar'>",!j?"<button class='DynarchCalendar-focusLink'></button>":"<a class='DynarchCalendar-focusLink' href='#'></a>"];
			P.push("<div class='DynarchCalendar-topBar'>");
			if(D.args.enableYearArrows) {
				P.push("<div dyc-type='nav' dyc-btn='-Y' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-prevYear'><div></div></div>");
				P.push("<div dyc-type='nav' dyc-btn='+Y' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-nextYear'><div></div></div>");
			} 			
			P.push("<div dyc-type='nav' dyc-btn='-M' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-prevMonth'><div></div></div><div dyc-type='nav' dyc-btn='+M' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-nextMonth'><div></div></div><table class='DynarchCalendar-titleCont'");
			P.push(ah);
			P.push("><tr><td><div dyc-type='title' dyc-btn='menu' dyc-cls='hover-title,pressed-title' class='DynarchCalendar-title'>");
			P.push(monthHeader(D));
			P.push("</div></td></tr></table>");
			return P.join("")
		}

		function schemaHtml(D){
			var P=
			[monthTableHeader(D), "<div class='DynarchCalendar-dayNames'>",columnHeaders(D),"</div></div><div class='DynarchCalendar-body'></div>"];
			/* Dibuja el área de la hora */
			if(!D.args.multipleMonths) {
				if(D.args.bottomBar||D.args.showTime){
					P.push("<div class='DynarchCalendar-bottomBar'>",bottomHtml(D),"</div>")
				} 
			} else if( D.args.enableHotelToolbar) {
				P.push("<div class='DynarchCalendar-bottomBar'>",hotelToolbarHtml(D),"</div>")
			}
			P.push("<div class='DynarchCalendar-menu' style='display: none'>",menuHtml(D),"</div><div class='DynarchCalendar-tooltip'></div></div></td></tr></table>");
			return P.join("")
		}

		/* Antes F(D) */
		function monthHeader(D){
			var formatted='&nbsp;';
			if( !D.args.leftMonths ) {
				formatted = ab(D.date, D.args.titleFormat);
			}
			return"<div unselectable='on'>"+formatted+"</div>"
		}

		function menuHtml(P){
			var au=["<table height='100%'",ah,"><tr><td><table style='margin-top: 1.5em'",ah,"><tr><td colspan='3'><input dyc-btn='year' class='DynarchCalendar-menu-year' size='6' value='",P.date.getFullYear(),"' /></td></tr><tr><td><div dyc-type='menubtn' dyc-cls='hover-navBtn,pressed-navBtn' dyc-btn='today'>",translate("goToday"),"</div></td></tr></table><p class='DynarchCalendar-menu-sep'>&nbsp;</p><table class='DynarchCalendar-menu-mtable'",ah,">"],av=translate("smn"),at=0,D=au.length,ar;
			// Crea las fechas del menú
			while(at<12){
				au[D++]="<tr>";
				for(ar=4;--ar>0;){
					au[D++]="<td><div dyc-type='menubtn' dyc-cls='hover-navBtn,pressed-navBtn' dyc-btn='m"+at+"' class='DynarchCalendar-menu-month'>"+av[at++]+"</div></td>"
				}
				au[D++]="</tr>"
			}
			au[D++]="</table></td></tr></table>";
			return au.join("")
		}

		function clockHtml(D,P){
			// Crea hora, minuto
			P.push("<table class='DynarchCalendar-time'"+ah+"><tr><td rowspan='2'><div dyc-type='time-hour' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-hour'></div></td><td dyc-type='time-hour+' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-up'></td><td rowspan='2' class='DynarchCalendar-time-sep'></td><td rowspan='2'><div dyc-type='time-min' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-minute'></div></td><td dyc-type='time-min+' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-up'></td>");
			// AM/PM
			if(D.args.showTime==12){
				P.push("<td rowspan='2' class='DynarchCalendar-time-sep'></td><td rowspan='2'><div class='DynarchCalendar-time-am' dyc-type='time-am' dyc-cls='hover-time,pressed-time'></div></td>")
			}
			P.push("</tr><tr><td dyc-type='time-hour-' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-down'></td><td dyc-type='time-min-' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-down'></td></tr></table>")
		}

		/* Devuelve el área inferior del reloj (antes, H(D))*/
		function bottomHtml(D){
			var ar=[], P=D.args;
			ar.push("<table",ah," style='width:100%'><tr>");

			function at(){
				if(P.showTime){
					ar.push("<td>");
					clockHtml(D,ar);
					ar.push("</td>")
				}
			}
			if(P.timePos=="left"){
				at()
			}
			if(P.bottomBar){
				ar.push("<td>");
				ar.push("<table",ah,"><tr><td><div dyc-btn='today' dyc-cls='hover-bottomBar-today,pressed-bottomBar-today' dyc-type='bottomBar-today' class='DynarchCalendar-bottomBar-today'>",translate("today"),"</div></td></tr></table>");
				ar.push("</td>")
			}
			if(P.timePos=="right"){
				at()
			}
			ar.push("</tr></table>");
			return ar.join("")
		}

		/* Nuevo: devuelve una barra de estado */
		function hotelToolbarHtml(D){
			var ar=[], P=D.args;
			ar.push("<table",ah," style='width:100%'><tr>");

			if(P.bottomBar){
				ar.push("<td>");
				ar.push("<table",ah,"><tr><td><div class='DynarchCalendar-bottomBar-today'>");
				if((!D.selection.sel.length) || (!D.selection.sel[0].length) ) {
					ar.push("No se han elegido fechas");
				} else {
					if( !D.isSelectionValid() ) {
						ar.push("Seleccion invalida");
					} else {
						var start = stringToDate(D.selection.sel[0][0]);
						var end = start;
						if( D.selection.sel[0][1] ) {
							end = stringToDate(D.selection.sel[0][1]);
						}
						var days = Math.floor(( end - start) /86400000) + 1;
						ar.push(days + " dias, " + (days-1) + " noches");
					}
				}
				ar.push(
				"</div></td></tr></table>");
				ar.push("</td>")
			}
			ar.push("</tr></table>");
			return ar.join("")
		}


		var r={"DynarchCalendar-topCont":"topCont","DynarchCalendar-focusLink":"focusLink",DynarchCalendar:"main","DynarchCalendar-topBar":"topBar","DynarchCalendar-title":"title","DynarchCalendar-dayNames":"dayNames","DynarchCalendar-body":"body","DynarchCalendar-menu":"menu","DynarchCalendar-menu-year":"yearInput","DynarchCalendar-bottomBar":"bottomBar","DynarchCalendar-tooltip":"tooltip","DynarchCalendar-time-hour":"timeHour","DynarchCalendar-time-minute":"timeMinute","DynarchCalendar-time-am":"timeAM","DynarchCalendar-navBtn DynarchCalendar-prevYear":"navPrevYear","DynarchCalendar-navBtn DynarchCalendar-nextYear":"navNextYear","DynarchCalendar-navBtn DynarchCalendar-prevMonth":"navPrevMonth","DynarchCalendar-navBtn DynarchCalendar-nextMonth":"navNextMonth"};

		function K(){
			var ar=createElement("div"), P=this.els={}, D={
				mousedown:v(mouseUpDownHandler,this,true), 
				mouseup:v(mouseUpDownHandler,this,false), 
				mouseover:v(mouseOverOutHandler,this,true), 
				mouseout:v(mouseOverOutHandler,this,false), 
				keypress:v(keyHandler,this)
			};
			D[x?"DOMMouseScroll":"mousewheel"]=v(E,this);
			if(j){
				D.dblclick=D.mousedown;
				D.keydown=D.keypress
			}
			ar.innerHTML=schemaHtml(this);
			t(ar.firstChild,
				function(au){
					var at=r[au.className];
					if(at){
					P[at]=au
					}
					if(j){
						au.setAttribute("unselectable","on")
					}
				});
			p(P.main,D);
			p([P.focusLink, P.yearInput], this._focusEvents={
				focus:v(i,this),
				blur:v(e,this)
			});
			this.moveTo(this.date,false);
			this.setTime(null,true);
			return P.topCont
		}

		function i(){
			if(this._bluringTimeout){
				clearTimeout(this._bluringTimeout)
			}
			this.focused=true;
			M(this.els.main,"DynarchCalendar-focused");
			this.callHooks("onFocus",this)
		}

		function z(){
			this.focused=false;
			aj(this.els.main,"DynarchCalendar-focused");
			if(this._menuVisible){
				u(this,false)
			}
			if(!this.args.cont){
				this.hide()
			}
			this.callHooks("onBlur",this)
		}

		function e(){
			this._bluringTimeout=setTimeout(v(z,this),50)
		}

		function N(D){
			switch(D){
				case"time-hour+":this.setHours(this.getHours()+1);break;
				case"time-hour-":this.setHours(this.getHours()-1);break;
				case"time-min+":this.setMinutes(this.getMinutes()+this.args.minuteStep);break;
				case"time-min-":this.setMinutes(this.getMinutes()-this.args.minuteStep);break;
				default:return
			}
		}

		var U={"-3":"backYear","-2":"back","0":"now","2":"fwd","3":"fwdYear"};

		function aa(P,at,D){
			if(this._bodyAnim){
				this._bodyAnim.stop()
			}
			var ar;
			if(at!=0){
				ar=new Date(P.date);
				ar.setDate(1);
				switch(at){
					case"-Y":
					case -2:ar.setFullYear(ar.getFullYear()-1);break;
					case"+Y":case 2:
					ar.setFullYear(ar.getFullYear()+1);break;
					case"-M":
					case -1:ar.setMonth(ar.getMonth()-1);break;
					case"+M":
					case 1:
						// Nuevo: evitar ir a meses que no nos tocan
						if(P.args.max && P.args.multipleMonths ) {
							var copy = new Date(ar);
							var count = P.args.monthColumns * P.args.monthRows;
							copy.setMonth(copy.getMonth()+count);
							//alert(copy); alert(P.args.max);
							if( copy > P.args.max)
								return P.moveTo(ar,!D);
						}
						ar.setMonth(ar.getMonth()+1);
					break
				}
			} else{
				ar=new Date()
			}
			return P.moveTo(ar,!D)
		}

		function u(ar,P){
			ar._menuVisible=P;
			ae(P,ar.els.title,"DynarchCalendar-pressed-title");
			var at=ar.els.menu;
			if(c){
				at.style.height=ar.els.main.offsetHeight+"px"
			}
			if(!ar.args.animation){
				setDisplay(at,P);
				if(ar.focused){
					ar.focus()
				}
			} else{
				if(ar._menuAnim){
					ar._menuAnim.stop()
				}
				var D=ar.els.main.offsetHeight;
				if(c){
					at.style.width=ar.els.topBar.offsetWidth+"px"
				}
				if(P){
					at.firstChild.style.marginTop=-D+"px";
					ar.args.opacity>0&&am(at,0);
					setDisplay(at,true)
				}
				ar._menuAnim=ap({
					onUpdate:
						function(au,av){
							at.firstChild.style.marginTop=av(Z.accel_b(au),-D,0,!P)+"px";
							ar.args.opacity>0&&am(at,av(Z.accel_b(au),0,0.85,!P))
						},
					onStop:
						function(){
							ar.args.opacity>0&&am(at,0.85);
							at.firstChild.style.marginTop="";
							ar._menuAnim=null;
							if(!P){
								setDisplay(at,false);
								if(ar.focused){
									ar.focus()
								}
							}
						}
				})
			}
		}

		function mouseUpDownHandler(az,ay){
			ay=ay||window.event;
			var dragging = ay.shiftKey;
			var au=o(ay);
			if(au && !au.getAttribute("disabled")){
				var D=au.getAttribute("dyc-btn"), ax=au.getAttribute("dyc-type"), av=au.getAttribute("dyc-date"), at=this.selection, ar, P={
					//mouseover:an,
 					//mousemove:an,
					mouseup:
						function(aC){
							var aB=au.getAttribute("dyc-cls");
							if(aB){
								aj(au,ao(aB,1))
							}
							clearTimeout(ar);
							detachEventListener(document,P,true);
							P=null;

							// Nuevo
							if(at.type==y.SEL_MULTIPLE){ 
									if(this._selRangeStart){
							console.log("UP: " + av + "\n");
										if( (av!=null) && (av != this._selRangeStart )) {
											this.selection.selectRange(this._selRangeStart,av)
										}
										this._selRangeStart = null;
										this.selection.buttonDown = false;
									}
							}
	
						}
				};

				// Nuevo
				if(at.type==y.SEL_MULTIPLE){ 
					if(ay.type == "mousedown") {
						this.selection.buttonDown = true;
					} else {
						if(this._selRangeStart){
							if( (av!=null) && (av != this._selRangeStart )) {
								this.selection.selectRange(this._selRangeStart,av)
								this._selRangeStart = null;
							} else if( av == null ) {
//								this._selRangeStart = null;
							}
						}
					}
				}

				if(az){
					setTimeout(v(this.focus,this),1);
					var aA=au.getAttribute("dyc-cls");
					if(aA){
						M(au,ao(aA,1))
					}
					if("menu"==D){
						this.toggleMenu()
					} else{
						if(au&&/^[+-][MY]$/.test(D)){
							if(aa(this,D)){
								var aw=v(
								function(){
									if(aa(this,D,true)){
										ar=setTimeout(aw,40)
									} else{
										P.mouseup();
										aa(this,D)
									}
								},this);
								ar=setTimeout(aw,350);
								p(document,P,true)
							} else{
								P.mouseup()
							}
						} else {
							if("year"==D){
								this.els.yearInput.focus();
								this.els.yearInput.select()
							} else {
								if(ax=="time-am"){
									p(document,P,true)
								} else {
									if(/^time/.test(ax)){
										var aw=v(
											function(aB){
												N.call(this,aB);
												ar=setTimeout(aw,100)
											},this,ax);
										N.call(this,ax);
										ar=setTimeout(aw,350);
										p(document,P,true)
									} else {
										if(av&&at.type){
											if(at.type==y.SEL_MULTIPLE){
												if(this.selection.buttonDown) {
													dragging=true;
												}
												if(dragging && this._selRangeStart){
													at.selectRange(this._selRangeStart,av)
													// Nuevo:
													this._selRangeStart = null;
												// Nuevo:
												} else if( dragging ) {
													this._selRangeStart=av;
													at.clear(true);
													at.set(av,true);
												} else {
													if(!ay.ctrlKey&&!at.isSelected(av)){
														at.clear(true)
													}
													at.set(av,true);
													this._selRangeStart=av
												}
											} else{
												at.set(av);
												this.moveTo(PartsToDate(av),2)
											}
											au=this._getDateDiv(av);
											//mouseOverOutHandler.call(this,true,{target:au})
										}
										p(document,P,true)
									}
								}
							}
						}
					}
					if(j && P && /dbl/i.test(ay.type)) {
						P.mouseup()
					}
					if(/^(DynarchCalendar-(topBar|bottomBar|weekend|weekNumber|menu(-sep)?))?$/.test(au.className) && !this.args.cont){
						P.mousemove=v(g,this);
						this._mouseDiff=f(ay,J(this.els.topCont));
						p(document,P,true)
					}
				} else {
					if("today"==D){
						if(!this._menuVisible&&at.type==y.SEL_SINGLE){
							at.set(new Date())
						}
						this.moveTo(new Date(),true);
						u(this,false)
					} else{
						if(/^m([0-9]+)/.test(D)){
							var av=new Date(this.date);
							av.setDate(1);
							av.setMonth(RegExp.$1);
							av.setFullYear(this._getInputYear());
							this.moveTo(av,true);
							u(this,false)
						} else{
							if(ax=="time-am"){
								this.setHours(this.getHours()+12)
							}
						}
					}
				}

				if(!j){
					an(ay)
				}
			} 
			if(ay.type == "mouseup") {
				this.selection.buttonDown = false;
			}
		}

		function g(P){
			P=P||window.event;
			var D=this.els.topCont.style, ar=f(P,this._mouseDiff);
			D.left=ar.x+"px";
			D.top=ar.y+"px"
		}

		function o(P){
			var D=P.target || P.srcElement, ar=D;
			while(D && D.getAttribute && !D.getAttribute("dyc-type")){
				D=D.parentNode
			}
			return D.getAttribute && D || ar
		}

		function ao(D,P){
			return"DynarchCalendar-"+D.split(/,/)[P]
		}

		function mouseOverOutHandler(au,at){
			at=at||window.event;
			var ar=o(at);
			if(ar){

	
				var P=ar.getAttribute("dyc-type");
				if(P&&!ar.getAttribute("disabled")){
					if(!au||!this._bodyAnim||P!="date"){
						var D=ar.getAttribute("dyc-cls");
						D=D?ao(D,0):"DynarchCalendar-hover-"+P;
						if(P!="date"||this.selection.type){
							ae(au,ar,D)
						}
						if(P=="date"){
							ae(au,ar.parentNode.parentNode,"DynarchCalendar-hover-week");
							this._showTooltip(ar.getAttribute("dyc-date"))
						}
						if(/^time-hour/.test(P)){
							ae(au,this.els.timeHour,"DynarchCalendar-hover-time")
						}
						if(/^time-min/.test(P)){
							ae(au,this.els.timeMinute,"DynarchCalendar-hover-time")
						}
						aj(this._getDateDiv(this._lastHoverDate),"DynarchCalendar-hover-date");
						this._lastHoverDate=null
					}
				}
// Nuevo:
				var av=ar.getAttribute("dyc-date");
				var sel = this.selection;
//				if(at.type==y.SEL_MULTIPLE){ 
//					if(at.type != "mouseover") {
						if(this._selRangeStart) {
//							var av=ar.getAttribute("dyc-date");
							if( av != null ) {
								sel.selectRange(this._selRangeStart, av);
								return;
							}
						}
	//				}		
	//			} 
				if(av!=null) {
//					console.log("OVER: " + av + "\n");
				}
			}
			if(!au){
				this._showTooltip()
			}
		}

		/* Evento de rueda sobre el mes o sobre la hora */
		function E(ar){
			ar=ar||window.event;
			var P=o(ar);
			if(P){
				var at=P.getAttribute("dyc-btn"), D=P.getAttribute("dyc-type"), au=ar.wheelDelta?ar.wheelDelta/120:-ar.detail/3;
				au=au<0?-1:au>0?1:0;
				if(this.args.reverseWheel){
					au=-au
				}
				if(/^(time-(hour|min))/.test(D)){
					// Sobre la hora
					switch(RegExp.$1){
						case"time-hour":this.setHours(this.getHours()+au);break;
						case"time-min":this.setMinutes(this.getMinutes()+this.args.minuteStep*au);break
					}
					an(ar)
				} else {
					// Sobre el mes (o sobre AM/PM)
					if(/Y/i.test(at)){
						au*=2
					}
					aa(this,-au);
					an(ar)
				}
			}
		}

		function R(){
			this.refresh();
			var D=this.inputField,P=this.selection;
			if(D){
				var ar=P.print(this.dateFormat);
				(/input|textarea/i.test(D.tagName))?D.value=ar:D.innerHTML=ar
			}
			this.callHooks("onSelect",this,P)
		}

		var ag={37:-1,38:-2,39:1,40:2},Q={33:-1,34:1};

		/* Controlador de eventos del teclado */
		function keyHandler(aB){
			if(this._menuAnim){
				return
			}
			aB=aB||window.event;
			var ar=aB.target||aB.srcElement, aC=ar.getAttribute("dyc-btn"), aD=aB.keyCode, ay=aB.charCode||aD, D=ag[aD];
			if("year"==aC&&aD==13){
				var au=new Date(this.date);
				au.setDate(1);
				au.setFullYear(this._getInputYear());
				this.moveTo(au,true);
				u(this,false);
				return an(aB)
			}
			if(this._menuVisible){
				if(aD==27){
					u(this,false);
					return an(aB)
				}
			} else{
				if(!aB.ctrlKey){
					D=null
				}
				if(D==null&&!aB.ctrlKey){
					D=Q[aD]
				}
				if(aD==36){
					D=0
				}
				if(D!=null){
					aa(this,D);
					return an(aB)
				}
				ay=String.fromCharCode(ay).toLowerCase();
				var ax=this.els.yearInput, P=this.selection;
				if(ay==" "){
					u(this,true);
					this.focus();
					ax.focus();
					ax.select();
					return an(aB)
				}
				if(ay>="0"&&ay<="9"){
					u(this,true);
					this.focus();
					ax.value=ay;
					ax.focus();
					return an(aB)
				}
				var av=translate("mn"), az=aB.shiftKey?-1:this.date.getMonth(), aw=0, at;
				while(++aw<12){
					at=av[(az+aw)%12].toLowerCase();
					if(at.indexOf(ay)==0){
						var au=new Date(this.date);
						au.setDate(1);
						au.setMonth((az+aw)%12);
						this.moveTo(au,true);
						return an(aB)
					}
				}
				if(aD>=37&&aD<=40){
					var au=this._lastHoverDate;
					if(!au&&!P.isEmpty()){
						au=aD<39?P.getFirstDate():P.getLastDate();
						if(au<this._firstDateVisible||au>this._lastDateVisible){
							au=null
						}
					}
					if(!au){
						au=aD<39?this._lastDateVisible:this._firstDateVisible
					} else {
						var aA=au;
						au=PartsToDate(au);
						var az=100;
						while(az-->0){
							switch(aD){
								case 37:au.setDate(au.getDate()-1);break;
								case 38:au.setDate(au.getDate()-7);break;
								case 39:au.setDate(au.getDate()+1);break;
								case 40:au.setDate(au.getDate()+7);break
							}
							if(!this.isDisabled(au)){
								break
							}
						}
						au=dateToString(au);
						if(au<this._firstDateVisible||au>this._lastDateVisible){
							this.moveTo(au)
						}
					}
					aj(this._getDateDiv(aA), M(this._getDateDiv(au),"DynarchCalendar-hover-date"));
					this._lastHoverDate=au;
					return an(aB)
				}
				if(aD==13){
					if(this._lastHoverDate){
						if(P.type==y.SEL_MULTIPLE&&(aB.shiftKey||aB.ctrlKey)){
							if(aB.shiftKey&&this._selRangeStart){
								P.clear(true);
								P.selectRange(this._selRangeStart,this._lastHoverDate)
							}
							if(aB.ctrlKey){
								P.set(this._selRangeStart=this._lastHoverDate,true)
							}
						} else {
							P.reset(this._selRangeStart=this._lastHoverDate)
						}
						return an(aB)
					}
				}
				if(aD==27&&!this.args.cont){
					this.hide()
				}
			}
		}

		l._getDateDiv=
			function(D){
				var ar=null;
				if(D){
					try{
						t(this.els.body,
							function(at){
								if(at.getAttribute("dyc-date")==D){
									throw ar=at
								}
							})
					} catch(P){
					}
				}
				return ar
			};

		function k(D,P){
			return D.replace(/\$\{([^:\}]+)(:[^\}]+)?\}/g,
				function(av,au,at){
					var aw=P[au],ar;
					if(at){
						ar=at.substr(1).split(/\s*\|\s*/);
						aw=(aw>=ar.length?ar[ar.length-1]:ar[aw]).replace(/##?/g,
							function(ax){
								return ax.length==2?"#":aw
							})
					}
					return aw
				})
		}

		function translate(ar,P){
			var D=q.__.data[ar];
			if(P&&typeof D=="string"){
				D=k(D,P)
			}
			return D
		}

// --------------------------------------------------------------------------------------
// ACCIONES SOBRE LA SELECCION
// --------------------------------------------------------------------------------------
		(y.Selection=
		function(ar,P,D,at){
		this.type=P;
		this.sel=ar instanceof Array?ar:[ar];
		this.onChange=v(D,at);
		this.cal=at
		}).prototype={
			get: function(){
				return this.type==y.SEL_SINGLE?this.sel[0]:this.sel
			},

			isEmpty: function(){
				return this.sel.length==0
			},

			set: function(P,D,ar){
				var at=this.type==y.SEL_SINGLE;
				if(P instanceof Array){
					this.sel=P;
					this.normalize();
					if(!ar){
						this.onChange(this)
					}
				} else { 
					P=dateToString(P);
					if(at||!this.isSelected(P)){
						at?this.sel=[P]:this.sel.splice(this.findInsertPos(P),0,P);
						this.normalize();
						if(!ar){
							this.onChange(this)
						}
					} else {
						if(D) {
							this.unselect(P,ar)
						}
					}
				}
			},

			reset: function(){
					this.sel=[];
					this.set.apply(this,arguments)
				},

			countDays: function(){
				var av=0, D=this.sel, P=D.length, at, au, ar;
				while(--P>=0){
					at=D[P];
					if(at instanceof Array){
						au=PartsToDate(at[0]);
						ar=PartsToDate(at[1]);
						av+=Math.round(Math.abs(ar.getTime()-au.getTime())/86400000)
					}
					++av
				}
				return av
			},

			unselect: function(P,ar){
				P=dateToString(P);
				var at=false;
				for(var ay=this.sel,au=ay.length,D;--au>=0;){
					D=ay[au];
					if(D instanceof Array){
						if(P>=D[0]&&P<=D[1]){
							var av=PartsToDate(P), ax=av.getDate();
							if(P==D[0]) {
								av.setDate(ax+1);
								D[0]=dateToString(av);
								at=true
							} else {
								if(P==D[1]){
									av.setDate(ax-1);
									D[1]=dateToString(av);
									at=true
								} else {
									var aw=new Date(av);
									aw.setDate(ax+1);
									av.setDate(ax-1);
									ay.splice(au+1,0,[dateToString(aw),D[1]]);
									D[1]=dateToString(av);
									at=true
								}
							}
						}
					} else {
						if(P==D){
							ay.splice(au,1);
							at=true
						}
					}
				}
				if(at){
					this.normalize();
					if(!ar){
						this.onChange(this)
					}
				}
			},

			normalize: function(){
				this.sel=this.sel.sort(
					function(ay,ax){
						if(ay instanceof Array){
							ay=ay[0]
						}
						if(ax instanceof Array){
							ax=ax[0]
						}
						return ay-ax
					});
				for(var P=this.sel,ar=P.length,av,au;--ar>=0;){
					av=P[ar];
					if(av instanceof Array){
						if(av[0]>av[1]){
							P.splice(ar,1);
							continue
						}
						if(av[0]==av[1]){
						av=P[ar]=av[0]
						}
					}
					if(au){
						var at=au, aw=av instanceof Array?av[1]:av;
						aw=PartsToDate(aw);
						aw.setDate(aw.getDate()+1);
						aw=dateToString(aw);
						if(aw>=at){
							var D=P[ar+1];
							if(av instanceof Array&&D instanceof Array){
								av[1]=D[1];
								P.splice(ar+1,1)
							} else {
								if(av instanceof Array){
									av[1]=au;
									P.splice(ar+1,1)
								} else{
									if(D instanceof Array){
										D[0]=av;P.splice(ar,1)
									} else {
										P[ar]=[av,D];
										P.splice(ar+1,1)
									}
								}
							}
						}
					}
					au=av instanceof Array?av[0]:av
				}
			},

			findInsertPos: function(P){
				for(var D=this.sel,atruer=D.length,at;--ar>=0;){
					at=D[ar];
					if(at instanceof Array){
						at=at[0]
					}
					if(at<=P){
						break
					}
				}
				return ar+1
			},

			clear: function(D){
				this.sel=[];
				if(!D){
					this.onChange(this)
				}
			},

			/* Elige un rango de fechas? */
			selectRange: function(ar,P){
				ar=dateToString(ar);
				P=dateToString(P);
				if(ar>P){
					var D=ar;
					ar=P;
					P=D
				}
				this.sel.push([ar,P]);
				this.normalize();
				this.onChange(this);
			},

			isSelected:	function(D){
				for(var P=this.sel.length,ar;--P>=0;){
					ar=this.sel[P];
					if(ar instanceof Array&&D>=ar[0]&&D<=ar[1]||D==ar){
						return true
					}
				}
				return false
			},

			getFirstDate: function(){
				var D=this.sel[0];
				if(D&&D instanceof Array){
					D=D[0]
				}
				return D
			},

			getLastDate: function(){
				if(this.sel.length>0){
					var D=this.sel[this.sel.length-1];
					if(D&&D instanceof Array){
						D=D[1]
					}
					return D
				}
			},

			print: function(ar,at){
				var P=[],au=0, aw, av=this.cal.getHours(), D=this.cal.getMinutes();
				if(!at){
					at=" -> "
				}
				while(au<this.sel.length){
					aw=this.sel[au++];
					if(aw instanceof Array){
						P.push(ab(PartsToDate(aw[0],av,D),ar)+at+ab(PartsToDate(aw[1],av,D),ar))
					} else {
						P.push(ab(PartsToDate(aw,av,D),ar))
					}
				}
				return P
			},

			getDates: function(P){
				var D=[],ar=0, au, at;
				while(ar<this.sel.length){
					at=this.sel[ar++];
					if(at instanceof Array){
						au=PartsToDate(at[0]);
						at=at[1];
						while(dateToString(au)<at){
							D.push(P?ab(au,P):new Date(au));
							au.setDate(au.getDate()+1)
						}
					} else { 
						au=PartsToDate(at)
					}
					D.push(P?ab(au,P):au)
				}
				return D
			}
		};

// --------------------------------------------------------------------------

		function a(P){
			P=new Date(P.getFullYear(),P.getMonth(),P.getDate(),12,0,0);
			var ar=P.getDay();P.setDate(P.getDate()-(ar+6)%7+3);
			var D=P.valueOf();
			P.setMonth(0);
			P.setDate(4);
			return Math.round((D-P.valueOf())/(7*86400000))+1
		}

		function C(D){
			D=new Date(D.getFullYear(),D.getMonth(),D.getDate(),0,0,0);
			var ar=new Date(D.getFullYear(),0,1,12,0,0);
			var P=D-ar;
			return Math.floor(P/86400000)
		}

		/* Convierte una fecha en una cadena */
		function dateToString(D){
			if(D instanceof Date){
				return 10000*D.getFullYear()+100*(D.getMonth()+1)+D.getDate()
			}
			if(typeof D=="string"){
				return parseInt(D,10)
			}
			return D
		}

		function PartsToDate(ar,au,av,at,P){
			if(!(ar instanceof Date)){
				ar=parseInt(ar,10);
				var aw=Math.floor(ar/10000);
				ar=ar%10000;
				var D=Math.floor(ar/100);
				ar=ar%100;
				ar=new Date(aw,D-1,ar,au||12,av||0,at||0,P||0)
			}
			return ar
		}

		function af(aw,au,ar){
			var av=aw.getFullYear(), ay=aw.getMonth(), P=aw.getDate(), at=au.getFullYear(), ax=au.getMonth(), D=au.getDate();
			return av<at?-3:av>at?3:ay<ax?-2:ay>ax?2:ar?0:P<D?-1:P>D?1:0
		}

		function ab(D,ax){
			var P=D.getMonth(), aw=D.getDate(), ay=D.getFullYear(),az=a(D), aA=D.getDay(), aB=D.getHours(), ar=(aB>=12), au=(ar)?(aB-12):aB,aD=C(D), at=D.getMinutes(), av=D.getSeconds(), aC=/%./g, aE;
			if(au===0){
				au=12
			}
			aE={"%a":translate("sdn")[aA],"%A":translate("dn")[aA],"%b":translate("smn")[P],"%B":translate("mn")[P],"%C":1+Math.floor(ay/100),"%d":aw<10?"0"+aw:aw,"%e":aw,"%H":aB<10?"0"+aB:aB,"%I":au<10?"0"+au:au,"%j":aD<10?"00"+aD:aD<100?"0"+aD:aD,"%k":aB,"%l":au,"%m":P<9?"0"+(1+P):1+P,"%o":1+P,"%M":at<10?"0"+at:at,"%n":"\n","%p":ar?"PM":"AM","%P":ar?"pm":"am","%s":Math.floor(D.getTime()/1000),"%S":av<10?"0"+av:av,"%t":"\t","%U":az<10?"0"+az:az,"%W":az<10?"0"+az:az,"%V":az<10?"0"+az:az,"%u":aA+1,"%w":aA,"%y":(""+ay).substr(2,2),"%Y":ay,"%%":"%"};
			return ax.replace(aC,
				function(aF){
					return aE.hasOwnProperty(aF)?aE[aF]:aF
				})
		}

		function ToDate(P){
			if(P){
				if(typeof P=="number"){
					return PartsToDate(P)
				}
				if(!(P instanceof Date)){
					var D=P.split(/-/);
					return new Date(parseInt(D[0],10),parseInt(D[1],10)-1,parseInt(D[2],10),12,0,0,0)
				}
			}
			return P
		}

		function A(ar){
			ar=ar.toLowerCase();

			function P(at){
				for(var au=at.length;--au>=0;){
					if(at[au].toLowerCase().indexOf(ar)==0){
						return au
					}
				}
			}
			var D=P(translate("smn"))||P(translate("mn"));
			if(D!=null){
				D++
			}
			return D
		}

		y.parseDate = function(au,D,aw){
			if(!/\S/.test(au)){
				return""
			}
			au=au.replace(/^\s+/,"").replace(/\s+$/,"");
			aw=aw||new Date();
			var aB=null,P=null,aD=null,av=null,ar=null,aC=null;
			var ay=au.match(/([0-9]{1,2}):([0-9]{1,2})(:[0-9]{1,2})?\s*(am|pm)?/i);
			if(ay){	
				av=parseInt(ay[1],10);
				ar=parseInt(ay[2],10);
				aC=ay[3]?parseInt(ay[3].substr(1),10):0;
				au=au.substring(0,ay.index)+au.substr(ay.index+ay[0].length);
				if(ay[4]){
					if(ay[4].toLowerCase()=="pm"&&av<12){
						av+=12
					} else {
						if(ay[4].toLowerCase()=="am"&&av>=12){
							av-=12
						}
					}
				}
			}
			var az=au.split(/\W+/);
			var ax=[];
			for(var at=0;at<az.length;++at){
				var aA=az[at];
				if(/^[0-9]{4}$/.test(aA)){
					aB=parseInt(aA,10);
					if(!P&&!aD&&D==null){
						D=true
					}
				} else {
					if(/^[0-9]{1,2}$/.test(aA)){
						aA=parseInt(aA,10);
						if(aA>=60){
							aB=aA
						}else{
							if(aA>=0&&aA<=12){
								ax.push(aA)
							} else {
								if(aA>=1&&aA<=31){
									aD=aA
								}
							}
						}
					} else {
						P=A(aA)
					}
				}
			}
			if(ax.length>=2){
				if(D){
					if(!P){
						P=ax.shift()
					}
					if(!aD){
						aD=ax.shift()
					}
				}else{
					if(!aD){
						aD=ax.shift()
					}
					if(!P){
						P=ax.shift()
					}
				}
			}else{
				if(ax.length==1){
					if(!aD){
						aD=ax.shift()
					}else{
						if(!P){
							P=ax.shift()
						}
					}
				}
			}
			if(!aB){
				aB=ax.length>0?ax.shift():aw.getFullYear()
			}
			if(aB<30){
				aB+=2000
			}else{
				if(aB<99){
					aB+=1900
				}
			}
			if(!P){
				P=aw.getMonth()+1
			}
			return aB&&P&&aD?new Date(aB,P-1,aD,av,ar,aC):null
		};

		/* Devuelve un array, donde los parámetros de D tienen prioridad sobre los de at. Los últimos dos argumentos
			no se usan */
		function arrayWithOverrides(D,at/*,P,ar*/){
			ar={};
			for(P in at){
				if(at.hasOwnProperty(P)){
					ar[P]=at[P]
				}
			}
			for(P in D){
				if(D.hasOwnProperty(P)){
					ar[P]=D[P]
				}
			}
			return ar
		}

		function p(ar,au,at,D){
			if(ar instanceof Array){
				for(var P=ar.length;--P>=0;){
					p(ar[P],au,at,D)
				}
			} else{
				if(typeof au=="object"){
					for(var P in au){
						if(au.hasOwnProperty(P)){
							p(ar,P,au[P],at)
						}
					}
				} else{
					if(ar.addEventListener){
						ar.addEventListener(au,at,j?true:!!D)
					} else {
						if(ar.attachEvent){
							ar.attachEvent("on"+au,at)
						} else {
							ar["on"+au]=at
						}
					}
				}
			}
		}

		/* Quita un evento de un elemento */
		function detachEventListener(ar,au,at,D){
			if(ar instanceof Array){
				for(var P=ar.length;--P>=0;){
					detachEventListener(ar[P],au,at)
				}
			} else{
				if(typeof au=="object"){
					for(var P in au){
						if(au.hasOwnProperty(P)){
							detachEventListener(ar,P,au[P],at)
						}
					}
				} else {
					if(ar.removeEventListener){
						ar.removeEventListener(au,at,j?true:!!D)
					} else {
						if(ar.detachEvent){
							ar.detachEvent("on"+au,at)
						} else {
							ar["on"+au]=null
						}
					}
				}
			}
		}

		/* Anula el evento? */
		function an(D){
			D=D||window.event;
			if( D!=null ) {
			if(j){
				D.cancelBubble=true;
				D.returnValue=false
			} else {
				D.preventDefault();
				D.stopPropagation()
			}
			}
			return false
		}

		function aj(au,at,av){
			if(au){
				var D=au.className.replace(/^\s+|\s+$/,"").split(/\x20/), P=[], ar;
				for(ar=D.length;ar>0;){
					if(D[--ar] != at){
						P.push(D[ar])
					}
				}
				if(av){
					P.push(av)
				}
				au.className=P.join(" ")
			}
			return av
		}

		function M(P,D){
			return aj(P,D,D)
		}

		/* Recorre todos los elementos de un árbol aplicando aj(). Devuelve at */
		function ae(at,ar,P){
			if(ar instanceof Array){
				for(var D=ar.length;--D>=0;){
					ae(at,ar[D],P)
				}
			} else{
				aj(ar,P,at?P:null)
			}
			return at
		}

		/* Antes G() */
		function createElement(at,className,parentNode) 
		{
			var P=null;
			if(document.createElementNS){
				P=document.createElementNS("http://www.w3.org/1999/xhtml",at)
			} else{
				P=document.createElement(at)
			}
			if(className) {
				P.className=className
			}
			if(parentNode){
				parentNode.appendChild(P)
			}
			return P
		}

		function b(au,av){
			if(av==null){
				av=0
			}
			var D,at,P;
			try{
				D=Array.prototype.slice.call(au,av)
			} catch(ar) {
				D=new Array(au.length-av);
				for(at=av,P=0;at<au.length;++at,++P){
					D[P]=au[at]
				}
			}
			return D
		}

		function v(P,ar){
			var D=b(arguments,2);
			return(ar==undefined?
				function(){
					return P.apply(this,D.concat(b(arguments)))
				}:
				function(){
					return P.apply(ar,D.concat(b(arguments)))
				})
		}

		function t(P,ar){
			if(!ar(P)){
				for(var D=P.firstChild;D;D=D.nextSibling){
					if(D.nodeType==1){
						t(D,ar)
					}
				}
			}
		}

		function ap(D,aw,ar){
			D=arrayWithOverrides(D,{
				fps:50,
				len:15,
				onUpdate:ad,
				onStop:ad
			});
			if(j){
				D.len=Math.round(D.len/2)
			}

			function at(aA,az,ax,ay){
				return ay?ax+aA*(az-ax):az+aA*(ax-az)
			}

			function av(){
				if(aw){
					P()
				}
				ar=0;
				aw=setInterval(au,1000/D.fps)
			}

			function P(){
				if(aw){
					clearInterval(aw);
					aw=null
				}
				D.onStop(ar/D.len,at)
			}

			function au(){
				var ax=D.len;
				D.onUpdate(ar/ax,at);
				if(ar==ax){
					P()
				}
				++ar
			}

			av();
			return{
				start:av, 
				stop:P, 
				update:au, 
				args:D, 
				map:at
			}
		}

		var Z={
			elastic_b: function(D){
					return 1-Math.cos(-D*5.5*Math.PI)/Math.pow(2,7*D)
				}, 
			magnetic: function(D){
				return 1-Math.cos(D*D*D*10.5*Math.PI)/Math.exp(4*D)
			},
			accel_b: function(D){
				D=1-D;return 1-D*D*D*D
			},
			accel_a: function(D){
				return D*D*D
			},
			accel_ab: function(D){
				D=1-D;
				return 1-Math.sin(D*D*Math.PI/2)
			},
			accel_ab2: function(D){
				return(D/=0.5)<1?1/2*D*D:-1/2*((--D)*(D-2)-1)
			},
			brakes:	function(D){
				D=1-D;
				return 1-Math.sin(D*D*Math.PI)
			},
			shake: function(D){
				return D<0.5?-Math.cos(D*11*Math.PI)*D*D:(D=1-D,Math.cos(D*11*Math.PI)*D*D)
			}
		};

		function am(D,P){
			if(P===""){
				j?D.style.filter="":D.style.opacity=""
			} else {
				if(P!=null){
					j?D.style.filter="alpha(opacity="+P*100+")":D.style.opacity=P
				} else{
					if(!j){
						P=parseFloat(D.style.opacity)
					} else{
						if(/alpha\(opacity=([0-9.])+\)/.test(D.style.opacity)){
							P=parseFloat(RegExp.$1)/100
						}
					}
				}
			}
			return P
		}

		/* Cambia / obtiene la visibilidad de un elemento. Si D != null, establece un valor (D=false -> display: none) */
		function setDisplay(ar,D){
			var P=ar.style;
			if(D!=null){
				P.display=D?"":"none"
			}
			return P.display!="none"
		}

		function f(P,ar){
			var D=j?P.clientX+document.body.scrollLeft:P.pageX;
			var at=j?P.clientY+document.body.scrollTop:P.pageY;
			if(ar){
				D-=ar.x;
				at-=ar.y
			}
			return{
				x:D,y:at
			}
		}

		function J(au){
			var D=0, at=0, ar=/^div$/i.test(au.tagName), av, P;
			if(ar&&au.scrollLeft){
				D=au.scrollLeft
			}
			if(ar&&au.scrollTop){
				at=au.scrollTop
			}
			av={
				x:au.offsetLeft-D, y:au.offsetTop-at
			};
			if(au.offsetParent){
				P=J(au.offsetParent);
				av.x+=P.x;
				av.y+=P.y
			}
			return av
		}

		/* Devuelve un array de información de pantalla */
		function getScreenInfo(){
			var P=document.documentElement,
				D=document.body;
			return{
				x:P.scrollLeft||D.scrollLeft, 
				y:P.scrollTop||D.scrollTop,
				w:P.clientWidth||window.innerWidth||D.clientWidth, 
				h:P.clientHeight||window.innerHeight||D.clientHeight
			}
		}

		function m(D,ar,P){
			for(P=0;P<D.length;++P){
				ar(D[P])
			}
		}

		var ad=new Function();

		function W(D){
			if(typeof D=="string"){
				D=document.getElementById(D)
			}
			return D
		}
		return y
	})();

