var PKG={
	OnCalUpdate:function(ix1,ix2){
		var dt1=Utils.GetDateFromY2K(ix1);
		var dt2=Utils.GetDateFromY2K(ix2);
		var nights=ix2-ix1;
		if(nights>0){
			jQuery('#widget-2 .selectarrive .displaydate:first').html(dt1.getDate());
			jQuery('#widget-2 .selectdepart .displaydate:first').html(dt2.getDate());
			jQuery('#widget-2 .selectarrive .displaymonth:first').html(Utils.ToMMM(dt1));
			jQuery('#widget-2 .selectdepart .displaymonth:first').html(Utils.ToMMM(dt2));
		}else{
			jQuery('#widget-2 .selectarrive .displaydate:first').html('');
			jQuery('#widget-2 .selectdepart .displaydate:first').html('');
			jQuery('#widget-2 .selectarrive .displaymonth:first').html('&nbsp;');
			jQuery('#widget-2 .selectdepart .displaymonth:first').html('&nbsp;');
		};
	}
}
var MOD={
	txDt1:jQuery('#widget-3 .selectarrive .displaydate:first'),
	txDt2:jQuery('#widget-3 .selectdepart .displaydate:first'),
	txMo1:jQuery('#widget-3 .selectarrive .displaymonth:first'),
	txMo2:jQuery('#widget-3 .selectdepart .displaymonth:first'),
	OnCalUpdate:function(ix1,ix2){
		var dt1=Utils.GetDateFromY2K(ix1);
		var dt2=Utils.GetDateFromY2K(ix2);
		var nights=ix2-ix1;
		if(nights>0){
			jQuery('#widget-3 .selectarrive .displaydate:first').html(dt1.getDate());
			jQuery('#widget-3 .selectdepart .displaydate:first').html(dt2.getDate());
			jQuery('#widget-3 .selectarrive .displaymonth:first').html(Utils.ToMMM(dt1));
			jQuery('#widget-3 .selectdepart .displaymonth:first').html(Utils.ToMMM(dt2));
		}else{
			jQuery('#widget-3 .selectarrive .displaydate:first').html('');
			jQuery('#widget-3 .selectdepart .displaydate:first').html('');
			jQuery('#widget-3 .selectarrive .displaymonth:first').html('&nbsp;');
			jQuery('#widget-3 .selectdepart .displaymonth:first').html('&nbsp;');
		};
	}
}
var MAIN={
	Dt1:null,Dt2:null,initDate:false,maxNights:28,
	Init:function(){
		var d=new Date();
		this.Today=new Date(d.getFullYear(),d.getMonth(),d.getDate());
		this.Ix1=-1;
		this.Ix2=-1;
		this.Nights=0;
		this.Rooms=1;
		this.Adults=2;
		this.Child1=0;
		this.Child2=0;
		this.IXTODAY=Utils.GetIndexFromY2K(this.Today);
		this.IXFIRST=Utils.GetIndexFromY2K(new Date(this.Today.getFullYear(),this.Today.getMonth(),1));
		this.IXLAST=Utils.GetIndexFromY2K(new Date(this.Today.getFullYear(),this.Today.getMonth()+24,0));
		this.txDt1=jQuery('#widget-1 .selectarrive .displaydate:first,#dvForm .selectarrive .displaydate:first');
		this.txDt2=jQuery('#widget-1 .selectdepart .displaydate:first,#dvForm .selectdepart .displaydate:first');
		this.txMo1=jQuery('#widget-1 .selectarrive .displaymonth:first,#dvForm .selectarrive .displaymonth:first');
		this.txMo2=jQuery('#widget-1 .selectdepart .displaymonth:first,#dvForm .selectdepart .displaymonth:first');
		this.txWd1=jQuery('#dvForm .selectarrive .displayweekday:first');
		this.txWd2=jQuery('#dvForm .selectdepart .displayweekday:first');
		this.txRooms=jQuery('#widget-1 .numberrooms .value,#dvForm .numberrooms .value');
		this.txAdults=jQuery('#widget-1 .numberadults .value,#dvForm .numberadults .value');
		this.txChild1=jQuery('#widget-1 .numberchildren .value,#dvForm .numberchildren .value');
		this.txChild2=jQuery('#widget-1 .numberinfants .value,#dvForm .numberinfants .value');
		this.update();
	},
	OnCalUpdate:function(ix1,ix2){
		this.Ix1=ix1;
		this.Ix2=ix2;
		this.Dt1=Utils.GetDateFromY2K(this.Ix1);
		this.Dt2=Utils.GetDateFromY2K(this.Ix2);
		this.Nights=this.Ix2-this.Ix1;
		if(this.Nights>0){
			this.txDt1.html(this.Dt1.getDate());
			this.txDt2.html(this.Dt2.getDate());
			this.txMo1.html(Utils.ToMMM(this.Dt1));
			this.txMo2.html(Utils.ToMMM(this.Dt2));
			this.txWd1.html(Utils.ToWD(this.Dt1));
			this.txWd2.html(Utils.ToWD(this.Dt2));
		}else{
			this.txDt1.html('');
			this.txDt2.html('');
			this.txMo1.html('&nbsp;');
			this.txMo2.html('&nbsp;');
			this.txWd1.html('');
			this.txWd2.html('');
		};
	},
	SetRoom:function(val){
		this.Rooms=val;this.update();
	},
	SetAdults:function(val){
		this.Adults=val;this.update();
	},
	SetChild1:function(val){
		this.Child1=val;this.update();
	},
	SetChild2:function(val){
		this.Child2=val;this.update();
	},
	update:function(){
		this.txRooms.html(this.Rooms);
		this.txAdults.html(this.Adults);
		this.txChild1.html(this.Child1);
		this.txChild2.html(this.Child2);
	}
};
var RAC={
	Init:function(){
		var me=this;
		this.txRooms=jQuery('#txInputRooms');
		jQuery('#buRoomAdd').click(function(){
			var rm=Number(me.txRooms.html());
			if(rm++>=4)return false;
			me.txRooms.html(rm);
			MAIN.SetRoom(rm);
			return false;
		});
		jQuery('#buRoomMinus').click(function(){
			var rm=Number(me.txRooms.html());
			if(rm--<=1)return false;
			me.txRooms.html(rm);
			MAIN.SetRoom(rm);
			return false;
		});
		jQuery('#busAdults a').each(function(i){
			jQuery(this).click(function(){
				MAIN.SetAdults(i+1);
				jQuery('#busAdults a').not(jQuery(this)).removeClass('selected');
				jQuery(this).addClass('selected');
				return false;
			});
		});
		jQuery('#busChild1 a').each(function(i){
			jQuery(this).click(function(){
				MAIN.SetChild1(i+1);
				jQuery('#busChild1 a').not(jQuery(this)).removeClass('selected');
				jQuery(this).addClass('selected');
				return false;
			});
		});
		jQuery('#busChild2 a').each(function(i){
			jQuery(this).click(function(){
				MAIN.SetChild2(i+1);
				jQuery('#busChild2 a').not(jQuery(this)).removeClass('selected');
				jQuery(this).addClass('selected');
				return false;
			});
		});
	}
};
var CAL={
	ix:0,controls:null,tgt:null,ref:null,listener:null,Ix1:-1,Ix2:-1,Nights:0,maxNights:28,dts:null,IDX:0,
	Show:function(ref,idx){
		this.ref=ref;
		this.IDX=idx%2;
		if(ref=='#widget-1' || ref=='#dvForm'){
			this.listener = MAIN;
		}else if (ref=='#widget-2'){
			this.listener = PKG;
		}else if (ref=='#widget-3'){
			this.listener = MOD;
		}else{
			this.listener = null;
		};
		this.Ix1=Utils.GetIndex(jQuery(ref+' .calendar:eq(0)').attr('val'));
		this.Ix2=Utils.GetIndex(jQuery(ref+' .calendar:eq(1)').attr('val'));
		if(this.Ix1==-1||this.Ix2==-1||this.Ix1<MAIN.IXTODAY||this.Ix2>MAIN.IXLAST)this.Ix1=this.Ix2=-1;
		this.Nights=this.Ix2-this.Ix1;
		jQuery('.calendarpicker').show();
		if(this.dts!=null){
			this.update();
			if(this.Ix1 > -1){
				var dt1=Utils.GetDateFromY2K(this.Ix1);
				var tmp=Utils.MonthDiff(MAIN.Today,dt1);
				if(tmp > (this.ix+2)){
					tmp=Math.min(tmp,21);
					this.ix=tmp;
					this.tgt.animate({left:-243*tmp},600);
					this.controls.removeClass('activeSlide');
					this.controls.eq(tmp).addClass('activeSlide');
				}else if(tmp<this.ix){
					tmp=Math.max(tmp,0);
					this.ix=tmp;
					this.tgt.animate({left:-243*tmp},600);
					this.controls.removeClass('activeSlide');
					this.controls.eq(tmp).addClass('activeSlide');
				}
			}
		}
	},
	Init:function(){
		jQuery('.calendar').unbind('click',false);
		jQuery('.calendar').each(function(i){
			jQuery(this).click(function(){
				CAL.Show(jQuery(this).attr('rel'),i);return false;
			});
		});
		this.tgt=jQuery('#dvCalMonths');
		this.dts=[];
		var me=this,tmp;
		for(var i=0;i<24;i++){
			tmp=new WsMonth(this.tgt,i);
		};
		for(i=MAIN.IXFIRST;i<MAIN.IXTODAY;i++){
			this.dts[i]=jQuery('#dv_'+i);
			this.dts[i].addClass('dtDisabled');
		};
		for(i=MAIN.IXTODAY;i<=MAIN.IXLAST;i++){
			this.dts[i]=jQuery('#dv_'+i);
			this.dts[i].addClass('pointer');
			this.dts[i].click(function(){
				me.SetDates(Number(jQuery(this).attr('ref')));
			});
		};
		this.dts[MAIN.IXTODAY].addClass('dtToday');
		this.controls=jQuery('.calendarpicker .offercontrols a');
		this.controls.each(function(i){
			jQuery(this).click(function(){
				me.ix=i;
				me.tgt.animate({left:-243*i},600);
				me.controls.removeClass('activeSlide');
				jQuery(this).addClass('activeSlide');
				return false;
			});
		});
		jQuery('.calendarpicker .prev:first').click(function(){
			if(me.ix<=0)return false;
			me.ix--;
			me.tgt.animate({left:-243*(me.ix)},600);
			me.controls.removeClass('activeSlide');
			me.controls.eq(me.ix).addClass('activeSlide');
			return false;
		});
		jQuery('.calendarpicker .next:first').click(function(){
			if(me.ix>=21)return false;
			me.ix++;
			me.tgt.animate({left:-243*(me.ix)},600);
			me.controls.removeClass('activeSlide');
			me.controls.eq(me.ix).addClass('activeSlide');
			return false;
		});
		this.update();
	},
	SetDates:function(ix){
		if(this.Ix1==-1){
			var dt=Utils.GetDateFromY2K(ix);
			this.Ix1=ix;
			this.Ix2=(dt.getDay()==5) ? ix+2 : ix+1;
		}else if(this.IDX==0){
			if(ix<this.Ix2){
				this.Ix1=ix;
			}else{
				var dt=Utils.GetDateFromY2K(ix);
				this.Ix1=ix;
				this.Ix2=(dt.getDay()==5) ? ix+2 : ix+1;
			}
		}else{
			if(ix>this.Ix1){
				this.Ix2=ix;
			}else{
				this.Ix1=ix;
			}
		};
		this.Nights=this.Ix2-this.Ix1;
		if(this.Nights > this.maxNights){
			this.Nights=this.maxNights;
			this.Ix2=this.Ix1+this.maxNights;
		};
		this.update();
		if(this.listener!=null)this.listener.OnCalUpdate(this.Ix1,this.Ix2);
		jQuery('.calendarpicker').remove( );
	},
	update:function(){
		for(var i=MAIN.IXTODAY;i<=MAIN.IXLAST;i++){
			this.dts[i].removeClass('dtSelected');
		};
		if(this.Ix1>0){
			for(i=this.Ix1;i<=this.Ix2;i++){
				this.dts[i].addClass('dtSelected');
			}
		};
		jQuery(this.ref+' .calendar:eq(0)').attr('val',Utils.ToMDYYYY(this.Ix1))
		jQuery(this.ref+' .calendar:eq(1)').attr('val',Utils.ToMDYYYY(this.Ix2))
	}
};
var Utils={
	Format:function(){
		if(arguments.length==0)return '';
		var s=arguments[0];
		for(var i=1;i<arguments.length;i++){
			var r=new RegExp('\\{'+(i-1)+'\\}','gm');
			s=s.replace(r,arguments[i]);
		};
		return s;
	},
	MonthAdd:function(dt,mos){
		return new Date(dt.getFullYear(),dt.getMonth()+mos,1);
	},
	GetIndexFromY2K:function(dt){
		var Y2K=new Date(2000,0,1);
		return Math.round((dt-Y2K)/86400000);
	},
	GetDateFromY2K:function(ix){
		return new Date(2000,0,1+ix);
	},
	GetIndex:function(s){
		var tmp=s.split('/');
		if(tmp.length==3){
			var dt = new Date(Number(tmp[2]),Number(tmp[0])-1,Number(tmp[1]));
			return this.GetIndexFromY2K(dt);
		};
		return -1;
	},
	MonthDiff:function(dt1,dt2){
		return Number(12*(dt2.getFullYear()-dt1.getFullYear())+(dt2.getMonth()-dt1.getMonth()));
	},
	ToMMMMYYYY:function(dt){
		var mos=['JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER'];
		return mos[dt.getMonth()]+' '+dt.getFullYear();
	},
	ToMMM:function(dt){
		var mos=['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
		return mos[dt.getMonth()];
	},
	ToMDYYYY:function(ix){
		var dt = this.GetDateFromY2K(ix);
		return (dt.getMonth()+1)+'/'+dt.getDate()+'/'+dt.getFullYear();
	},
	ToWD:function(dt){
		var tmp=['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
		return tmp[dt.getDay()];
	}
};
function WsMonth(parent,id){
	var _dt=Utils.MonthAdd(MAIN.Today,id);
	var _ix=Utils.GetIndexFromY2K(_dt);
	var _dts=[];
	var _getHtml=function(){
		var offset=_dt.getDay()+1;
		var dtNext=Utils.MonthAdd(_dt,1);
		var last=Math.round(offset+((dtNext-_dt)/86400000)-1);
		var slots=Math.ceil(last/7)*7;
		var html='<div class="calMonth">';
		html+=Utils.Format('<div class="calHead">{0}</div>',Utils.ToMMMMYYYY(_dt));
		html+='<p class="weekday">S</p><p class="weekday">M</p><p class="weekday">T</p><p class="weekday">W</p><p class="weekday">T</p><p class="weekday">F</p><p class="weekday">S</p>';
		for (var i=1,day=1;i<=slots;i++){
			if (i>=offset&&i<=last){
				var tmp=new WsDate(_ix++);
				_dts.push(tmp);
				html+=tmp.GetHtml();
				day++;
			}else{
				html+='<p>&nbsp;</p>';
			};
		};
		html+='</div>';
		return html;
	};
	parent.append(_getHtml());
};
function WsDate(ix){
	var _dt=Utils.GetDateFromY2K(ix);
	var _ix=ix;
	this.GetHtml=function(){
		var html=Utils.Format('<p id="dv_{0}" ref="{0}">{1}</p>',_ix,_dt.getDate());
		return html;
	};
};
jQuery(document).ready(function(){
	MAIN.Init();
	jQuery('.calendar').each(function(i){
		jQuery(this).click(function(){
			CAL.Show(jQuery(this).attr('rel'),i);return false;
		});
	});
});

