function Calendar(selectedStr) {
	this.date = new Date();
	this.html = '';
	this.selectedStr = (selectedStr); // || new Date().asString() ;

}
Calendar.prototype.setDate = function(o) {
	var n = new Date();
	this.month = (!o || (isNaN(o.month) || o.month === null)) ? n.getMonth() : o.month;
	this.year  = (!o || (isNaN(o.year) || o.year === null)) ? n.getFullYear() : o.year;
	return {month:this.month,year:this.year};
};
Calendar.prototype.setLinkedDate = function(o) {
	this.linkedDate = o;
};
Calendar.prototype.dateToObject = function(string) {
	var s = string.strToDate();
	if (!s || s.getFullYear() < 0) {
		var s = new Date();
	}
	return {day:s.getDate(),month:s.getMonth(),year:s.getFullYear()};
};
Calendar.prototype.go = function(go) {
	var o = {month:this.month,year:this.year};
	if(go=="next"&&o.month++>=11){
		o.month=0;o.year++;
	}
	if(go=="prev"&&o.month--<=0){
		o.month=11;o.year--;
	}
	return o;
};
Calendar.prototype.build = function(p) {
	this.generateMonth(this.selectedStr,p);
	for(i=1;i<p.loop;i++) {
		this.setDate(this.go("next"));
		this.generateMonth(this.selectedStr,p);
	}
	return this.html;
};
Calendar.prototype.generateMonth = function(selectedStr,p){
	var selected = selectedStr.strToDate();
	var today = new Date().zeroTime();
	var maxOutDate = p.outBlock;
	var maxRetDate = p.inBlock;
	var blocked = new Date().zeroTime().addDays(p.blockedDays);
	var linked = (this.linkedDate) ? new Date(this.linkedDate.year,this.linkedDate.month,this.linkedDate.day).zeroTime() : false ;

	if (!this.month && !this.year) {
		this.setDate();
	}

	var fd = new Date(this.year, this.month).getDay() - Date.firstDayOfWeek; // First Day
	var monthLength = new Date(this.year, this.month).getDaysInMonth();
	var monthName = Date.monthNames[this.month];

	var html = '<table class="calendar-table" cellpadding="0" cellspacing="0">';
	html += '<tr><th colspan="7">'+monthName + "&nbsp;" + this.year+'</th></tr>';
	html += '<tr class="calendar-header">';
	for(var i = Date.firstDayOfWeek, j=0; i <= 12; i++ ){
		html += '<td class="calendar-header-day">'+Date.abbrDayNames[(i>6) ? i-7 : i]+'</td>';
		if (j++ >= 6) {
			break;
		}
	}
	html += '</tr><tr>';

	var day = 1;
	for (var i = 0; i < 6; i++) {
	for (var j = 0; j <= 6; j++) {
		html += '<td class="calendar-day">';
		if (day <= monthLength && (i > 0 || j >= ((fd>=0) ? fd : 7+fd))) {
			var calDay = new Date(this.year,this.month,day).zeroTime();
			css = 'month-day';
			css += (calDay-today===0) ? ' is-today' : '';
			css += (calDay.isWeekend()) ? ' is-weekend' : '';
			css += (linked&&calDay-linked===0) ? ' is-linked' : '';
			css += (calDay<blocked && p.blockedDays!==false) ? ' is-blocked' : '';
			css += (calDay<p.blockTo && p.blockTo!==false) ? ' is-disabled' : '';
			css += (calDay>p.blockFrom && p.blockFrom!==false) ? ' is-disabled' : '';
			css += (calDay<new Date().zeroTime().addDays(3)&&calDay>new Date().zeroTime()) ? ' only-cc-payment' : '';
			css += (calDay-selected===0) ? ' is-selected' : '';
			css += (linked&&calDay<linked) ? ' is-disabled' : '';
			css += (!linked&&calDay>maxOutDate || linked&&calDay>maxRetDate) ? ' is-disabled' : '';
			html += '<a class="'+css+'" rel="'+calDay.asString()+'">'+day+'</a>';
			day++;
		} else {
			html += '&nbsp;';
		}
		html += '</td>';
	}
	if (day > monthLength) { break; } else { html += '</tr><tr>'; }
	}
	html += '</tr></table>';
	this.html += html;
	return this.html;
};
var	esky_calender_translate = {
	'OutGreaterThenReturn' : 'Датата на тръгване трябва да е по-малка от датата на връщане.',
	'OutDateToClose' : 'Датата на връщане трябва да е най-малко един ден след датата на тръгване.',
	'DateOutOfRange' : 'Няма информация за полети за избраната дата.',
	'OnlyCCPayment' : 'Съжаляваме, не може да изберете тази дата за тръгване. Резервационната система търси полети с дата на тръгване минимум два дни след днешната. Ако Ви се налага да пътувате по-рано моля свържете се с нашия Call Center.'
};
jQuery.fn.extend({
	esky_calendar_render: function(parameters) {
		$this = $(this);
		var container = $this.attr('id');
		var defaults = {
				thisInput: false,
				linkedInput: false,
				month: null,
				year: null,
				loop: 1,
				type:'popup',
				go: false,
				fade: false,
				outBlock: new Date().zeroTime().addDays(364),
				inBlock: new Date().zeroTime().addDays(363),
				blockTo: new Date().zeroTime(),
				blockFrom: false,
				blockedDays: 0,
				allowSameDay: false,
				i18n: esky_calender_translate,
				clickCallback: false
			};
		var p = $.extend({},defaults, parameters);

		var tI = document.getElementById(p.thisInput).value;

		var c = new Calendar(tI);

		if (p.linkedInput!==false) {
			var lI = document.getElementById(p.linkedInput).value;
			var lIobject = c.dateToObject(lI);
			if (!/^[0-9\-\.\\]+$/.test(tI)) {
				tI = lI;
			}

			if (p.thisInput != p.linkedInput && (!p.month && !p.year)) {
				c.setLinkedDate(lIobject);
			}
			if (p.thisInput != p.linkedInput && ((!p.month && !p.year) || p.go !== false)) {
				c.setLinkedDate(lIobject);
			}
		}

		var d = (!p.month && !p.year) ? c.dateToObject(tI) : {month:p.month,year:p.year} ;
		var calDay = new Date(d.year,d.month,1).zeroTime();
		if (calDay < p.blockTo) {
			d = {
				month: p.blockTo.getMonth(),
				year: p.blockTo.getFullYear()
			};
		}
		if (calDay > p.outBlock) {
			d = {
				month: p.outBlock.getMonth(),
				year: p.outBlock.getFullYear()
			};
		}
		
		c.setDate(d);

		var pv = $.extend({},p,c.go("prev"),{go:"prev"});
		var px = $.extend({},p,c.go("next"),{go:"next"});

		var cd = new Date();
		var pc = $.extend({},p,{month:cd.getMonth(),year:cd.getFullYear(),go:true});

		$this
			.html(c.build(p))
			.prepend(
				$('<div class="calendar-navigation"></div>')
				.prepend($('<a href="javascript:void(0);" class="calendar-button calendar-next" title="'+cal_text.NEXT+'">&raquo;</a>').click(function(e){
					$('#'+container).esky_calendar_render(px);
					e.stopPropagation();
				}))
				.prepend($('<a href="javascript:void(0);" class="calendar-button calendar-current">'+cal_text.THISMONTH+'</a>').click(function(){$this.esky_calendar_render(pc);}))
				.prepend($('<a href="javascript:void(0);" class="calendar-button calendar-previous" title="'+cal_text.PREV+'">&laquo;</a>').click(function(e){
					$('#'+container).esky_calendar_render(pv);
					e.stopPropagation();
				}))
			);
		if (p.type == 'popup') {
			$this.append($('<a href="javascript:void(0);" class="calendar-button calendar-close">' + cal_text.CLOSE + '</a>').click(function(){
				$this.remove();
			}));
		}

		$('a.month-day','#'+container).not('.is-disabled,.is-blocked')
		.click(function(){
			if(typeof p.clickCallback == 'function'){
				p.clickCallback($(this).attr('rel'));
			}
			$('#'+p.thisInput).not(':disabled').val( $(this).attr('rel') ).removeClass('virgin').blur();
			$('.is-selected','#'+container).removeClass('is-selected');
			$('#custom-field-help').remove();
			$(this).addClass('is-selected');
			if (typeof(calculateCheckoutDate) === 'function') {
				calculateCheckoutDate(p.thisInput);
			} // Only for HOTELS ASF
			if (p.type == 'popup') {
				$this.remove();
			}
		})
		.mouseover(function(){
			$(this).addClass('is-hover');
		})
		.mouseout(function(){
			$(this).removeClass('is-hover');
		});

		if(p.allowSameDay===false){
			$('a.is-linked').not('.is-disabled').unbind().click(function(){
				$.blockUI({
					message:p.i18n.OutGreaterThenReturn,
					css:{
						border:'3px solid #ff0000',
						textAlign:'center',
						padding:'20px',
						cursor:'wait'
					},
					timeout:4000,
					baseZ:9000
				});
				//alert(p.i18n.OutGreaterThenReturn);
				return false;
			});
		}
		$('a.is-blocked').not('.is-disabled,.is-linked,.is-linked-disabled').unbind().click(function(){
			//alert(p.i18n.OutDateToClose);
			$.blockUI({
					message:p.i18n.OutDateToClose,
					css:{
						border:'3px solid #ff0000',
						textAlign:'center',
						padding:'20px',
						cursor:'wait'
					},
					timeout:4000,
					baseZ:9000
				});
			return false;
		});
		$('a.is-out-of-range').unbind().click(function(){
			$.blockUI({
					message:p.i18n.DateOutOfRange,
					css:{
						border:'3px solid #ff0000',
						textAlign:'center',
						padding:'20px',
						cursor:'wait'
					},
					timeout:4000,
					baseZ:9000
				});
			//alert(p.i18n.DateOutOfRange);
			return false;
		});
		$('a.is-disabled,a.is-linked-disabled').unbind().click(function(){
			return false;
		});
		$('a.only-cc-payment').not('.is-disabled').tipBox(p.i18n.OnlyCCPayment);

		$this.bgIframe();
		return $this;
	},
	esky_calendar: function(parameters){
		var rel =  '#' + parameters.thisInput;

		if ($('#esky_calendar').size()>0) {
			var inputId = $('#esky_calendar').data('inputId');
			$('#esky_calendar').remove();
			if (inputId == rel) {
				return false;
			}
		}

		$('body').append(
			$('<div></div>').attr('id','esky_calendar').hide()
		);

		$input = $(rel);
		$input.attr('autocomplete','off');
		$calendar = $('#esky_calendar');
		$error = $('p#message'); 

		var xy = $input.offset();
		var test = {
			x: parseInt(xy.left,10) + parseInt($calendar.width(),10),
			y: parseInt(xy.top,10) + parseInt($input.height(),10) + parseInt($calendar.height(),10)
		};
		var view = getViewportSize(true);

		var cLeft = (view.width<test.x) ? xy.left - $calendar.width() +  $input.width() - 4 : xy.left;
		var cTop = (view.height<test.y) ? xy.top - $calendar.height() -  $input.height() : xy.top+$input.height()+8;

		$calendar
			.esky_calendar_render(parameters)
			.css({position:'absolute',top:cTop,left:cLeft})
			.data('inputId',rel);

		if(parameters.fade>0){
			$calendar.fadeIn(parameters.fade);
		}else{
			$calendar.show();
		}

		return $(this);
	}
});