jQuery.fn.gical = function(options) {
	return this.each(function(){
		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 cal_html = "<div id='gi-cal'><div id='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='cal-heading'>January 2009</h2></div><table cellspacing='1' id='calendar'><thead><tr id='week-headings'><th id='sunday'>Su</th><th id='monday'>Mo</th><th id='tuesday'>Tu</th><th id='wednesday'>We</th><th id='thursday'>Th</th><th id='friday'>Fr</th><th id='saturday'>Sa</th></tr></thead><tbody id='cal-grid'><tr></tr></tbody></table></div>";
		//var cal_html = "<div id='gi-cal'><div id='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='cal-heading'>January 2009</h2></div><table cellspacing='1' id='calendar'><thead><tr id='week-headings'><th id='monday'>Mo</th><th id='tuesday'>Tu</th><th id='wednesday'>We</th><th id='thursday'>Th</th><th id='friday'>Fr</th><th id='saturday'>Sa</th><th id='sunday'>Su</th></tr></thead><tbody id='cal-grid'><tr></tr></tbody></table></div>";
		var calCell;
		
		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();
		
		
		$(".cal-nav-next").click(function(){
			changeMonth(1);
			return false;
		});
		
		$(".cal-nav-prev").click(function(){
			changeMonth(-1);
			return false;
		});
		
		// -------------------------------------------------
		function changeYear(amount){
			year += amount;
			today.setFullYear(year);
		}
		
		function changeMonth(amount){
			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();
		}
		
		function setUp(){
			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;
			}
			
			heading = MonthName[today.getMonth()] +" "+ year;
			
			$("#cal-heading h2").html(heading);
			
			setUpDays();
			excludePast();
			assignActions();
			findToday();
			selectionHandler();
		}		
		
		function setUpDays(){
			$("#cal-grid").each(function(){
				$(this).empty();
				var counter = 0 - first_day;
				// STart on MONDAY [buggy]
				//var counter = 1 - first_day; 
				var week = 1; 
				while(counter < Mdays[month]){
					
					$(this).append("<tr id='week-"+week+"'></td>");
					var target = $("#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;
							target.append("<td id='"+id+"'>"+(counter + 1)+"</td>");
							
							counter++;
						}else{
							target.append("<td class='other-month'></td>");
							counter++; 
						}
					}
					
					week++;
				}
				
			});
		}
		
		// ------------------------------------------------------
		function assignActions(){
			$("#cal-grid td").click(function(){
				if($(this).hasClass("excluded") == false){
					registerDate($(this).attr("id"));
					$(this).addClass("selected");
					findBetweenDates();
					selectionHandler();
					$(this).addClass("clicked");
				}
			})
		}
		
		function excludePast(){
			$("#gi-cal td").each(function(){
				if($(this).attr("id") < zeroDate(todaysID)){
					$(this).addClass("excluded");
				}
			});		
		}
		
		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;
		}
		
		function registerDate(date){
		
			if(clickCount == 2){
				dateRange = new Array();
				selectedRange = new Array();
				clickCount = 0;
			}
			
			dateRange.push(date);
			dateRange.sort();
			input.attr("value", dateRange);
			if(clickCount == 1){ 
				input.change(); 
			}
			
			// iStay stuff
			// update the form values
			
			// if they only select 1 day, we need to select the day after for convenience
			if(dateRange.length == 1){
				// rearrange date
				var de = dateRange[0].split("-");
				var formatDate = de[1] + "/" + de[2] + "/" + de[0];
				$("#dateIn").attr("value", formatDate);
				
				// istay will accecpt on valid dates like october 60th
				// so we can just add 1.
				
				// rearrange date
				var formatDate = de[1] + "/" + (Number(de[2]) + 1) + "/" + de[0];
				$("#dateOut").attr("value", formatDate);
				
			}else{
				// rearrange date
				var de = dateRange[0].split("-");
				var formatDate = de[1] + "/" + de[2] + "/" + de[0];
				$("#dateIn").attr("value", formatDate);
				
				// rearrange date
				var de = dateRange[1].split("-");
				var formatDate = de[1] + "/" + de[2] + "/" + de[0];
				$("#dateOut").attr("value", formatDate);
			}
			
			clickCount++;
		}

		function selectionHandler(){
			$(".selected").removeClass("selected");
			$(".clicked").removeClass("clicked");
			for(var p in selectedRange){
				$("#" + selectedRange[p]).addClass("selected")
			}
		}
		
		
		// I really need to start comentting properly
		// What the fuck does this do????
		function testEight(){
			var st = ("09");
			while(st > 0){
				st--;
				//alert(st);
			}
		}
		
		function findBetweenDates(){
			//testEight();
			if(dateRange[1] != null){
				var selectDate = dateRange[1];
				var startDate = dateRange[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;
					selectedRange.push(selectDate);
				}
				
				selectedRange.push(dateRange[1]);
			}
		}
		
		function excludePastSelection(limit){
			if(rangePointer == 0){
				$("#cal-grid td").removeClass("excluded");
				var cell_index = (parseInt(limit) + first_day -1);
				$("#cal-grid td:lt("+cell_index+")").addClass("excluded");
			}
		}
		
		function findToday(){
			//$("#" + zeroDate(todaysID)).addClass("today");
		}
		
		function togglePointer(){
			var current_pointer = rangePointer;
			if(rangePointer == 1){
				rangePointer = 0
			}else{
				rangePointer = 1;
			}
			return current_pointer;
		}
		
		function dateIn(){
			
		}
		
	
	});
	
  
};

