var $p = new PHP_JS();
var $c =
{
	cal: function(){return $("#calendar-event");},
	slide: function(){return $("#calendar-slide-container");},
	items:{},
	date_start: $p.date('Y-n-j'),
	c_months:{},
	init: function()
	{
		if($c.slide().length == 0) return;
		
		var offset = $p.date_default_timezone_get_offset();
		$c.offset = offset > -5 ? offset+6 : 0 ;
		$c.loader = $("#calendar-loader").show();
		$c.arrows =
		{
			 next: $(".calendar-arrow-right")
			,prev: $(".calendar-arrow-left")
			,hide: function(){$(".calendar-arrow-left,.calendar-arrow-right").hide();}
			,show: function(){$(".calendar-arrow-left,.calendar-arrow-right").show();}
		};
		
		$c.request();
		return $c;
	}
	,request:function()
	{
		$(".calendar-slide,.calendar-slide-cal").hide();
		$c.loader.show();
		$c.arrows.hide();
		
		var date_order = (this.nodeName && this.nodeName=="A") ? $(this).data("date_order") : 'first_load';
		if($("#calevent-"+date_order).length != 1)
		{
			$.ajax({url:'/application/request/event_calendar/'
				   ,data:'date_order='+date_order
				   ,success:function(data)
				   {
						data = utils.eval(data);
						var current = $(data.html).appendTo($c.slide());
						current.data("next",data.next);
						current.data("prev",data.prev);
						$c.new_cal(data.configs);
						$c.callback_request(data.configs.date_order);
				   }});
			return;
		}
		
		$c.callback_request(date_order);
		
	}
	,callback_request:function(date_order)
	{
		$c.loader.hide();
		var current = $("#calevent-"+date_order).show();
		$("#calcal-"+date_order).show();
		
		if(current.data("next"))
			$c.arrows.next.bind("click",$c.request).css({opacity:1,cursor:'pointer'});
		else
			$c.arrows.next.unbind("click",$c.request).css({opacity:0.5,cursor:'default'});
		
		if(current.data("prev"))
			$c.arrows.prev.bind("click",$c.request).css({opacity:1,cursor:'pointer'});
		else
			$c.arrows.prev.unbind("click",$c.request).css({opacity:0.5,cursor:'default'});
			
			$c.arrows.prev.data("date_order",current.data("prev"));
			$c.arrows.next.data("date_order",current.data("next"));
			$c.arrows.show();

	}
	,new_cal: function(configs)
	{
		if(!configs) return;
		var c_date = configs.date_from.split('-');
		
		var current_time = parseInt($p.strtotime(configs.date_from+' '+$c.offset+':00:00'));
		var current_first = parseInt($p.mktime(0,0,0,$p.date('n',current_time),1,$p.date('Y',current_time)));
		var current_month = parseInt($p.date('n',current_time));
		var current_year = parseInt($p.date('Y',current_time));
		
		var next_time = $p.mktime($c.offset,0,0,current_month+1,1,current_year);
		
		this.c_months =
		{
			first:
			{
				time: current_time,
				days: parseInt($p.date('t',current_time)),
				first: parseInt($p.date('w',current_first)),
				label: $p.date('F Y',current_time)
			},
			next:
			{
				time: parseInt(next_time),
				days: parseInt($p.date('t',next_time)),
				first: parseInt($p.date('w',next_time)),
				label: $p.date('F Y',next_time)
			}
		};
		
		var cal_container = $('<div id="calcal-'+configs.date_order+'" class="calendar-slide-cal"/>').appendTo(this.cal());
		var cal1 = this.create_cal(this.c_months.first).appendTo(cal_container);
		var cal2 = this.create_cal(this.c_months.next).appendTo(cal_container);
		cal_container.append('<div class="clear" />');
		
		
		
		var height1 = cal1.height();
		var height2 = cal2.height();
		if(height1 > height2) cal2.height(height1);
		else if(height1 < height2) cal1.height(height2);
		
		var from = $p.date('j',parseInt(configs.date_from_time));
		var current_month = '.monthid-'+this.c_months.first.time;
		var daystart = $(current_month+'.day-'+from);
		
		daystart.addClass('selected');
		if(configs.date_to != configs.date_from)
		{
			var next_day = 0;
			while(next_day < parseInt(configs.date_to_time))
			{
				from++;
				next_day = $p.mktime($c.offset,0,0,c_date[1],from,c_date[0]);
				if(next_day >= this.c_months.next.time)
				{
					 current_month = '.monthid-'+this.c_months.next.time;
					 if(next_day == this.c_months.next.time)
					 {
						c_date = $p.date("Y-n-j",next_day).split('-');
						from = parseInt(c_date[2]);
					 }
				}
				$(current_month+'.day-'+from).addClass('selected');
			}
			
		}
		
		return this;
	},
	create_cal: function(current)
	{
		this.current = current;
		var calendar = this.html.month();
		
		
		var no_week = 0;
		var current_week = -1;
		var loop = 0;
		var table = calendar.find('.table');
		
			for(var i=1;i<this.current.days+1;i++)
			{
				if(current_week != no_week)
				{
					var week = this.html.week().appendTo(table);
					current_week = no_week;
				}
				
				if(this.current.first !=0 && loop==0)
				{
					this.html.blanks(this.current.first).appendTo(week);
					loop = this.current.first;
				}
				
				this.html.day(i).addClass('monthid-'+this.current.time+' day-'+i).appendTo(week);
				loop++;
				
				if(loop%7 == 0) no_week++;
			}
	
			if(loop%7 != 0)
				this.html.blanks(7-(loop%7)).appendTo(week);
		
		return calendar;
	},
	html: 
	{
		day: function(day)
		{
			return $('<div class="td">'+day+'</div>');
		},
		blanks: function(int)
		{
			return $("<div class='td' />").width(int*14+'%').addClass('no-day');
		},
		week: function()
		{
			return $("<div class='tr' />");
		},
		month: function()
		{
			var wdays = ['S','M','T','W','T','F','S'];
			
			var month = $("<div class='cal-month' />").attr({id:'month_'+$c.current.time})
						 .html("<div class='cal-month-label'>"+$c.current.label+"</div>");
			var table = $("<div class='table' />").appendTo(month);
			var week = $c.html.week();
				for(i in wdays)
					week.append($c.html.day(wdays[i]).addClass('wdays'));
											  
				table.append(week).append($c.html.week().append($c.html.blanks(7).removeClass('no-day').height(0)));
						
			return month;
		}
		
	}
};

$($c.init);


// search

var $s = 
{
	items: {},
	init: function()
	{
		var form = $("#search-events-form");
		form.find('input[name=q]').bind('blur keypress',
			function()
			{
				clearInterval($s.interval);
				$s.interval = setInterval(function(){form.get(0).submit()},1000);
				
			});
		
		
		form.get(0).submit();
		return this;
	},
	interval: [],
	pagination_opts:function()
	{
		return {
			items_per_page:10,
			num_display_entries:10,
			current_page:0,
			num_edge_entries:2,
			link_to:"javascript:;",
			prev_text:"&nbsp;",
			next_text:"&nbsp;",
			ellipse_text:"...",
			prev_show_always:true,
			next_show_always:true,
			callback: $s.populate
		};
	},
	send: function()
	{
		clearInterval($s.interval);
		$.ajax({url:'/application/request/get_events',data:$("#search-events-form").serialize(),success:$s.request_done});
	},
	request_done: function(data)
	{
		if(data) data = utils.eval(data);
		$s.items = data;
		
		$("#search-events-pagination").hide();
		if($s.items.length == 0)
		{
			return $("#search-events-content").html(lang('no search results'));
		}
		else if($s.items.length > $s.pagination_opts().items_per_page)
		{
			$("#search-events-pagination").show()
		}
		
		$("#search-events-pagination").pagination($s.items.length, $s.pagination_opts());
	},
	populate: function(page_index,jq)
	{
		var items_per_page = $s.pagination_opts().items_per_page;
		var max_elem = Math.min((page_index+1) * items_per_page, $s.items.length);
		var newcontent = '';
		
		var html =  '<div class="search-event">'
					+'<div class="title"><a href="%(url)s">%(name)s</a></div>'
					+'<i>%(str_date)s - %(location)s</i>'
					+'<a href="%(cat_url)s" class="event-cat">%(cat_name)s</a>'
					+'</div>';
		for(var i=page_index*items_per_page;i<max_elem;i++)
			newcontent += $.sprintf(html,$s.items[i]);
	
		$("#search-events-content").html(newcontent);
		$("#search-events-content .search-event").filter(function(i){return i%2!=0;}).addClass('odd');
	}
	
	
	
	
};

