
Date.prototype.getDayChar = function() {
	var out = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
	
	return out[this.getDay()];
};

Date.prototype.getMonthShortString = function() {
	var out = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 
				'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 
				'Nov', 'Dec'
	];
	
	return out[this.getMonth()];
};

Date.prototype.getMonthString = function() {
	var out = ['January', 'Febuary', 'March', 'April', 
				'May', 'June', 'July', 'August', 'September', 
				'October', 'November', 'Dececember'
	];
	
	return out[this.getMonth()];
};


var Scheduler = (function(){
	var dudes = [];
	
	var tmpDate;
	var wasDate;
	var columns = 0;
	
	var months = "" ;
	var daysTens = "" ;
	var daysOnes = "" ;
	var daysChars = "" ;
	
	var startDate =  new YAHOO.widget.Calendar("cal","startTimePicker"); 
	var endDate = new YAHOO.widget.Calendar("cal","endTimePicker"); 
	
	var monthDebt = 0;
	
	var composeMonth = function(){
		var lastDayThisMonth = new Date(tmpDate.getYear(), tmpDate.getMonth() + 1, 1);
		lastDayThisMonth.setDate(lastDayThisMonth.getDate() -1);
		
		var availableChars = 2 * (lastDayThisMonth.getDate() - tmpDate.getDate());
		
		if((tmpDate.getDate() == 1) || (columns == 0)){
			if (availableChars > tmpDate.getMonthString().length) {
				months += tmpDate.getMonthString();
				monthDebt = tmpDate.getMonthString().length - 2;
			} 
		} else {
			if(monthDebt > 0) {
				monthDebt -= 2;
			} else {
				months += "  ";
			}
		}
	};
	
	var composeTens = function(){
		if (((Math.floor(tmpDate.getDate() / 10) != Math.floor(wasDate.getDate() / 10)) || (columns == 0))){
			daysTens += Math.floor(tmpDate.getDate() / 10) + ' ';
		} else {
			daysTens += '  ';
		}
	} ;
	
	var reset = function(){
		months = "" ;
		daysTens = "" ;
		daysOnes = "" ;
		daysChars = "" ;
		columns = 0;
		monthDebt = 0;
	} ;
	
	var printOutput = function() {
		var key = "\n\n KEY: \n  Available   '+' \n  Unavailable '-' \n  Don't Know  '?'";
		var output; 
		
		// schedule
		output = (
			months + '\n' + 
			daysTens + '\n' + 
			daysOnes + '\n' + 
			daysChars + '\n' 
		);
		// attending dudes
		dudes.each(function(dude){
			output += dude + '\n';
		});
		// print key
		output += key;
		
		return output;
	};
	
	var prepend = function() {
		(dudes.map(function(name){
		    return name.length;
		}).max() + 1).times(function(){
			months += " " ;
			daysTens += " " ;
			daysOnes += " " ;
			daysChars += " " ;
		});
	};
	
	return {
		removeDude: function(who){
			dudes = dudes.reject(function(dude){return dude == who;});
		},
		
		init: function() {
			startDate = new YAHOO.widget.Calendar("cal","startTimePicker"); 
			endDate = new YAHOO.widget.Calendar("cal","endTimePicker");
			
			startDate.selectEvent.subscribe(Scheduler.render); 
			endDate.selectEvent.subscribe(Scheduler.render); 
			
			startDate.render();
			endDate.render();

		},
		
		addDude: function() {
			var newDude = $(document.createElement('div'));
			var pullDude = $(document.createElement('span'));
			var newName = $('dudeNameText').value;
			
			dudes.push(newName);
			
			newDude.update(newName).id = 'name' + (dudes.length - 1);
			$('storedDudes').appendChild(newDude);

			newDude.appendChild(pullDude);
			pullDude.update('remove').addClassName('pullDude').observe('click', function(){
				var who = newDude;
				var whosName = newName;
				
				newDude.remove();
				Scheduler.removeDude(whosName);
				Scheduler.render();
			});
			
			Scheduler.render();
			$('dudeNameText').value = 'Participant Name';
		} ,
		
		render: function() {
			selectedStartDate = startDate.getSelectedDates()[0];
			selectedEndDate = endDate.getSelectedDates()[0];
			
			if(selectedEndDate && selectedStartDate){
				reset();
				prepend();
				
				// make sure start date before end date
				// should maybe alert user instead???
				if(selectedStartDate > selectedEndDate) {
					tmpDate = selectedEndDate;
					selectedEndDate = selectedStartDate;
					selectedStartDate = tmpDate;
				}
				
				tmpDate = new Date(selectedStartDate);
				wasDate = new Date(selectedStartDate);
				
				while(tmpDate <= selectedEndDate){
					// composition
					composeMonth();
					composeTens();
					daysOnes += tmpDate.getDate() % 10 + ' ';
					daysChars += tmpDate.getDayChar() + ' ';
					
					// record keeping
					wasDate = new Date(tmpDate);
					tmpDate.setDate(tmpDate.getDate() + 1);
					columns += 1;
				}
				
				printOutput();
			}
		} ,
		
		sendMail: function() {
			selectedStartDate = startDate.getSelectedDates()[0];
			selectedEndDate = endDate.getSelectedDates()[0];
			
			if(selectedEndDate && selectedStartDate) {
				new Ajax.Request('schedule', {
					method: 'get',  // should be post but not supported by google gadgets
					parameters: {
						schedule: printOutput() , 
						event_name: $F("eventNameText") ,
						address: prompt("Where should we email the schedule?  (More than one address can be separated with a comma)","")
					} ,
					onSuccess: function() {alert('Your schedule has been sent!');} ,
					onFailure: function() {alert("We're sorry, Your schedule could not be sent!");} 
				});
			} else {
				alert('Please select a start and an end date!');
			}
		}
	};
})();


Element.observe(window, "load", function() {
	$('dudeNameText').value = "Participant Name";
});

