/*
Created By: Devon Beck
Website: http://www.401creative.com
Date: 1/12/2009
*/

var currentdate;
var ondate;
var onstartup = true;

var lvsCalendar = Class.create({

	initialize: function(element, options) {
		this.element = $(element);		
		var options = Object.extend({
			url   		: '',
			container	: 'date_container'
		}, options || {});
		this.options = options;
		
		this.d = new Date();
		currentdate = new Date(this.d);
		ondate = new Date(this.d);
		this.createNewWeek(this.d);
		this.createNewEventlist(currentdate);
	},
	
	createNewWeek: function(d,dir) {
		timestampHash = new Hash();
		var newD = new Date(d);
		newD.setDate(newD.getDate()-8);
		$H(timestampHash).set('on', createTimestamp(currentdate.getFullYear(),currentdate.getMonth(),currentdate.getDate()));
		for(var i=0; i<21; i++){	
			newD.setDate(newD.getDate()+1);
			var timestamp = createTimestamp(newD.getFullYear(),newD.getMonth(),newD.getDate());
			timestampHash.set('ts'+i, timestamp);
			timestampHash.set('day'+i, newD.getDay());
		}
		this.request_fillDates($H(timestampHash),dir);
	},
	
	createNewEventlist: function(d) {
		var newD = new Date(d);
		var timestamp = createTimestamp(newD.getFullYear(),newD.getMonth(),newD.getDate());
		timestampHash.set('ts', timestamp);
		this.request_fillEvents($H(timestampHash));
	},
	
	request_fillDates: function(timestampHash,dir) {
		var get_ajax = new Ajax.Request(this.options.url+'frontend/ajax/flow.php', {method: 'POST', parameters: timestampHash.toQueryString(), onComplete: this.response_fillDates.bindAsEventListener(this,dir)});
	},
	
	response_fillDates: function(response,dir) {
		Element.update($('dates'), response.responseText);
		var ul = $(this.options.container).getElementsByTagName('ul');
		if(onstartup){
			onstartup = false;
			$(ul[0]).setStyle({
				position : 'relative',
				left : '-266px'				
			});
		} else {
			if(dir=='n'){
				$(ul[0]).setStyle({
					position : 'relative',
					left : '0px'
				});
				new Effect.Move(ul[0], { x: -266, y: 0, mode: 'absolute', duration: .6, transition: Effect.Transitions.sinoidal });
			} else {
				$(ul[0]).setStyle({
					position : 'relative',
					left : '-532px'
				});
				new Effect.Move(ul[0], { x: -266, y: 0, mode: 'absolute', duration: .6, transition: Effect.Transitions.sinoidal });				
			}
		}
		this.register_anchors();
		this.register_prevNext();
		this.resetWeek(createTimestamp(ondate.getFullYear(),ondate.getMonth(),ondate.getDate()));
	},	
	
	request_fillEvents: function(timestampHash) {
		Element.update($('bottom'), '<div id="loading"><span>Loading Events...</span></div>');
		var get_ajax = new Ajax.Request(this.options.url+'frontend/ajax/events.php', {method: 'POST', parameters: timestampHash.toQueryString(), onComplete: this.response_fillEvents.bindAsEventListener(this)});
	},
	
	response_fillEvents: function(response) {
		Element.update($('bottom'), response.responseText);
	},
	
	register_anchors: function() {
		var anchors = $('dates').getElementsByTagName('a');
		for (var i=0; i<anchors.length; i++){
			var j = $(anchors[i]).href;
			if(!($(anchors[i]).hasClassName('previous') || $(anchors[i]).hasClassName('next'))){
				if(j.length != -1 && j != ''){
					Event.observe(anchors[i], 'click', this.list.bindAsEventListener(this, j));
					anchors[i].onclick = function(){return false;};
				}
			}
		}
	},
	
	list: function(event, href) {
		var slash = href.lastIndexOf('/');
		var end = href.length;
		var timestamp = href.substring(slash+1, end);
		var ts_array = timestamp.split('-');
		var year = parseFloat(ts_array[0]);
		var month = parseFloat(ts_array[1]);
		var date = parseFloat(ts_array[2]);
		ondate.setFullYear(year,month-1,date);
		this.createNewEventlist(ondate);
		this.resetWeek(timestamp);
	},
	
	register_prevNext: function() {
		var prev_container = $('dates').getElementsByClassName('first');
		var next_container = $('dates').getElementsByClassName('last');
		this.prev_btn = $(prev_container[0]).getElementsByTagName('a');
		this.next_btn = $(next_container[0]).getElementsByTagName('a');
		Event.observe(this.prev_btn[0], 'click', this.previous.bindAsEventListener(this));
		Event.observe(this.next_btn[0], 'click', this.next.bindAsEventListener(this));
		this.prev_btn[0].onclick = function(){return false;};
		this.next_btn[0].onclick = function(){return false;};
	},
	
	previous: function() {
		if(!$(this.prev_btn[0]).hasClassName('loading')){
			this.d.setDate(this.d.getDate()-7);
			var testdate = new Date(this.d);
			if(testdate >= currentdate){
				this.createNewWeek(this.d, 'p');
			} else {
				this.d.setDate(this.d.getDate()+7);
			}
		}
		$(this.prev_btn[0]).addClassName('loading');
	},
	
	next: function() {
		if(!$(this.next_btn[0]).hasClassName('loading')){
			this.d.setDate(this.d.getDate()+7);
			this.createNewWeek(this.d, 'n');
		}
		$(this.next_btn[0]).addClassName('loading');
	},
	
	resetWeek: function(ts) {
		var li = $('dates').getElementsByTagName('li');
		for (var i=0; i<li.length; i++){
			var anchors = $(li[i]).getElementsByTagName('a');
			var anchor = anchors[0];
			var j = $(anchor).href;
			var slash = j.lastIndexOf('/');
			var end = j.length;
			var timestamp = j.substring(slash+1, end);
			if(timestamp==ts){
				if(!$(li[i]).hasClassName('on')){
					$(li[i]).addClassName('on');
				}
			} else {
				if($(li[i]).hasClassName('on')){
					$(li[i]).removeClassName('on');
				}
			}
		}
	}
	
});

function createTimestamp(y,m,d) {
	var m = m+1;
	if(m<10){
		m = "0"+m;
	}
	if(d<10){
		d = "0"+d;
	}
	return y+"-"+m+"-"+d;
}
