// GiCal 2.0
// jquery.gical.2.js
// © Geekery Industries Limited
// Created by: tom@geekery-industries.com
// ---------------------------------------------------
// A simple to use inline datepicker plugin
//
// Version 2.0
// Automatically excludes dates in the past
// Allows for date ranges to be selected
// Works across multiple calendars 
// Stores dates in YYYY-MM-DD format for easy sorting and db storage
//
// Version 3 Todo
// Options:
// - allow past dates
// - allow calendars to interact with each other
// - Allow different date formats
// ---------------------------------------------------

var calID = 0;
var dateRanges = new Array();
var selectedRanges = new Array();

(function ($) { 
	
$.fn.gical2 = function(/*options*/) {
	
	/*
	options = $.extend({
	optionOne: 'defaultValue',
	optionTwo: { partOne: 'defaultValue'}
	}
	}, options);
	*/ 

	$(this).each(function() {
		
		dateRanges[calID] = new Array();
		selectedRanges[calID] = new Array();
		
		// Hide input field
		var input = $(this);
		input.css("display", "none");
		
		var Today = new Date();
		var MonthName = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
		var DayName = new Array("sun", "mon", "tue", "wed", "thur", "friday", "saturday");
		var Mdays = new Array();
		Mdays[0] = 31;
		Mdays[1] = 28;
		Mdays[2] = 31;
		Mdays[3] = 30;
		Mdays[4] = 31;
		Mdays[5] = 30;
		Mdays[6] = 31;
		Mdays[7] = 31;
		Mdays[8] = 30;
		Mdays[9] = 31;
		Mdays[10] = 30;
		Mdays[11] = 31;
		
		var thisCal = "gi-cal-" + calID;
		var target = "#"+thisCal;
		calID ++;

		var cal_html = "<div id='"+thisCal+"' class='gi-cal'><div class='cal-heading'><a class='cal-nav-prev icon-prev' href=''><span>Prev</span></a><a class='cal-nav-next icon-next' href=''><span>Next</span></a><h2 class='month-year'>January 2009</h2></div><table cellspacing='1' id='calendar'><thead><tr class='week-headings'><th class='sunday'>Su</th><th class='monday'>Mo</th><th class='tuesday'>Tu</th><th class='wednesday'>We</th><th class='thursday'>Th</th><th class='friday'>Fr</th><th class='saturday'>Sa</th></tr></thead><tbody class='cal-grid'><tr></tr></tbody></table></div>";

		input.after(cal_html);
		
		var today = new Date();
		var todaysID = today.getUTCFullYear() +"-"+ (today.getUTCMonth() + 1) +"-"+ today.getUTCDate();
		var thisDay = new Date();
		var year;
		var month;
		var day_of_week;
		var day_of_month;
		var first_day;
		var heading;
		var dateRange = new Array();
		var rangePointer = 0;
		var selectedRange = new Array();
		var clickCount=0;
		
		setUp(target);
		
		$(target + " .cal-nav-next").click(function(){
			changeMonth(1, target);
			return false;
		});
		
		$(target + " .cal-nav-prev").click(function(){
			changeMonth(-1, target);
			return false;
		});
		
		// SETUP ----------------------------------------------------------
		
		function setUp(targetID){
			
			year = today.getUTCFullYear();
			month = today.getUTCMonth();
			day_of_week = today.getUTCDay();
			day_of_month = today.getUTCDate();
			
			var month_start = today;
			month_start.setDate(1);
			first_day = month_start.getDay();
			
			//check for leap years
			if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 !=0))){
				Mdays[1] = 29; 
			}else{
				Mdays[1] = 28;
			}
			
			var heading = MonthName[today.getMonth()] +" "+ year;
			$(target + " .cal-heading h2").html(heading);
			
			setUpDays(targetID);
			excludePast(targetID);
			assignActions(targetID);
			//findToday();
			//selectionHandler(id - 1);
			
		}	
		
		// SETUP DAYS ----------------------------------------------------------
		
		function setUpDays(targetid){ 
			var targetGrid = targetid + " .cal-grid";
				
			$(targetGrid).empty();
			var counter = 0 - first_day;
			var week = 1; 
			while(counter < Mdays[month]){
				$(targetGrid).append("<tr id='week-"+week+"'></td>");
				var targetWeek = $(targetGrid + " #week-" + week);
				
				for(var d=0; d <= 6; d++){
				
					if(counter >= 0 && counter < Mdays[month]){
						//var id = (month + 1) +"-"+ (counter+1) +"-"+ year; 
						// Year Month Day - Makes it easier to sort
						zeroDay = ((counter + 1) < 10) ? "0" + (counter + 1) : counter + 1;
						zeroMonth = ((month + 1) <= 9) ? "0" + (month + 1) : month + 1;
						var id = year + "-" + zeroMonth + "-" + zeroDay;
						$(targetWeek).append("<td id='"+id+"'>"+(counter + 1)+"</td>");
						
						counter++;
					}else{
						$(targetWeek).append("<td class='other-month'></td>");
						counter++; 
					}
				}
				
				week++;
			}
			
			
		}
		
		// Exclude Past Days ----------------------------------------------------------
		
		function excludePast(targetCal){
			$(targetCal + " td").each(function(){
				if($(this).attr("id") < zeroDate(todaysID)){
					$(this).addClass("excluded");
				}
			});		
		}
		
		// Zero Date ----------------------------------------------------------
		
		function zeroDate(date){
			var bits = date.split("-");
			bits[1] = (bits[1] < 10) ? "0" + bits[1] : bits[1] ;
			bits[2] = (bits[2] < 10) ? "0" + bits[2] : bits[2] ;
			var formattedDate = bits[0] +"-"+ bits[1] +"-"+ bits[2];
			return formattedDate;
		}
		
		// Assign Actions ----------------------------------------------------------
		
		function assignActions(target){
			$(target + " .cal-grid td").click(function(){
				if($(this).hasClass("excluded") == false){
					
					//******************************
					// Not sure why I have to subtract 1
					// here. Might be a problem later.
					//******************************
					var id = getIdFromTarget(target);
					registerDate(id, $(this).attr("id"));
					
					$(this).addClass("selected");
					findBetweenDates(id);
					selectionHandler(id);
					$(this).addClass("clicked");
				}
			})
		}
		
		function getIdFromTarget(target){
			var split_target = target.split("-");
			return Number(split_target[2]);
		}
		
		// ************************************************************************
		// Register Date ----------------------------------------------------------
		// ************************************************************************
		function registerDate(id,date){
			if(clickCount == 2){
				dateRanges[id] = new Array();
				selectedRanges[id] = new Array();
				clickCount = 0;
			}
			
			dateRanges[id].push(date);
			dateRanges[id].sort();
			input.attr("value", dateRanges[id]);
			if(clickCount == 1){ 
				input.change(); 
			}
			clickCount++;
		}
					
		// Find Between Dates ----------------------------------------------------------
		
		function findBetweenDates(id){
			//testEight();
			if(dateRanges[id][1] != null){
				var selectDate = dateRanges[id][1];
				var startDate = dateRanges[id][0];
				// go backwards through time
				while(selectDate > startDate){
				//for(var i = 0; i < 10; i++){
					dateBits = selectDate.split("-");
					sDay = Number(dateBits[2]);
					sMonth = Number(dateBits[1]);
					sYear = Number(dateBits[0]);
					sDay -= 1;
					if(sDay == 0){
						sDay = 31;
						sMonth -= 1;
					}
					
					if(sMonth == 0){
						sMonth = 12;
						sYear -= 1;
					}
					
					// put zero leading back
					sDay = (sDay <= 9) ? "0" + sDay: sDay;
					sDay = (sDay == "0-1") ? "07" : sDay;
					sMonth = (sMonth < 10) ? "0" + sMonth: sMonth;
					
					selectDate = sYear + "-" + sMonth + "-" + sDay;
					selectedRanges[id].push(selectDate);
				}
				
				selectedRanges[id].push(dateRange[1]);
			}
		}
		
		
		// Selection Handler ----------------------------------------------------------
		
		function selectionHandler(id){
			var target = "#gi-cal-" + id;
			$(target + " .selected").removeClass("selected");
			$(target +  " .clicked").removeClass("clicked");
			for(var p = 0; p <= selectedRanges[id].length; p++){
				$(target + " #" + selectedRanges[id][p]).addClass("selected");
			}
			
			// ************************************
			// This is a worry
			// Why did I do it like this???
			// ************************************
			$(target + " #" + dateRanges[id][1]).addClass("selected");
		}
		
		// Chage Year / Month ---------------------------------------------------------
		
		function changeYear(amount){
				year += amount;
				today.setFullYear(year);
			}
			
		function changeMonth(amount, target){
			if(month == 0 && amount == -1){
				month = 11;
				changeYear(-1);
			}else if(month == 11 && amount == 1){
				month = 0;
				yearChange = 1;
				changeYear(1);
			}else{
				month += amount;
			}
			
			today.setMonth(month);
			setUp(target);
		}
	
	});	
	
}
})
(jQuery);