/* GLOBALS */
var response_count=0;
var logged_in;
var loggedout_sessions;
var attempted_user_action;
var error_set = true;
var webServiceURL = appURL + '/data_interface.php?s='+Site;
var checkboxType = "image";

var display_prefix = "session";
var display_suffix = "list";

var arrowCoords = new Object;
var tooltipAddCoords = new Object;
var tooltipRemoveCoords = new Object;

var working_div;
var working_div2;

var loader = "<center><img src='/img/default/load.gif' title='Loading...'/></center>";

var Images = {
	btn_addToSchedule : imageURL + '/btn_addToSchedule.gif',
	load : imageURL + '/load.gif'
}

window.addEvent('domready', function(){
	var scroll = new MooScroll({selector:'.scrollable', handleActiveOpacity:1});

	
	$$('.button').each(function(item){
		var rightEdge = new Element('div', {
		    'class': 'button-right-edge'});
		rightEdge.inject(item, "bottom");
	});

	
	$('tooltip-arrow-up').setStyle("visibility", "hidden");
	$('tooltip-arrow-up').setStyle("display", "block");
	arrowCoords = $("tooltip-arrow-up").getCoordinates();
	$('tooltip-arrow-up').setStyle("display", "none");
	$('tooltip-arrow-up').setStyle("visibility", "visible");

	
	refreshPage();
	
	var form = document.getElementById('session_search');
	form.onkeydown = function(e) {
		e = e || window.event;
		if (e.keyCode == 13) {
			document.getElementById('search_string').value=document.getElementById('search_field').value;
			getSessions();
			return false;
		}
	};
	checkLogin();
	
	working_div = new Element(
			"div", {
				'class' : 'speakers-display', 
				'styles': {
		        	'visibility': 'hidden',
		        	'position': 'absolute'
					}
				}
			);
	working_div.inject($(document.body));
	working_div2 = new Element(
			"div", {
				'class' : 'speakers-display', 
				'styles': {
		        	'visibility': 'hidden',
		        	'position': 'absolute'
					}
				}
			);
	working_div2.inject($(document.body));
});

var timeout_queue = {
	queue : [],
	timeout : false,
	running : false,
		
	start : function() {
		this.running = true;
		this.shift();
	},
		
	push : function(params) {
		this.queue.push(params);
	},
		
	shift : function() {
		if (this.queue.length == 0) {
			this.running = false;
			return;
		}
		if (this.timeout) {
			clearTimeout(this.timeout);
		}
		func_plus_args = this.queue.shift();
		func = func_plus_args.func;
		args = func_plus_args.args;
		time = func_plus_args.time;
		func(args);
		this.timeout = setTimeout("timeout_queue.shift()", time);
	},
	
	clear : function() {
		if (this.timeout) {
			clearTimeout(this.timeout);
		}
		this.running = false;
		this.queue = [];
	}
}

/**
 * @param id
 * @return
 */
function disable(id) {
	if (!$(id)) {
		return;
	}
	var element =  $(id);
	if (element.get('tag') == 'a') {
		if($(id+"-disabled")) {
			element.setStyle("display", "none");
			$(id+"-disabled").setStyle("display", "block");
		} else {
			var elementCopy = element.clone(true, true);
			elementCopy.removeClass('active');
			elementCopy.removeClass('inactive');
			elementCopy.addClass('disabled');
			elementCopy.setProperty('id', id+"-disabled");
			elementCopy.setProperty('onclick', 'return false;');
			element.setStyle("display", "none");
			elementCopy.inject(element, 'before');
		}
		return;
	}
	if (element.getElement('.disabler')) {
		return;
	}
	var disabler = new Element('div', {
	    'id': id+'-disabler',
	    'class': 'disabler'
	});
	disabler.inject(element, 'top');
}

function enable(id) {
	if (!$(id)) {
		return;
	}
	var element =  $(id);
	if (element.get('tag') == 'a') {
		element.setStyle("display", "block");
		$(id+"-disabled").setStyle("display", "none");
		return;
	}
	var removeElement = element.getElement('.disabler');
	if (!removeElement) {
		return;
	}
	removeElement.dispose();
}

/**
 * @return
 */
function truncate_speakers(from) {
	if (!from) {
		from = $("list");
	}
	if (display_suffix == "list") {
		working_div.addClass("speakers-display-list");
		working_div2.addClass("speakers-display-list");
		working_div.removeClass("speakers-display-calendar");
		working_div2.removeClass("speakers-display-calendar");
	} else {
		working_div.removeClass("speakers-display-list");
		working_div2.removeClass("speakers-display-list");
		working_div.addClass("speakers-display-calendar");
		working_div2.addClass("speakers-display-calendar");
	}
	from.getElements('.speakers-display').each(function(speakerdiv) {
		timeout_queue.push({func : truncate_speakers_text, args : {speakerdiv : speakerdiv}, time : 2});
	});
	timeout_queue.start();
}

/**
 * @param object args
 * @return
 */
function truncate_speakers_text(args) {
		
		var speakerdiv = args.speakerdiv;
		var html = speakerdiv.get('html');
		var anchors_reg = new RegExp("<a[^>]*>[^<]*</a>", "gi");
		anchors = html.match(anchors_reg);
		working_div2.set('html', html);
		var coordinates = working_div2.getScrollSize();
		var width = coordinates.x;
		var parent = speakerdiv.getParent();
		var parentCoordinates = parent.getCoordinates();
		var parentWidth = parentCoordinates.width;
		var target_width = parentWidth-20;
		if (width<target_width) {
			return;
		}
		var contents = "";
		if (anchors) {
			for (x=0; x<anchors.length; x++) {
			
				if (x == anchors.length-2) {
					more = " and ";
				} else if (x == anchors.length-1) {
					more = "";
				} else {
					more = ", ";
				}
				working_div.set('html', contents + anchors[x] + more);
				var working_div_coords = working_div.getScrollSize();
				working_div_width = working_div_coords.x;
				if (working_div_width < target_width) {
					contents += anchors[x] + more;
				} else {
					link_regexp = new RegExp("(<a[^>]*>)([^<]*)", "i");
					inside_link = link_regexp.exec(anchors[x]); 
					link = inside_link[1];
					text = inside_link[2];
					contents += link+truncate_text_by_word(contents, text, target_width)+"</a>...";
					break;
				}
			}
		} else {
			contents = truncate_text_by_word("", html, target_width)+"...";
		}
		speakerdiv.set('html', contents);
		speakerdiv.setStyle("visibility", "visible");
}

function truncate_text_by_word(start_text, questionable_text, target_width) {
	add_text = "";
	var tokens = questionable_text.split(" ");
	for (y=0; y<tokens.length; y++) {
		
		working_div.set('html', start_text + add_text + " " + tokens[y]);
		var working_div_coords = working_div.getScrollSize();
		working_div_width = working_div_coords.x;
		if (working_div_width < target_width) {
			add_text += " "+tokens[y];
		} else {
			add_text += truncate_text_by_char(start_text+add_text, " "+tokens[y], target_width)
			break;
		}
	}
	return add_text;
}

function truncate_text_by_char(start_text, questionable_text, target_width) {
	add_chars = "";
	for (z=0; z<questionable_text.length; z++) {
		this_char = questionable_text.charAt(z);
		working_div.set('html', start_text + add_chars + this_char);
		var working_div_coords = working_div.getScrollSize();
		working_div_width = working_div_coords.x;
		if (working_div_width < target_width) {
			add_chars += this_char;
		} else {
			break;
		}
	}
	return add_chars;
}
/**
 * @return
 */
function TB_remove_conditional() {
	if ($('TB_window')) {
		TB_remove();
	}
}

/**
 * @param string title
 * @param string url
 * @param Object params
 * @return void
 */
function TB_show_conditional(title, url, params) {
	if (params) {
		if (typeof params == "string") {
			url += params;
		} else {
			for (field in params) {
				url += "&"+field+"="+params[field];
			}
		}
	}
	if ($('TB_window')) {
		jsonRequest(webServiceURL, function(data, text) {
			TB_change_content(title, text);
		}, params)
	} else {
		TB_show(title, url);	
	}
}

/**
 * 
 * @return
 */
function TB_change_content(title, content) {
	var windowContent = "<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+title+"</div>";
	windowContent += "<div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' onclick='TB_remove();'>close</a></div></div>";
	
	windowContent += "<div id='TB_ajaxContent'>"
	windowContent += content;
	windowContent += "</div>";
	$('TB_window').innerHTML = windowContent;
}

/**
 * @return int
 */
function getScrollTop() {
	var ScrollTop = document.body.scrollTop;
	if (ScrollTop == 0)
	{
	    if (window.pageYOffset)
	        ScrollTop = window.pageYOffset;
	    else
	        ScrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;
	}
	return ScrollTop;
}

function showSessionDescription(linkObj, session_id) {
	hideTooltip();
	var linkName = $(linkObj).id;
	var linkCoords = $(linkObj).getCoordinates($('ScheduleBuilder-application'));
	
	jsonRequest(webServiceURL, function(data) {
		
		showTooltip(data.session_description, linkCoords);
		appendDebugData(data.debug_data);
	}, {'session_id':session_id, 'action':'get_session_description'});
}

function showSpeakerDescription(linkObj, speaker_id) {
	hideTooltip();
	var linkName = $(linkObj).id;
	var linkCoords = $(linkObj).getCoordinates($('ScheduleBuilder-application'));
	
	jsonRequest(webServiceURL, function(data) {
		
		showTooltip(data.speaker_description, linkCoords);
		appendDebugData(data.debug_data);
	}, {'speaker_id':speaker_id, 'action':'get_speaker_description'});
}

/**
 * @param string content
 * @param object sourceCoords a mootools coordinates object
 * @return void
 */
function showTooltip(content, sourceCoords) {
	
	$('tooltip_content').innerHTML = content;				
	var tooltip = $("tooltip_smarthbox");
	tooltip.setStyle("display", "block");
	var tooltipCoords = tooltip.getCoordinates($('ScheduleBuilder-application'));

	var scheduleBuilderCoords = $('ScheduleBuilder-application').getCoordinates();
	var tooltipLeft = Math.round((scheduleBuilderCoords.width/2) - (tooltipCoords.width/2));
	
	var tooltipTop =  sourceCoords.top - tooltipCoords.height - arrowCoords.height;
	var scrollTop = getScrollTop() - scheduleBuilderCoords.top;
	var arrowTop = sourceCoords.top - arrowCoords.height -3;
	var arrowName = 'tooltip-arrow-up';
	if (scrollTop > tooltipTop) {
		tooltipTop = sourceCoords.bottom + arrowCoords.height;
		arrowName = 'tooltip-arrow-down';
		arrowTop = sourceCoords.bottom + 3;
	}
	tooltip.setStyle("top", tooltipTop);
	
	var arrowLeft = sourceCoords.left + Math.round(sourceCoords.width/2);
	if (arrowLeft > tooltipLeft + tooltipCoords.width - arrowCoords.width) {
		arrowLeft = tooltipLeft + tooltipCoords.width - arrowCoords.width - 3;
	} else if (arrowLeft < tooltipLeft) {
		tooltipLeft = arrowLeft - 50;
	}
	tooltip.setStyle("left", tooltipLeft);
	
	$(arrowName).setStyle("left", arrowLeft);
	$(arrowName).setStyle("top", arrowTop);
	$(arrowName).setStyle("display", "block");
}



/**
 * @return void
 */
function hideTooltip() {
	$$("._smarthbox").setStyle("display", "none");
	$('tooltip-arrow-up').setStyle("display", "none");
	$('tooltip-arrow-down').setStyle("display", "none");
}

function showSmallTooltip(sourceObj, html) {
	var source = $(sourceObj);
	var sourceCoords = source.getCoordinates($('ScheduleBuilder-application'));
	var sourcePos = source.getPosition($('ScheduleBuilder-application'));
	var top = sourcePos.y;
	var left = sourcePos.x;

	tooltip  = $('tooltip-small');
	tooltip.innerHTML=html;
	tooltip.setStyle("display", "block");
	var tooltipCoords = tooltip.getCoordinates($('ScheduleBuilder-application'));
	height = tooltipCoords.height;
	width = tooltipCoords.width;

	
	// @TODO FIGURE OUT HOW TO GENERALIZE THIS
	//if (adjustLeft==undefined) { // a kludge. Can't figure out why this is necessary
		var adjustLeft = 0;
	//}
	
	var adjustTop = 8;
	
	tooltip.setStyle("top", top - adjustTop - height);
	tooltip.setStyle("left", left - adjustLeft + (sourceCoords.width/2) - (width/2));
	tooltip.setStyle("display", "block");
	
	var arrow = $('tooltip-small-arrow');
	arrow.setStyle("top", top - adjustTop - 1);
	arrow.setStyle("left", left - adjustLeft + (sourceCoords.width/2) - 5);
	arrow.setStyle("display", "block");
}

function hideSmallTooltip() {
	$('tooltip-small').setStyle("display", "none");
	$('tooltip-small-arrow').setStyle("display", "none");
}

/**
 * @param checkboxObj
 * @return
 */
function showAddTooltip(checkboxObj) {
	var checkboxDiv = $(checkboxObj);
	var checkbox = checkboxDiv.getChildren()[0];
	if (checkbox.checked) {
		html = "Remove from my schedule";
	} else {
		html = "Add to my schedule";
	}
	showSmallTooltip(checkboxObj, html);
}

/**
 * @return void
 */
function hideAddTooltip() {
	hideSmallTooltip();
}

/**
 * @param LinkObject link
 */
function activate(link) {
	if (!$(link).hasClass("inactive")) {
		return false;
	}
	var reg = /[^\s]*/;
	var classNames = $(link).className;
	var mainClass = reg.exec(classNames);
	//link.removeClass("inactive");
	var siblingLinks = $$('.'+mainClass);
	siblingLinks.each(function(item) {
		item.removeClass("active");
		if (!item.hasClass("inactive")) {
			item.addClass("inactive");
		}
	});
	$(link).addClass("active");
	$(link).removeClass("inactive");
}


function toggleActive(link) {
	if (link.hasClass("active")=="true") {
		link.removeClass("active");
		link.addClass("inactive");
		return false;	
	}
	link.addClass("active");
	link.removeClass("inactive");
	return true;
}

/**
 * @param string prefix
 * @param string suffix
 * @param object callbackParams
 * @return void
 */
function setDisplay(prefix, suffix, callbackParams) {
	
	if (prefix) {
		
		if (prefix=='speaker') {
			collapse("filters");
			disable('filters-wrapper');
			disable('calendar-view');
			disable('days-wrapper');
			activate("list-view");
			setDisplay(false, 'list');
		} else if (display_prefix=='speaker'){
			enable('filters-wrapper');
			enable('calendar-view');
			enable('days-wrapper');
		}
		
		display_prefix = prefix;
		
	}
	if (suffix) {
		display_suffix = suffix;
	}
	
	getSessions(callbackParams);
}

/**
 * @param int speakerId
 * @return
 */
function showHideSpeakerSessions(speakerId) {
	toggleActive($('speaker-list-item-'+speakerId).getElements(".speaker-container"));
	if (toggleActive($('speaker-list-item-'+speakerId).getElements(".speaker-sessions-button"))) {
		$('speaker-list-item-'+speakerId).getElements(".speaker-sessions").set("html", loader);
		var params = {action:'get_speaker_sessions_list', speaker_id:speakerId};
		var onResponseReceived = function(data) {
			$("speaker-sessions-"+speakerId).set("html", data.list+"<div style='clear:both;height:1px;'></div>");
			
			//$("speaker-sessions-"+speakerId).setStyle("display", "block");
			truncate_speakers($("speaker-sessions-"+speakerId));
		};
		jsonRequest(webServiceURL, onResponseReceived, params); 
	} else {
		//$("speaker-sessions-"+speakerId).setStyle("display", "none");
	}
}


var showSpeaker = function(callbackParams) {
	var link = $$("#speaker-list-item-"+callbackParams.speaker_id+" .speaker-name")[0];
	showSpeakerDescription(link, callbackParams.speaker_id);
	var y = link.getPosition().y;
	window.scrollTo(0, y)
}

/**
 * @param speaker_id
 * @return
 */
function openSpeaker(speaker_id) {
	activate($("tab-speaker"));
	if ($('speaker-list-item-'+speaker_id)) {
		showSpeaker({speaker_id:speaker_id});
	} else {
		clearSearchField();
		setDisplay("speaker", false, {callback:showSpeaker, speaker_id:speaker_id});
	}
}


/**
 * @return void
 */
function clearSearchField() {
	$('search_field').set('value', ''); 
	$('search_string').set('value', '');
}

/**
 * @param name
 * @return void
 */
function expandCollapse(name) {
	var displayExpanded = $(name+'-expanded').getStyle('display');
	if (displayExpanded == "none") {
		expand(name);
	} else {
		collapse(name);
	}
}

function expand(name) {
	$(name+"-expanded").setStyle("display", "block");
	$(name+"-collapsed").setStyle("display", "none");
}

function collapse(name) {
	$(name+"-expanded").setStyle("display", "none");
	$(name+"-collapsed").setStyle("display", "block");
}

function setCheckbox(container, OK) {
	if (!OK) {
		return false;
	}
	
	var checkboxDiv = $(container);
	var checkbox = checkboxDiv.getChildren()[0];
	if (checkbox.checked) {
		checkboxDiv.set("class", checkboxDiv.className.replace(/\schecked/, " unchecked"));
		checkbox.set("checked", false);
	} else {
		checkboxDiv.set("class", checkboxDiv.className.replace(/unchecked/, "checked"));
		checkbox.set("checked", true);
	}
}

/**
 * @param string className
 * @param boolean select true=select all  false=deselect all
 * @return void
 */
function selectDeselectCheckboxes(className, select) {
	var checkboxes = $$('.'+className+"_checkbox");
	var checkbox_wrappers = $$("."+className+"_checkbox_wrapper");
	if (select) {
		checkboxes.set('checked', true);
		checkbox_wrappers.each(function(checkbox_wrapper) {
			checkbox_wrapper.set("class", checkbox_wrapper.className.replace(/unchecked/, "checked"));
		});
	} else {
		checkboxes.set('checked', false);
		checkbox_wrappers.each(function(checkbox_wrapper) {
			checkbox_wrapper.set("class", checkbox_wrapper.className.replace(/\schecked/, " unchecked"));
		});
	}
}

/**
 * 
 */
Array.prototype.in_array = function (value) {
	for (var i=0; i < this.length; i++) {
		if (this[i] == value) {
			return true;
		}
	}
	return false;
}


/**
 * Finds selected items in filters
 * @return Object
 */
function getFilters() {
	var filters = new Object();

	tracks_array=new Array();
	$$('input.tracks_checkbox').each ( function(track) {
		if (track.checked) {
			values = track.value.split(",");
			for (i=0; i<values.length; i++) {
				tracks_array.push(values[i]);
			}
		} 
	});
	filters.tracks = tracks_array;

	formats_array=new Array();
	$$('input.formats_checkbox').each (function(format) {
		if (format.checked) {
			values = format.value.split(",");
			for (i=0; i<values.length; i++) {
				formats_array.push(values[i]); 
			}
		}
	});
	filters.formats = formats_array;

	passes_array=new Array();
	if ($$('input.passes_checkbox').length>0) {
		$$('input.passes_checkbox').each (function(pass) {
			if (pass.checked) {
				values = pass.value.split(",");
				for (i=0; i<values.length; i++) {
					passes_array.push(values[i]);
				}
			}
		});
	} else {
		if ($('pass_select')) {
			passes_array.push($('pass_select').value);
		}
	}
	filters.passes = passes_array;

	speakers_array=new Array();
	$$('input.speakers_checkbox').each (function(speaker) {
		if (speaker.checked) {
			speakers_array.push(speaker.value);} 
	});
	filters.speakers = speakers_array;
	return filters;
}

/**
 * @param object callbackParams
 * @return void
 */
function getSessions(callbackParams) {
	
	hideTooltip();
	
	$$('.user-options').each(function (item) {
		$(item).setStyle("display", "none");
	});
	if ($('user-options-'+display_prefix)) {
		$('user-options-'+display_prefix).setStyle("display", "block");
	}
	
	
	
	var additional_params = getAdditionalParams();
	
	var my_id=++response_count;

	$('list').innerHTML = loader;
	
	var filters = getFilters();

	var params = {
		sessions:'',
		'filters':filters,
		'search_string': $('search_string') ? $('search_string').value : '',
		'search_by': $('search_by').value,
		'order_by': $('sort_by') ? $('sort_by').value : '',
		'filter_by_day': $('filter_by_day') ? $('filter_by_day').value : '',
		'filter_by_time': $('filter_by_time') ? $('filter_by_time').value : ''
	}; 
	if (additional_params) {
		for (x in additional_params) {
			params[x] = additional_params[x];
		}
	}
	
	var url = webServiceURL + '&action=get_'+display_prefix+"_"+display_suffix;
	
	var onResponseReceived = function(data) {
		if (my_id==response_count) {
			timeout_queue.clear();
			$('list').innerHTML=data.list;
			
			if (data.header) {
				$('list-header-wrapper').innerHTML=data.header;
				$('list-header-wrapper').setStyle("display", "block");
			} else {
				$('list-header-wrapper').setStyle("display", "none");
			}
			
			appendDebugData(data.debug_data);
			truncate_speakers();
			if (callbackParams) {
				callbackParams.callback(callbackParams);
			}
		}
	};
	
	jsonRequest(url, onResponseReceived, params);  

}

/**
 * @param debug_data
 * @return void
 */
function appendDebugData(debug_data) {
	//$('debug').innerHTML=$('debug').innerHTML+debug_data;
	
}

/**
 * @return void
 */
function refreshPage() {
	getSessions();
	addCookieToForm();
	
}



function chooseScheduleConflictAction() {
	
	var action = $('schedule-action').value;
	if (action=="append_user_sessions" || action=="replace_user_sessions") {
		reconcileConflictingUserSessions(action);
	} else {
		getSessions();
	}
	if (attempted_user_action != undefined) {
		eval(attempted_user_action);
	} else { 
		TB_remove();
	}
}

/**
 * @return void
 */
function reconcileConflictingUserSessions(action) {
	var saved_sessions_array = new Array();
	$$('input.saved_user_session').each (function(saved_session) {
			saved_sessions_array.push(saved_session.value); 
	});
	session_cookie = new Hash.Cookie('scheduler_session',{duration:false});
	var params = {
			action:action, 
			sessions:saved_sessions_array, 
			user_id:session_cookie.get('user_id'),
			user_key:session_cookie.get('user_key')
		};
	jsonRequest(webServiceURL, function(data) {
		addCookieToForm(); 
		getSessions();
}, params);  
}

/**
 * @return void
 */
function replaceUserSessions() {
        var saved_sessions_array=new Array();
        $$('input.saved_user_session').each (function(saved_session) {
                        saved_sessions_array.push(saved_session.value);
        });
        session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
        var params = {'sessions':saved_sessions_array, 'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')};
        jsonRequest(webServiceURL + '&action=replace_user_sessions', function(data) {
                addCookieToForm();
                getSessions();
}, params);
}



/**
 * @return void
 */
function popup_email() {
	var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
	user_id=session_cookie.get('user_id');
	if (user_id) {
		TB_show_conditional(resourceBundle['emailPopup_title'], webServiceURL, {'width':emailPopup.width, 'height':emailPopup.height, action:'show_popup', popup_type:'email'});
		
		var now = new Date();

		try {
			//document.images.captcha.src = appURL+'/captcha.jpg?' + now.getTime();
			//document.getElementById('email_schedule_security_code').value="";
			document.getElementById('email_results').innerHTML='';
			document.getElementById('email_schedule_security_code').value="";
			document.getElementById('email_schedule_from').value="";
			document.getElementById('email_schedule_from_name').value="";
			document.getElementById('email_schedule_recipients').value="";
		}
		catch (e) {
			//alert(e);
		}
	}
	else {
		popup_login('popup_email()');
	}
}


/**
 * @param user_id
 * @return void
 */
function emailSchedule(user_id) {

	/*
	 * I had to use native javascript because the method "getElement" provided
	 * by Mootools doesn't seem to work for IE7. I have read that any Mootools 
	 * Element used in IE is 'weird'. This code below is strict on the DOM tree.
	 */
	try {
		var tb_ajaxContent = document.getElementById('TB_ajaxContent');
		var formInputs = tb_ajaxContent.getElementsByTagName('input');
		var divs = tb_ajaxContent.getElementsByTagName('div');
		
		var emailResults;
		var fromEmail;
		var sendToEmail;
		var sendBtn;
		
		// Populate form inputs.
		for (var i = 0; i < formInputs.length; i++) {
			switch (formInputs[i].id) {
				case 'email_schedule_recipients':
					fromEmail = formInputs[i];
					break;
				case 'email_schedule_from':
					sendToEmail = formInputs[i];
					break;
				case 'my_schedule_send':
					sendBtn = formInputs[i];
					break;
				default:
					break;
			}
		}
		
		// Find 'email_results' <div>.
		for (var i = 0; i < divs.length; i++) {
			switch (divs[i].id) {
				case 'email_results':
					emailResults = divs[i];
					break;
				default:
					break;
			}
		}
	}
	
	catch (e) {
		//alert(e);
	}

	// Validate from email.
	var fromEmailValidated = validateEmailSchedule(fromEmail.value);
	if (!fromEmailValidated['validated']) {
		emailResults.innerHTML = '<span class="emailErrorText">' + fromEmailValidated['error'] + '</span>';
		return;
	}
	
	// Check if send to email addresses exist.
	if (!sendToEmail.value || sendToEmail.value == '') {
		emailResults.innerHTML = '<span class="emailErrorText">Please enter email addresses to send.</span>';
		return;
	}
	
	// Validate each send to email addresses.
	var sendToEmailAddys = sendToEmail.value.split(',');
	for (var i = 0; i < sendToEmailAddys.length; i++) {
		var sendToEmailValidated = validateEmailSchedule(sendToEmailAddys[i]);
		if (!sendToEmailValidated['validated']) {
			emailResults.innerHTML = '<span class="emailErrorText">' + sendToEmailValidated['error'] + '</span>';
			return;			
		}
	}
	
	var session_cookie = new Hash.Cookie('scheduler_session',{duration:false});
	user_id = session_cookie.get('user_id');
	mail_data = new Hash();
	$$('input.email_schedule_input').each(function(el) { 
		if (el != undefined) {
			mail_data.set(el.name,el.value);
		}
	});	

    sendBtn.value = "Sending...";
    sendBtn.disabled = true;
    
	if (user_id) {
		jsonRequest(webServiceURL + '&action=email_schedule', function(data) {

			// If data doesn't exist or is an object that doesn't contain
			// the 'results' property.
			emailResults.innerHTML = (data && data.results) 
				? data.results 
				: '<span class="emailErrorText">Email failed to send. Please try again later.</span>';				

			try {
				appendDebugData(data.debug_data);
			}
			catch (e) {}
			
			sendBtn.value = "Send";
			sendBtn.disabled = false;
			
		}, {'mail_data':mail_data,'user_id':user_id,'user_key':session_cookie.get('user_key')});
	}
	else {
		popup_login("emailSchedule("+user_id+")");
	}
}


/**
 * @param new_window
 * @param user_id
 * @return
 */
function printSchedule(new_window,user_id) {
	var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
	user_id=session_cookie.get('user_id');

	if (display_prefix=="session") {
		jsonRequest(webServiceURL + '&action=print_schedule', function(data){
			appendDebugData(data.debug_data);
			print_page=new_window.document;
			print_page.write(data.user_schedule_print);
			print_page.close(); 
		}, {});
	} else if (user_id) {
		
		print_sessions=session_cookie.get('sessions');
		user_name=session_cookie.get('user_name');
		jsonRequest(webServiceURL + '&action=print_schedule', function(data){
				appendDebugData(data.debug_data);
				print_page=new_window.document;
				print_page.write(data.user_schedule_print);
				print_page.close(); 
		},{'user_id':user_id,'user_key':session_cookie.get('user_key')});
	}
	else {
		var print_sessions = new Array();
		$$('input.saved_user_session').each (function(saved_session) {
			print_sessions.push(saved_session.value); 
		});
		//print_sessions=session_cookie.get('sessions');
		user_name=session_cookie.get('user_name');
		jsonRequest(webServiceURL + '&action=print_schedule', function(data){
				appendDebugData(data.debug_data);
				print_page=new_window.document;
				print_page.write(data.user_schedule_print);
				print_page.close(); 
		}, {'user_name':user_name,'sessions':print_sessions});
	}
	
}

/**
 * @return void
 */
function trackSaveButton() {
	jsonRequest(webServiceURL + '&action=track_save_button', function(data){},{'data':'hello'});
}


/**
 * @param track
 * @return void
 */
function saveMySchedule(track, dontShowWindow) {
	var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
	user_id=session_cookie.get('user_id');
	if (user_id) {
		if(track) {
			trackSaveButton();
		}
		if (!dontShowWindow) {
			TB_show_conditional("Schedule Saved", webServiceURL, {action:'show_popup', popup_type:'saved', width:300, height:50});
		} else {
			//TB_remove();
		}
	}
	else {
		popup_login('saveMySchedule()');
	}
}

function getSessionDescription(session_id) {
	jsonRequest(webServiceURL, function(data) {
			
			$('tooltip_content').innerHTML=data.session_description;
			appendDebugData(data.debug_data);
		}, {'session_id':session_id, action:'get_session_description'});
}

/**
 * @return void
 */
function addCookieToForm() {
	var sessions; //declare to prevent errors (sessions can be undefined, if it is undeclared as well, we'll throw an error).
	session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
	if (session_cookie.get('user_id')) {
		$('loginContainer').setStyle('display','none');
		$('logoutContainer').setStyle('display','inline');
		jsonRequest(webServiceURL + '&action=get_user_sessions', function(data){
			if (data.error != undefined) {
				alert(data.error);
			}
			if (data.sessions != undefined) {
				data.sessions.each( function(id) {
				if(!$('saved_session_'+id)){
					var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
					$('user_sessions').appendChild(saved_session_input);
				}
				});
			}
			appendDebugData(data.debug_data);
		},{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')});

	}
	else if (session_cookie.get('sessions') != undefined) {
		//get sessions from session cookie.
		sessions=session_cookie.get('sessions');
		if (sessions != undefined) {
			sessions.each(function(id) {
				if(!$('saved_session_' + id)) {
					var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
					$('user_sessions').appendChild(saved_session_input);
				}		
			});
		}
	}
}

/**
 * @return void
 */
function popup_clear() {
	TB_show_conditional("Attention", webServiceURL, {action:'show_popup', popup_type:'clear', width:200, height:100});
}

/**
 * 
 * @return void
 */
function clearSessions() {
	session_cookie= new Hash.Cookie('scheduler_session',{duration:false});
	session_cookie.set('sessions',new Array());
		// Destroy the the hidden inputs.
		$$('input.saved_user_session').each(function (el) {
			el.destroy();
		});

		$$('img.cart_delete').each(function(el) {
			el.setProperties({'class':'',src:Images.btn_addToSchedule,title:"Add To My Schedule"});
		});

		if (session_cookie.get('user_id') != undefined) 
		{
			jsonRequest(webServiceURL + '&action=clear_sessions', function(data){
				if (data.error != undefined){
					alert(data.error);
				}
				try {
					appendDebugData(data.debug_data);
				}
				
				catch (e) {}
				
				// Update the user schedule and the session list after clearing.
				getSessions();
				
			},{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')});
		}
		else
		{
			session_cookie.set("");
			getSessions();
		}			
}

/**
 * @param string action
 * @return void
 */
function popup_login(action) {
	checkLogin();

	if (session_cookie.get('user_id') == undefined) {
		if (action == 'email') {
			title = "To email your schedule, please login.";
		} else if (action == 'export') {
			title = "To export your schedule, please login.";
		} else if (action == 'save') {
			title = "To save your schedule, please login.";
		} else {
			title = resourceBundle['loginPopup_title'];
		}
		TB_show_conditional(title, webServiceURL , {action:'show_popup', popup_type:'login', width:loginPopup.width, height:loginPopup.height} );
		if (action != undefined) {
			attempted_user_action=action;
		}
	}
}

/**
 * @return void
 */
function loginUser() {
	var login_data=new Hash();
	$$('input.login_input').each(function(el) { if (el != undefined) login_data.set(el.name,el.value);});
	document.getElementById('login').value="Please Wait...";
	document.getElementById('login').disabled=true;
	
	//Stores and loads a Hash as a Cookie using JSON format and assigns it to a new variable.
	var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
	
	//Grabs the session data from the cookie and passes it into a new variable.
	var sessions = session_cookie.get('sessions');
	
	//Executes the login_user case in the data_interface.php file and appends the cookie data to the URL.
	jsonRequest(webServiceURL + '&action=login_user', function(data){

			if (data.valid_login) {
				
				document.getElementById('loginStatus').innerHTML= data.results;
				$('loginContainer').setStyle('display','none');
				$('logoutContainer').setStyle('display','inline');
				session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
				session_cookie.extend({'user_id':data.user_id,'user_key':data.user_key,'user_email':data.user_email});
				
				var saved_sessions_array = new Array();
				$$('input.saved_user_session').each (function(saved_session) {
					saved_sessions_array.push(saved_session.value); 
				});
				
				if (saved_sessions_array.length>0) {
					if (data.sessions.length>0) {
						TB_show_conditional("You have a previously saved schedule", webServiceURL, {action:"show_popup", popup_type:"preexisting_sessions"});
					} else {
						replaceUserSessions();
						refreshPage();
						//TB_remove_conditional();
						if (attempted_user_action != undefined) {
							setTimeout("eval(attempted_user_action)", 200);
						} else {
							TB_remove_conditional();
						}
					}
				} else {
					addCookieToForm();
					refreshPage();
					//TB_remove_conditional();
					if (attempted_user_action != undefined) {
						eval(attempted_user_action);
					} else {
						TB_remove_conditional();
					}
				}
			}
			else {
				if (error_set == true)
				{
					document.getElementById('TB_ajaxContent').innerHTML= document.getElementById('TB_ajaxContent').innerHTML+data.results;	
					error_set = false;
				}
			}

		},{'login':login_data});
}

/**
 * @return void
 */
function logoutUser() {	
	Cookie.dispose('scheduler_session');	
	Cookie.dispose('php121pw');
	Cookie.dispose('php121un');
	Cookie.dispose('phpfox_h');
	Cookie.dispose('phpfox_id');
	Cookie.dispose('PHPSESSID');
	jsonRequest(webServiceURL + '&action=logout_user', function(data) {
			window.location = appURL;
	},{});
}

/**
 * @return void
 */
function checkLogin() {
	session_cookie=new Hash.Cookie('scheduler_session',{duration:false});

	jsonRequest(webServiceURL + '&action=check_login', function(data){
		try {
			appendDebugData(data.debug_data);
		}
		
		catch (e) {
			
		}
		if (data.valid_login) 
		{	
			document.getElementById('loginStatus').innerHTML=data.results;
			$('loginContainer').setStyle('display','none');
			$('logoutContainer').setStyle('display','inline');
			session_cookie.extend({'user_id':data.user_id,'user_key':data.user_key,'user_email':data.user_email,'sessions':data.sessions, 'user_name':data.user_name});
			addCookieToForm();
			TB_remove_conditional();
			refreshPage();
			if (attempted_user_action != undefined)
			{
				eval(attempted_user_action);
			}
		}
	},{});
	
}

/**
 * @param int id Session ID
 * @return void
 */
function addToMySchedule(id, OK) {
	if (!$('saved_session_'+id)) {
		var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
		$('user_sessions').appendChild(saved_session_input);
		session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
		if (session_cookie.get('user_id') != undefined) {
			jsonRequest(webServiceURL + '&action=add_session', function(data){
				if(data.failure != true){
					var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
					//$('user_sessions').appendChild(saved_session_input);
				}
				else {
					alert("This session could not be added to your myE2 Schedule because it conflicts with the time of another class that you are already attending.");
				}
				try {
					appendDebugData(data.debug_data);
				}
				
				catch (e) {}
				
				saveMySchedule(false, true);
			
			},{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key'),'session_id':id});
		}
	}
	else {
		if (display_prefix == "user" && !OK) {
			$("remove-session-id").set("value", id);
			dialog("dialog-remove-session");
			return false;
		}
		
		$('saved_session_'+id).destroy();
		
		session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
		if (session_cookie.get('user_id') != undefined) {
			
			jsonRequest(webServiceURL + '&action=remove_session', function(data) {
				if(data.failure == true){
					alert("You have already removed this session from your myE2 schedule.  Please refresh your page if you reached this error.");
				}
				appendDebugData(data.debug_data);
				saveMySchedule(false, true);
				
				if (display_prefix == "user") {
					if (display_suffix == "list") {
						$("session_listing_"+id).setStyle("display", "none");
					} else {
						getSessions();
					}
				}
			},{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key'),'session_id':id});
		} else {
			if (display_prefix == "user") {
				if (display_suffix == "list") {
					$("session_listing_"+id).setStyle("display", "none");
				} else {
					getSessions();
				}
			}
		}
	}
	return true;
}

/**
 * @return object
 */
function getAdditionalParams() {
	var saved_sessions_array=new Array();
	session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
	if (session_cookie.get('user_id') != undefined) {
		var params = {'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')};
	}
	else {
		$$('input.saved_user_session').each (function(saved_session) {
			saved_sessions_array.push(saved_session.value); 
		});
		session_cookie.extend({'sessions':saved_sessions_array});
		var params = {'sessions': saved_sessions_array};
	}
	return params;
}

/**
 * @param list
 * @return void
 */
function popup_export_menu() {
	session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
	if(session_cookie.get('user_id')) {
		TB_show_conditional('Export Schedule', webServiceURL, {action:"show_popup", popup_type:"export_menu", width:120, height:110} );
	} else {
		popup_login('popup_export_menu()');
	}
}

function popup_export_all_menu() {
	TB_show_conditional('Export All Sessions', webServiceURL, {action:"show_popup", popup_type:"export_all_menu", width:120, height:110});
}


/**
 * @param string id
 * @return
 */
function dialog(id) {
	var dialogObj = $(id);
	dialogObj.setStyle("display", "block");
	var coords = dialogObj.getCoordinates();
	var wrapperCoords = $("ScheduleBuilder-application").getCoordinates();
	scrolltop = getScrollTop();
	dialogObj.setStyle("top", (window.getScrollTop() + (window.getHeight() - coords.height) / 2) - wrapperCoords.top);
	dialogObj.setStyle("left",(window.getScrollLeft() + (window.getWidth() - coords.width) / 2)- wrapperCoords.left);
}

/*************************/
/* BEGIN Util FUNCTIONS */
/*************************/

/**
 * 
 */
function checkSession(id) {
	$('session_'+id).checked=true;
}

/**
 * @param emailAddy
 * @return object
 */
function validateEmailSchedule(emailAddy) {
	var validateObj = {
		validated : true,
		error : ""
	}

	var re = new RegExp('^.+@[^\.].*\.[a-z]{2,}$');
	
	if (emailAddy == undefined || emailAddy == '') {
		validateObj['error'] = "Please enter an email address.";
		validateObj['validated'] = false;
	}
	else if (!emailAddy.match(re)) {
		validateObj['error'] = emailAddy + " is not a valid email address";
		validateObj['validated'] = false;
	}
	
	return validateObj;
}

/**
 * @param url
 * @param funct
 * @param json
 * @return void
 */
function jsonRequest(url, funct, json) {
		json = JSON.encode(json);
		new Request.JSON({'url':url, onComplete: funct}).post({'json':json});		
}

/**
 * @param object
 * @return void
 */
function printObject(object) {
	var str = '';
	for(prop in object) {
		if(object.hasOwnProperty(prop))
			str += prop + " : " + object[prop] + "\n";
	}
	alert(str);
}

function selectOneFilterCheckbox(filterName, filterItemId) {
	$$("#filter-"+filterName+" input").each(function(checkbox){ 
		var checkboxDiv = checkbox.getParent();
		if (checkbox.name != filterName+"_"+filterItemId) {
			checkboxDiv.set("class", checkboxDiv.className.replace(/\schecked/, " unchecked"));
			checkbox.set("checked", false);
		} else {
			checkboxDiv.set("class", checkboxDiv.className.replace(/unchecked/, "checked"));
			checkbox.set("checked", true);
		}	
	});
	refreshPage();
}