var display_month_name = '';
var num_rows = 0;
var max_display_length = 28;
var month_name = new String("Default Month Name");
var month_name_field = document.getElementById('month_name');
var num_days = 28;
var first_dow = 1;
var num_events = 0;
var total_signups = 0;
var events_per_day = new Array(31);
var events_name_array = new Array();
var events_url_array = new Array();
var events_signup_array = new Array();
var events_max_signup_array = new Array();
var events_is_signed_up_array = new Array();
var sUrl = "/_smartsite/modules/etp/etp_display_calendar/get.php?pro_id="+pro_id+"&user_id="+user_id+"&month="+month+"&year="+year+"&pg="+from_page+"&ett_opt="+ett_opt;
var processing_text = "Retreiving data...";
var relative_month = 0;
var future_data_array = new Array();
var historical_data_array = new Array();
var cal_headers_drawn = false;
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); };

var handleSuccess = function(o){
	/* 
	This routine is called when a successful response is received back from the AJAX request.
	This routine will pull out the calendar definition informatin and all of the information
	needed to display events.  This routine works hand-in-hand with t1_display_calendar_ajax.php,
	and both routines assume information will be passed in the following order.  These files need
	to be kept in sync.
	
		Calendar definition information:
			- title (month, year)
			- number of rows
			- day of the week the first day of the month falls on
		Event information
			- number of events
			- number of events for each day of the month
			- name of each event (event name is constructed to include the time)
			- url that event link on calendar should direct the user to
	*/
	if(o.responseText !== undefined){
		//alert('response: '+o.responseText);
		
		var myObject = eval('(' + o.responseText + ')');
		
		// Error checking, first make sure we got back the basic information, including number of events
		var valid_response = true;
		if (myObject.length < 35) {
			display_error();
			valid_response = false;
		}
		
		// Now verify we got back enough information to describe each event
		if (valid_response) {
			num_events = parseInt(myObject[3]);
			// We should have the 35 calendar definition fields plus 2 fields for every event
			var num_required_fields = 35 + (num_events * 3);
			if (myObject.length < num_required_fields) {
				display_error();
				valid_response = false;
			}
		}
		
		// We've got the required number of fields, now display the calendar
		if (valid_response) {
			// First, save off the object so we don't have to retrieve it again if the 
			// user comes back to this month
			if (relative_month >= 0) {
				future_data_array[relative_month] = myObject;
			} else {
				var month_index = (relative_month * -1) - 1;
				historical_data_array[month_index] = myObject;
			}
			
			displayData(myObject);
		}
	}
}

var handleFailure = function(o){
	if(o.responseText !== undefined){
		display_error();
	}
}

var callback =
{
  success:handleSuccess,
  failure:handleFailure,
  argument: { foo:"foo", bar:"bar" }
};


function makeRequest(){
	//alert ('in makeRequest');
	var sUrl = "/_smartsite/modules/etp/etp_display_calendar/t1_display_calendar_ajax.php?pro_id="+pro_id+"&user_id="+user_id+"&month="+month+"&year="+year+"&pg="+from_page+"&ett_opt="+ett_opt;
	var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
}

function displayData(myObject) {
	// Convert the response information into usable data structure
	var response_index = 0;
	
	// First get calendar definition information
	display_month_name = myObject[response_index++];
	num_days = myObject[response_index++];
	first_dow = myObject[response_index++];
	num_events = myObject[response_index++];
	
	// Now buid arrays for events
	for (index=1; index<=31; index++) events_per_day[index] = myObject[response_index++];
	for (index=1; index<=num_events; index++) events_name_array[index] = myObject[response_index++];
	for (index=1; index<=num_events; index++) events_url_array[index] = myObject[response_index++];
	for (index=1; index<=num_events; index++) events_signup_array[index] = myObject[response_index++];
	for (index=1; index<=num_events; index++) events_max_signup_array[index] = myObject[response_index++];
	for (index=1; index<=num_events; index++) events_is_signed_up_array[index] = myObject[response_index++];
	total_signups = myObject[response_index++];
	
	// Finally, clear the exising calendar and redraw the new one
	if (num_rows > 0) clear_cal();
	draw_calendar();
	month_name_field = getObj('month_name');
	month_name_field.innerHTML = display_month_name;
	
	var prev_text = getObj('prev_text');
	var next_text = getObj('next_text');
	prev_text.innerHTML = '';
	next_text.innerHTML = '';
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

function getObj(id) {
	if (document.getElementById){
		var retVal = document.getElementById(id);
	} else if (document.all) {
		var retVal = document.all[id];
	} else if (document.layers) {
		var retVal = document.layers[id];
	}
	return retVal;
}

function insCell(row, cellindex) {
	var browser = BrowserDetect.browser

	if (browser == "Explorer"){
		return row.insertCell()
	} else {
		return row.insertCell(cellindex)
	}
}

function display_month_name() {
	month_name_field = getObj('month_name')
	month_name_field.innerHTML = month_name
}

function change_view() {
	var display_option_text = getObj('display_option');
	var cal_table = getObj(calendar_table_name);

	// Clear the events in the calendar
	clear_cal();

	// Clear the header rows
	for (i=num_header_rows; i>=0; i--) {
		cal_table.deleteRow(i);
	}
	cal_headers_drawn = false;

	// Change the text label used to switch views
	if (display_option == 0) {
		display_option = 1;
		display_option_text.innerHTML = '<u>Switch to Calendar Layout</u>';
	} else {
		display_option = 0;
		display_option_text.innerHTML = '<u>Switch to List Layout</u>';
	}

	// Redraw the calendar in the right format
	draw_calendar();
	return false;
}

function draw_calendar() {
	var cal_table = getObj(calendar_table_name)
	var event_name_index = 1;
	var event_url_index = 1;
	var event_signup_index = 1;
	var event_max_signup_index = 1;
	
	// Display body of calendar

	if (display_option == 0) { // Draw calendar view format
		num_rows = parseInt(num_days) + parseInt(first_dow);
		num_rows = Math.ceil(num_rows/7);

		// Display days of week header row
		if (!cal_headers_drawn) {
			dow_array = new Array("Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat");
			var row = cal_table.insertRow(0);
			for (i = 0; i<=6; i++) {
				day_of_week = dow_array[i];
				var new_cell = insCell(row, i);
				new_cell.className ="t1_cal_dow";
				new_cell.width=70;
				new_cell.innerHTML = day_of_week;
			}
			cal_headers_drawn = true;
			num_header_rows = 0;
		}

		var dom = 1;
		for (rowcounter=1; rowcounter<=num_rows; rowcounter++) {
			row = cal_table.insertRow(rowcounter)
			for (cellcounter=0; cellcounter<7; cellcounter++) {
				var new_cell = insCell(row, cellcounter)
				new_cell.width=70
				new_cell.height=70
				new_cell.className="t1_cal_cell"
				var date_text = ''
				var events_text = ''
				if ((dom == 1) && (cellcounter < first_dow)) {
					date_text = '&nbsp'
				} else {
					if (dom <= num_days) {
						var num_events_today = events_per_day[dom];
						var today_event_counter = 0;
						while (today_event_counter < num_events_today) {
							full_event_text = events_name_array[event_name_index++];
							is_ett_event = false;

							// Check to see if this is an eTennisTeam event ('%ett%' in event name)
							percent_index = full_event_text.indexOf('%');
							if (percent_index > 0) {
								test_string = full_event_text.substring(percent_index,percent_index+5);
								if (test_string == '%ett%')	{
									full_event_text = full_event_text.substring(0,percent_index) + full_event_text.substring(percent_index+5, full_event_text.length);
									is_ett_event = true;
								}
							}

							if (full_event_text.length > max_display_length) {
								event_text = full_event_text.substring(0, max_display_length-3) + '...'
							} else {
								event_text = full_event_text
							}
							event_signup_count = events_signup_array[event_signup_index++];
							event_max_signup = events_max_signup_array[event_max_signup_index++];
							event_url = events_url_array[event_url_index++];

							if (event_max_signup > 0) {
								event_text += ' ('+event_signup_count+'/'+event_max_signup+')';
								full_event_text += "\n("+event_signup_count+'/'+event_max_signup+')';						
							} else if (!is_ett_event) {
								event_text += ' ('+event_signup_count+')';
								full_event_text += "\n("+event_signup_count+')';
							}
							
							if (events_is_signed_up_array[event_name_index - 1] == 'y') {
								events_text += '<tr><td><div class="t1_cal_event">';
								events_text += '<img src="/_smartsite/modules/etp/etp_display_calendar/blue_bullet.jpg">';
								events_text += '&nbsp;<a href='+event_url+' title="'+full_event_text+'"><font color="#339933">'+event_text+'</font></a>';
							} else if(is_ett_event) {
								events_text += '<tr><td><div class="t1_cal_event">';
								events_text += '<img src="/_smartsite/modules/etp/etp_display_calendar/blue_bullet.jpg">';
								events_text += '&nbsp;<a href='+event_url+' title="'+full_event_text+'">'+event_text+'</a>';
							} else {
								events_text += '<tr><td><div class="t1_cal_event">';
								events_text += '<img src="/_smartsite/modules/etp/etp_display_calendar/blue_bullet.jpg">';
								events_text += '&nbsp;<a href='+event_url+' title="'+full_event_text+'"><font color="#003399">'+event_text+'</a>';
							}
							events_text += '</div></td></tr><tr height="1"><td></td></tr>';
							today_event_counter++;
						}
						date_text = dom++
					} else {
						date_text = '&nbsp'
					}
				}

				new_cell.innerHTML='<div class="t1_cal_date">' + date_text + '</div><table>' + events_text + '</table>'
			}
		}

	// Draw list format
	} else {
		num_rows = 0;
		// Display column headers
		if (!cal_headers_drawn) {
			var row1 = cal_table.insertRow(0);
			var row2 = cal_table.insertRow(1);
			num_header_rows = 1;

			// Insert date column header
			var new_cell = insCell(row1, 0);
			new_cell.className ="t1_cal_dow";
			new_cell.width=60;
			new_cell.innerHTML = 'Date';
			new_cell.rowSpan = 2;
			new_cell.style.verticalAlign = 'Bottom';

			// Insert time column header
			var new_cell = insCell(row1, 1);
			new_cell.className ="t1_cal_dow";
			new_cell.width=50;
			new_cell.innerHTML = 'Time';
			new_cell.rowSpan = 2;
			new_cell.style.verticalAlign = 'Bottom';

			// Insert Event column header
			var new_cell = insCell(row1, 2);
			new_cell.className ="t1_cal_dow";
			new_cell.width=300;
			new_cell.innerHTML = 'Event';
			cal_headers_drawn = true;
			new_cell.rowSpan = 2;
			new_cell.style.verticalAlign = 'Bottom';

			// Insert column header for signups
			var new_cell = insCell(row1, 3);
			new_cell.className ="t1_cal_dow";
			new_cell.width=150;
			new_cell.innerHTML = 'Signups';
			new_cell.colSpan = 3;

			// Insert column header for player signup
			var new_cell = insCell(row2, 0);
			new_cell.className ="t1_cal_dow";
			new_cell.width=50;
			new_cell.innerHTML = 'Me';

			// Insert column header for number of players currently signed up
			var new_cell = insCell(row2, 1);
			new_cell.className ="t1_cal_dow";
			new_cell.width=50;
			new_cell.innerHTML = 'Current';

			// Insert column header for maximum number of signups
			var new_cell = insCell(row2, 2);
			new_cell.className ="t1_cal_dow";
			new_cell.width=50;
			new_cell.innerHTML = 'Max';

		}

		var rowcounter = 2;
		for (daycounter=1; daycounter<=num_days; daycounter++) {
			var num_events_today = events_per_day[daycounter];
			if (num_events_today > 0) {
				var today_event_counter = 0;
				while (today_event_counter < num_events_today) {

					// Create a new row for each day in the month with events
					var row = cal_table.insertRow(rowcounter++)
					num_rows++;

					// Each row will have two cells, one for the date and one for the event
					// Create a cell for the date
					var date_cell = insCell(row, 0)
					var month_name_array = display_month_name.split(' ');
					date_cell.innerHTML = month_name_array[0] + ' ' + daycounter;

					// Create cell for time
					var time_cell = insCell(row, 1)

					// Create cell for event
					var event_cell = insCell(row, 2)

					// Create cell for player signed up
					var me_signed_up_cell = insCell(row, 3)

					// Create cell for current number of players signed up
					var curr_signed_up_cell = insCell(row, 4)

					// Create cell for maximum number of players that can sign up
					var max_sign_up_cell = insCell(row, 5)

					var event_text = ''
					full_event_text = events_name_array[event_name_index++];
					is_ett_event = false;

					// Check to see if this is an eTennisTeam event ('%ett%' in event name)
					percent_index = full_event_text.indexOf('%');
					if (percent_index > 0) {
						test_string = full_event_text.substring(percent_index,percent_index+5);
						if (test_string == '%ett%')	{
							full_event_text = full_event_text.substring(0,percent_index) + full_event_text.substring(percent_index+5, full_event_text.length);
							is_ett_event = true;
						}
					}
					
					// If event has a time, then pull time out of the event name so it can be displayed in a separate column
					var event_time = '';
					var time_event_re = /([0-9]*:?[0-9]*?\s?[ap]m)(.*)/i;
					if (full_event_text.match(time_event_re)) {
						re_array = time_event_re.exec(full_event_text);
						re_array_length = re_array.length;
						event_time = re_array[1];
						event_text = re_array[2];
						event_text = event_text.trim();
					}
					time_cell.innerHTML = event_time;

					event_signup_count = events_signup_array[event_signup_index++];
					event_max_signup = events_max_signup_array[event_max_signup_index++];
					event_url = events_url_array[event_url_index++];

					if (events_is_signed_up_array[event_name_index - 1] == 'y') {
						event_text = '&nbsp;<a href='+event_url+' title="'+full_event_text+'"><font color="#339933">'+event_text+'</font></a>';
					} else if(is_ett_event) {
						event_text = '&nbsp;<a href='+event_url+' title="'+full_event_text+'">'+event_text+'</a>';
					} else {
						event_text = '&nbsp;<a href='+event_url+' title="'+full_event_text+'"><font color="#003399">'+event_text+'</a>';
					}
					today_event_counter++;

					// Set values for sign-up cells
					if (events_is_signed_up_array[event_name_index - 1] == 'y') {
						me_signed_up_cell.innerHTML = 'Yes';
					} else {
						me_signed_up_cell.innerHTML = 'No';
					}

					curr_signed_up_cell.innerHTML = event_signup_count;

					if (event_max_signup > 0) {
						max_sign_up_cell.innerHTML = event_max_signup;
					} else {
						max_sign_up_cell.innerHTML = 'Unlimited';
					}

					event_cell.innerHTML = event_text;
				} // while loop processing events for this day

			} // if num_events > 0
		} // for loop on num of days per month

		// If no events were added then display a message to that effect
		if (num_rows == 0) {
			var row = cal_table.insertRow(rowcounter++)
			num_rows++;
			// Insert date column header
			var new_cell = insCell(row, 0);
			new_cell.width=70;
			new_cell.innerHTML = '&nbsp;';

			// Insert time column header
			var new_cell = insCell(row, 1);
			new_cell.innerHTML = '&nbsp;';

			// Insert Event column header
			var new_cell = insCell(row, 2);
			new_cell.innerHTML = 'There were no events found for this month';
			new_cell.colSpan = 4;
		}
	} // if-then-else - drawing in list format

	
	// And finally, update the total number of registered users at the bottom of the calendar
	var total_signups_div = getObj('total_signups');
	total_signups_div.innerHTML="Total number of registrations this month: "+total_signups;
}

function clear_cal() {
	cal_table = getObj(calendar_table_name);
	for (i=num_rows; i>0; i--) {
		cal_table.deleteRow(i+num_header_rows);
	}
}

function display_error() {
	if (num_rows > 0) clear_cal();
	var cal_table = getObj(calendar_table_name);

	var row = cal_table.insertRow(1);
	var new_cell = insCell(row, 0);
	new_cell.width=490;
	new_cell.height=70;
	new_cell.colSpan=7;
	new_cell.className="t1_cal_cell";
	var errmsg = 'An error occurred retreiving the information for this calendar.  Please try refreshing ';
	errmsg += 'this page and contact TennisOne if the problem persists.';
	new_cell.innerHTML=errmsg;
	num_rows++;
}

function prev_month() {
	month--;
	if (month < 1) {
		month = 12;
		year--;
	}
	var prev_text = getObj('prev_text');
	prev_text.innerHTML=processing_text;
	
	// Draw calendar pulling data from save arrays if possible
	relative_month--;
	if (relative_month >= 0) {
		if (relative_month <= future_data_array.length) {
			displayData(future_data_array[relative_month]);
		} else {
			makeRequest();
		}
	} else { // get data from historical data array, if possible
		var abs_index = relative_month * -1;
		if (abs_index <= historical_data_array.length) {
			displayData(historical_data_array[abs_index - 1]);
		} else {
			makeRequest();
		}
	}
}
function next_month() {
	month++;
	if (month > 12) {
		month = 1;
		year++;
	}
	var next_text = getObj('next_text');
	next_text.innerHTML=processing_text;
	relative_month++;
	if (relative_month >= 0) {
		if (relative_month < future_data_array.length) {
			displayData(future_data_array[relative_month]);
		} else {
			makeRequest();
		}
	} else { // get data from historical data array, if possible
		var abs_index = relative_month * -1;
		if (abs_index <= historical_data_array.length) {
			displayData(historical_data_array[abs_index - 1]);
		} else {
			makeRequest();
		}
	}
}


