Date.prototype.format = function(pattern){
	var res = pattern;
	var arr = ['%H','%i','%d','%m','%F','%y','%Y'];
	//for (var i=0;i<3;i++){
		res = res.replace('%H',this.getHours()<10?'0'+this.getHours():this.getHours());
		res = res.replace('%i',this.getMinutes()<10?'0'+this.getMinutes():this.getMinutes());
		res = res.replace('%d',this.getDate()<10?'0'+this.getDate():this.getDate());
		res = res.replace('%m',this.getMonth()+1<10?'0'+(this.getMonth()+1):this.getMonth()+1);
		res = res.replace('%F',getL('month_'+this.getMonth()));
		res = res.replace('%y',this.getFullYear().toString().substr(2,2));
		res = res.replace('%Y',this.getFullYear());
	//}
	return res;
}

Date.prototype.parse = function(string){
	var d = new Date();
	if (string.length==10){
		d = new Date(parseInt(string.substr(0,4),10),parseInt(string.substr(5,2),10)-1,parseInt(string.substr(8,2),10));
	} else if (string.length==8){
		if (string.indexOf('/')>0){
			d = new Date(parseInt('20'+string.substr(6,2),10),parseInt(string.substr(3,2),10)-1,parseInt(string.substr(0,2),10));
		} else {
			d = new Date(parseInt(string.substr(0,4),10),parseInt(string.substr(4,2),10)-1,parseInt(string.substr(6,2),10));
		}
	}
	return d;
}

Date.prototype.clone = function(){
	var d = new Date(this.getFullYear(),this.getMonth(),this.getDate());
	return d;
}

Date.prototype.getMonthDays = function(){
	var res = 31;
	if (jQuery.inArray(this.getMonth()+1, [3,6,9,11])) res = 30;
	if (this.getMonth()==1) res = this.getFullYear()%4==0?29:28;
	return res;
}

ACalendar = function(){
	
	this.periods = new Array();
	this.packages = new Array();
	this.weekType = 1;	// 1 - European, 0 - US type
	
	this.clear = function(){
		this.periods = new Array();
	}
	
	this.periodList = function(startDate,endDate){
		var result = new Array();
		var date = new Date();
		var start = date.parse(startDate);
		var end = date.parse(endDate);
		var i = 0;
		while (i<1000){
		//while (!(date.getDate()==d2[2]&&date.getMonth()+1==d2[1]&&date.getFullYear()==d2[0])){ 
		//for (var i=0;i<=len;i++){
			if (this.equalDates(start,end)>=0) break;
			var d = new Date(start.getFullYear(),start.getMonth(),start.getDate());
			result.push(d);
			//if (date.getDate()==d2[2]&&date.getMonth()+1==d2[1]&&date.getFullYear()==d2[0]) break;
			//if (start.getDate()>start.getMonthDays()){
			//	start.setDate(1);
			//	start.setMonth(start.getMonth()+1);
			//} else {
				start.setDate(start.getDate()+1);
			//}
			i++;
		}
		return result;
	}
	
	this.weekday = function(num){
		if (this.weekType==1){
			if (num==0)
				num = 1;
			else if (num>=6)
				num = 0;
			else num++;
		}
		return num;
	}
	
	this.emptyWeekdays = function(date,html){
		if (!html) html = false;
		var res = '';
		var len=date.getDay()-this.weekType;
		if (date.getDay()==0&&this.weekType) len = 6;
		if (date.getMonth()==10){
			//alert(date.getDay()+"\n"+date.toString());
		}
		//if (len==0) len = 6;
		for (var i=0;i<len;i++){
			res += '<li class="empty"></li>';
		}
		return html?res:len;
	}
	
	this.addPeriods = function(arr){
		if (!arr.length) return false;
		for (var i=0,len=arr.length;i<len;i++){
			var a = arr[i];
			this.periods.push(a);
		}
	}
	
	this.deletePeriods = function(arr){
		if (!arr.length) return false;
		for (var i=0,len=arr.length;i<len;i++){
			for (var j=0,jlen=this.periods.length;j<jlen;j++){
				var a = this.periods[j];
				if (arr[i]==a.id) this.periods[j].id = -1;
			}
		}
	}
	
	this.clearPeriods = function($el,onlyUsers){
		if (!onlyUsers) onlyUsers = false;
		if (onlyUsers){
			$el.find('li.cell').removeClass('closed special package');
		} else {
			this.periods = new Array();
			var $slist = $('#context-special').html('');
			var $plist = $('#context-package').html('');
			var $clist = $('#context-closed').html('');
			$el.find('li.cell').removeClass('canceled booked closed special package');
		}
	}
	
	this.equalDates = function(d1,d2){
		if (d1.getFullYear()>d2.getFullYear()){
			return 1;
		} else if (d1.getFullYear()<d2.getFullYear()){
			return -1;
		} else if (d1.getMonth()>d2.getMonth()){
			return 1;
		} else if (d1.getMonth()<d2.getMonth()){
			return -1;
		} else if (d1.getDate()>d2.getDate()){
			return 1;
		} else if (d1.getDate()<d2.getDate()){
			return -1;
		}
		return 0;
	}
	
	this.draw = function(startDate,endDate){
		var str = '';
		var h = '';
		var arr = this.periodList(startDate,endDate);
		if (arr.length>0){
			var d = arr[arr.length-1];
			d.setDate(d.getDate()+1);
			arr.push(d);
		}
		var old_year = null, old_month = null;
		for (var i=0,len=arr.length;i<len;i++){
			var date = arr[i];
			if (old_month!==date.getMonth()){
				if (i>0) h += '</ul></div>';
				h += date.format('<div class="month"><div class="head">%F %Y</div>');
				h += date.format('<ul id="month-%Y%m">');
				for (var j=0;j<7;j++){
					h += '<li class="col">'+getL('weekday_'+this.weekday(j))+'</li>';
				}
				var d = date.clone();
				d.setDate(1);
				h += this.emptyWeekdays(d,true);
			}
			if (i==0&&date.getDate()>1){
				// draw past days for first month
				for (var j=1;j<date.getDate();j++){
					var d = date.clone();
					d.setDate(j);
					h += '<li class="past">'+d.getDate()+'</li>';
				}
			}
			
			//str += date.toString()+"<br />";
			
			h += '<li value="'+date.format('%Y%m%d')+'" class="cell">'+date.getDate()+'</li>';
			old_month = date.getMonth();
			
			//str += arr[i].format("%d.%m.%Y\n");
		}
		if (len>0){
			for (var j=date.getDate()+1;j<date.getMonthDays();j++){
				date.setDate(date.getDate()+1);
				h += '<li class="future">'+date.getDate()+'</li>';
			}
			h += '</ul><div class="clear"></div></div>';
		}
		//$('#search-box').html(str);
		return h;
	}
	
	this.setPackages = function(arr){
		if (!arr.length) return false;
		for (var i=0,len=arr.length;i<len;i++){
			this.packages[arr[i].id] = arr[i];
		}
	}
	
	this.getPackage = function(num){
		var res = this.packages[num]||{name:'',unit:''};
		return res;
	}
	
	this.showPeriods = function($el,fn){
		var $slist = $('#context-special').html('');
		var $plist = $('#context-package').html('');
		var $clist = $('#context-closed').html('');
		var types = new Array('canceled','booked','closed','special','package');
		var p = 0;
		var date = new Date();
		var s = '';
		for (var i=0,len=this.periods.length;i<len;i++){
			var a = this.periods[i];
			if (a.id<0) continue;
			var d = date.parse(a.end);
			d.setDate(d.getDate());
			var	h = '';
			if (a.pack!=p){
				p = a.pack;
				h += '<li class="package">'+this.getPackage(p).name+'</li>';
			}
			h += '<li value="'+a.id+'"><table width="100%" cellpadding="0" cellspacing="0">'
				+'<tr><td width="120">'+a.d1+' - '+d.format('%d/%m/%y')+'</td><td><span class="price">: &nbsp; &euro; '
				+a.price+'<span class="unit"> / '+a.unit+'</span></span> &nbsp;</td>'
				+'<td width="25" align="right"><a href="#delete" class="delete"><img src="'+websitePath
				+'img/ico-delete.png" alt="'+getL('delete')+'" /></a></td></tr></table></li>';
			if (a.type==2){
				$clist.append(h);
			} else if (a.type==3){
				$slist.append(h);
			} else if (a.type==4){
				$plist.append(h);
			}
			var arr = this.periodList(a.start,a.end);
			s += a.start+' - '+a.end+' '+types[a.type]+"\n";
			for (var j=0,jlen=arr.length;j<jlen;j++){
				var d = arr[j];
				s += d.format('%d/%m')+' '+types[a.type]+"\n";
				$el.find('li.cell[value="'+d.format('%Y%m%d')+'"]')
					.removeClass('booked closed special package').addClass(types[a.type]);
			}
		}
		//debug(s);
		
		$slist.find('a.delete').click(function(){
			if (fn&&typeof fn=='function') fn.call(this);
			return false;
		});
		$plist.find('a.delete').click(function(){
			if (fn&&typeof fn=='function') fn.call(this);
			return false;
		});
		$clist.find('a.delete').click(function(){
			if (fn&&typeof fn=='function') fn.call(this);
			return false;
		});
	}
	
	this.markPeriod = function($el,startDate,endDate){
		var arr = this.periodList(startDate,endDate);
		$el.find('li.marked').removeClass('marked');
		for (var i=0,len=arr.length;i<len;i++){
			var d = arr[i];
			$el.find('li.cell[value="'+d.format('%Y%m%d')+'"]').addClass('marked');
		}
	}
	
	this.bindCells = function($el){
		var event = 0;
		var startDate = null;
		var endDate = null;
		var currDate = null;
		
		function extractDate(str){
			var d = new Date();
			d.setUTCFullYear(str.substr(0,4));
			d.setUTCMonth(parseInt(str.substr(4,2),10)-1);
			d.setUTCDate(parseInt(str.substr(6,2),10));
			return d.format('%Y-%m-%d');
		}
		
		$el.find('li.cell').click(function(){
			switch (event){
				case 0:
					startDate = $(this).attr('value').toString();
					event = 1;
				break;
				case 1:
					endDate = $(this).attr('value').toString();
					event = 2;
				break;
				case 2:
				break;
			}
		}).hover(function(){
			if (event==1){
				var str = $(this).attr('value').toString();
				if (currDate!=str) Calendar.markPeriod($el,startDate,str);
				currDate = str;
			}
		},function(){
			
		});
	}
	
}

Calendar = new ACalendar();

