/***
 * Shirelive Roster jQuery functionality
 * @author Jeremy Manoto
 * @version 0.1 alpha
 */

$(document).ready(function() {

	// Create containsIgnoreCase
	jQuery.extend(jQuery.expr[':'], { containsIgnoreCase: "(a.textContent||a.innerText||jQuery(a).text()||'').toLowerCase().indexOf((m[3]||'').toLowerCase())>=0"});

	Forms_Init();
	
	Registration_Init();
	
	PersonList_Init();
	
	PersonRoles_Init();
	
	Unavailability_Init();
	
	PersonEventRolePermissions_Init();
	
	Events_Init();
	
	CallTime_Init();
});



/**
 * Initialize forms & form elements
 */
function Forms_Init() {
	
	/***
	 * Fix margins on adjacent input fields
	 */
	$("input").each(function() {
		var current = $(this);
		var parent = current.parent();
		var currentY = current.offset().top;
		var currentX = current.offset().left;
		var next = current.next();
		
		if (next.length > 0) {
			try {
				var nextY = next.offset().top;
				var nextX = next.offset().left;
			} catch (e) {
				var nextY = 0;
				var nextX = -1;
			}
			if (next[0].tagName == "INPUT" && currentY != nextY) {
				next.css("margin", "5px 0 0");
				if (currentX != nextX) {
					nextX = currentX - parent.offset().left;
					next.css("margin-left", nextX + "px");
				}
			}
		}
	});
	
	/**
	 * Show/Hide the forms return/result message
	 */
	$(".form .message").each(function(){
		var message = $(this);
		var html = message.html();
		
		if (html == "") {
			message.hide();
		}
		else {
			message.show();
		}
	});

	
	/***
	 * Setup tool tips for form items
	 */
	$(".form input").each(function() {
		var input = $(this);
		var title = input.attr("title");
		var val = input.val();
		var type = input.attr("type");
		
		if (type == "text") {
			// Initial setup
			if (val == "") {
				input.val(title).addClass("tip");				
			}


			// Focus event
			input.focus(function(){
				if ($(this).val() == title) {
					$(this).val("").removeClass("tip");
				}
			});
			
			input.blur(function(){
				if ($(this).val() == "") {
					$(this).val(title).addClass("tip");
				}
			});
		}
	});
	
	
	$(".form .required").change(function() {
		var input = $(this);
		var tooltip = input.attr("title");
		
		if (input.val() == tooltip || input.val() == "") {
			input.addClass("error");
		} else {
			input.removeClass("error");
		}
	});
	
	$(".form .verify").change(function() {
		var input2 = $(this);
		var input1 = input2.prev();
		var label = input1.prev();
		var labelText = SanitizeLabel(label.html());
		
		if (input1.val() != input2.val() || input1.val() == "" || input2.val() == "") {
			input2.addClass("error");
			messages += labelText + " fields do not match.<br>";
			result = false;
	
		} else {
			input2.removeClass("error");
		}
	});
	
	// Setup date pickers
    $(".date-input").datepicker({
        minDate: new Date(1920, 0, 1),
        dateFormat: 'dd/mm/yy',
		yearRange: '-60:1'
    });
	
	if ($(".person-unavailabilities .date-range-input").length > 0) {
		$(".person-unavailabilities .date-range-input").daterangepicker({
			dateFormat: 'dd/mm/yy',
			appendTo: ".person-unavailabilities",
			posX: -50,
			posY: 80
		});	
	}
	
}


/**
 * Initialisation for Registration form
 */
function Registration_Init() {
	
	/**
	 * Validate an email address against the database
	 */	
	$(".registration .validate-email").each(function() {
		$(this).change(function() {
			var field = $(this);
			var email = field.val();
			var tooltip = field.attr("title");
	
			if (email != tooltip && email != "") { //Don't process if the value is the same as the tooltip.
				
				var params = {
					f: 'CHECKEMAILEXISTS',
					email: email
				}

				//Check to see if the email already exists within the system
				$.get("services/ajaxPerson.ashx", params, function(data) {
					var emailExists = (data == "True");
					if (emailExists) {
						field.addClass("error");
						$.jGrowl("The email address you entered already exists within the system<br>You may already have a valid login.", {
							header: 'Email Already Exists',
							sticky: true,
							position: 'center'							
						});

					} else {
						field.removeClass("error");
					}
					
				});
			} else {
				field.removeClass("error");
			}
			
		});	
	});
	
}


/** 
 * Pre-processor for registration form
 */
function Form_Validate() {
	
	var result = true;
	var messages = "";
	
	
	//Unset the value for all tooltips
	$(".form input").each(function() {
		var input = $(this);
		if (input.val() == input.attr("title")) {
			input.val("").removeClass("tip");
		}
	});
	

	//Check required fields
	$(".form .required").each(function() {
		var input = $(this);
		var value = input.val();
		var label = input.parent().children("label");
		var labelText = SanitizeLabel(label.html());
		
		if (value == "") {
			messages += "Missing " + labelText + "<br>";
			result = false;
		}		
	});
	
	
	//Process verify fields
	$(".form .verify").each(function() {
		var input2 = $(this);
		var input1 = input2.prev();
		var label = input1.prev();
		var labelText = SanitizeLabel(label.html());
		
		if (input1.val() != input2.val() && input1.val() == "" && input2.val() == "") {
			input1.addClass("error");
			input2.addClass("error");
			messages += labelText + " fields do not match.<br>";
			result = false;
	
		} else {
			input1.removeClass("error");
			input2.removeClass("error");
		}
	});
	
	//Validate time fields
	$(".form .time-input").each(function() {
		var input = $(this);
		var label = SanitizeLabel($(this).prev().html());
		var time = $(this).val();
		
		if (input.hasClass("required") || time.length > 0) {
			if (!isValidTime(time)) {
				input.addClass("error");
				messages += label + " is not a valid time.<br>";
				result = false;
			}
		}
	});

	// Show jGrowl message & restor tooltips
	if (!result) {
		$.jGrowl(messages, {
			header: "Error!",
			life: 10000
		});
		$(".form input[type='text'].required").each(function() {
			var input = $(this);
			if (input.val() == "") {
				input.val(input.attr("title")).addClass("tip");
			}
		});
	}
	
	return result;
}

/**
 * Strips meta characters from a label string
 * @param {Object} label
 */
function SanitizeLabel(text) {
	if (text != null) {
		text = text.replace("*", "");
		text = text.replace(":", "");
	}
	return text;
}


/**
 * Initialize Person List
 */
function PersonList_Init() {
	
	// Alternate row styles
	$(".person-list .person:odd").addClass("alt");
	
	// Filter the list based on the search box
	$(".search-person").keyup(function() {
		var input = $(this);
		
		var searchTerm = input.val();
		
		var persons = $(".person-list .person");
		persons.removeClass("alt").hide();
		persons.find(".title:containsIgnoreCase('" + searchTerm + "')").parent().show().filter(":odd").addClass("alt");
		
	});
	
	$(".person-list .person .actions .delete").click(function() {
		var person = $(this).parent().parent().parent().parent();
		var personID = person.attr("pid");
		var button = $(this);
		
		var result = window.confirm(button.children("img").attr("alt"));

		
		
		if (result) {
			var postUrl = VirtualDirectory + "/services/ajaxPerson.ashx";
			var postParams = "f=DELETEPERSON&pID=" + personID;
			
			$.post(postUrl, postParams, function(data){
				if (data == "True") {
					person.fadeOut(1000, function(){
						$(this).empty().remove();
					});
				}
			});
		}
	});
	
	
}


/** 
 * Initialize Person Roles Administration
 */
function PersonRoles_Init() {
	
	// Highlight checked Roles
	$(".roles-assign input").change(function() {
		var input = $(this);
		var label = input.next();
		
		if (input.is(":checked")) {
			label.addClass("highlight");
		} else {
			label.removeClass("highlight");
		}
	}).change();
	
	
	$(".role-categories .category table td, .person-event-role-permissions .category table td").click(function() {
		$(this).toggleClass("selected");
		
		if (!$(this).hasClass("selected")) {
			$(this).addClass("unselected");
		} else {
			$(this).removeClass("unselected");
		}
		
	});
	
	$(".role-categories .category table th.col-role, .person-event-role-permissions .category table th.col-role").click(function() {
		var heading = $(this);
		var row = heading.parent();
		
		heading.toggleClass("selected");
		
		if (heading.hasClass("selected")) {
			row.children().addClass("selected");
		} else {
			row.children().removeClass("selected");
		}
		
	});
		
}


/**
 * Saves the Person Event Roles
 */
function PersonEventRoles_Save() {
	
	var personID = $(".role-categories .person-id").html();
	
	var postUrl = VirtualDirectory + "/services/ajaxPerson.ashx";
	var postParams = "f=ASSIGNEVENTROLE&pid=" + personID;
	
	$(".role-categories .category").each(function() {
		var fieldset = $(this);
		var roleCategoryID = fieldset.attr("rolecategoryid");
		
		fieldset.find("td.selected").each(function() {
			var td = $(this);
			var roleID = td.siblings("th.col-role").attr("roleid");
			var eventID = td.attr("eventid");
			
			//alert("Saving Person(" + personID + "), Role(" + roleID + "), Event(" + eventID + ")");
			postParams += "&rid=" + roleID + "&eid=" + eventID;
			
		
		});
		
		fieldset.find("td.unselected").each(function() {
			var td = $(this);
			var roleID = td.siblings("th.col-role").attr("roleid");
			var eventID = td.attr("eventid");
			
			
		});
		
	});
	
	// Post the selection to ajax.
	$.post(postUrl, postParams, function(data) {
		if (data == "True")	$.jGrowl("Saved");
	});
	
	return false;
}


/**
 * Loads a user's unavailabilities and sticks them
 * @param {Object} container jQuery selector for the container
 */
function Unavailability_Load(container) {
	
	var personID = $("#personID").html();
	
	var postUrl = VirtualDirectory + "/services/ajaxPerson.ashx";
	var postParams = "f=GETUNAVAILABILITIES&pID=" + personID;
	
	$(container).slideUp(250, function() {
		$(this).hide().load(VirtualDirectory + "/ControlViewer.aspx?c=PersonUnavailabilities&pid=" + personID, null, function() {
			$(container).slideDown(250);
			Unavailability_Init();
		});
	})
	
}


/**
 * Adds an unavailability to the database
 */
function Unavailability_Add(){
	if (Form_Validate()) {
		var personID = $("#personID").html();
		var dateFrom = $(".person-unavailabilities .date-from").val();
		var dateTo = $(".person-unavailabilities .date-to").val();
		var comment = $(".person-unavailabilities .comment").val();
		var timeFrom = $(".person-unavailabilities .time-from").val();
		var timeTo = $(".person-unavailabilities .time-to").val();
		
		if (timeTo == "") timeTo = "11:59 PM";
		
		var postUrl = VirtualDirectory + "/services/ajaxPerson.ashx";
		
		//TODO: HTML Encode the parameters
		var postParams = "f=ADDUNAVAILABILITY&pID=" + personID + "&dateFrom=" + dateFrom + " " + timeFrom + "&dateTo=" + dateTo + " " + timeTo + "&comment=" + comment;
		
		$.post(postUrl, postParams, function(data){
			if (data == "True") {
				Unavailability_Load(".person-unavailabilities .field .data.my-unavailabilities");
			}
			else {
				$.jGrowl("Erroneous Data");
			}
		});
	}
}


/**
 * Initialize Unavailability module
 */
function Unavailability_Init() {
	
	// Setup delete event
	$(".person-unavailabilities .action.delete").click(function () {
		var unavailabilityID = $(this).parent().attr("id").replace("unavailabilityid", "");
		var container = $(this).parent().parent();
		
		var postUrl = VirtualDirectory + "/services/ajaxPerson.ashx";
		
		var postParams = "f=DELETEUNAVAILABILITY&id=" + unavailabilityID;
		
		$.post(postUrl, postParams, function(data) {
			if (data == "True") {
				container.fadeOut(500, function() {
					$(this).remove();
				})
			} else {
				$.jGrowl("Error removing Unavailability");
			}
		});
		
	});
}


/**
 * Initialize Person Event Role Permissions administration
 */
function PersonEventRolePermissions_Init() {
	
	
	// Setup tabs
	$(".person-event-role-permissions ul.menu ").tabs({
		show: function() {
			PersonRoles_Init();
		}
	});
	
	// Toggle Selected class on click
	$(".permissions .category td[eventid]").live("click", function() {
		var cell = $(this);
		cell.toggleClass("selected");
	});
	
	// Toggle Row Selected class on click
	$(".permissions .category tr th").live("click", function() {
		var row = $(this).parent();
		row.find("td").toggleClass("selected");
	});
	
	// Toggle Column Selected class on click
	$(".permissions .category thead th[eventid]").live("click", function() {
		var th = $(this);
		var index = th.prevAll().length;
		var table = th.parent().parent();
		
		table.find("tr").each(function() {
			var tr = $(this);
			var td = tr.find("td")[index - 1];
			$(td).toggleClass("selected");
		});
	});
	
	// Save Event Role Permissions
	$(".permissions .ui-tabs-panel .submit.button").live("click", function() {
		var button = $(this);
		var panel = button.parent().parent();
		var personID = $("#personID").html();
		var permissionID = $(".person-event-role-permissions .ui-tabs-selected").attr("id").replace("permissionid", "");
		var container = $(this).parent().parent();
		
		var postUrl = VirtualDirectory + "/services/ajaxPerson.ashx";
		var postParams = "f=ASSIGNEVENTROLEPERMISSION&pid=" + personID + "&permissionid=" + permissionID;
		
		panel.find("td.selected").each(function() {
			var td = $(this);
			var roleID = td.siblings("th.col-role").attr("roleid");
			var eventID = td.attr("eventid");
			
			//alert("Saving Person(" + personID + "), Role(" + roleID + "), Event(" + eventID + ")");
			postParams += "&rid=" + roleID + "&eid=" + eventID;
		});
		
		// Post the selection to ajax.
		$.post(postUrl, postParams, function(data) {
			if (data == "True")	$.jGrowl("Saved");
		});
	
	});
	
}


function PersonEventRolePermissions_Save() {
	var button = $(this);
	var panel = button.parent().parent();
	var personID = $("#personID").html();
	var permissionID = $(".person-event-role-permissions .ui-tabs-selected").attr("id").replace("permissionid", "");
	var container = $(this).parent().parent();
	
	var postUrl = VirtualDirectory + "/services/ajaxPerson.ashx";
	var postParams = "f=ASSIGNEVENTROLEPERMISSION&pid=" + personID + "&permissionid=" + permissionID;
	
	panel.find("td.selected").each(function() {
		var td = $(this);
		var roleID = td.siblings("th.col-role").attr("roleid");
		var eventID = td.attr("eventid");
		
		//alert("Saving Person(" + personID + "), Role(" + roleID + "), Event(" + eventID + ")");
		postParams += "&rid=" + roleID + "&eid=" + eventID;
		
	
	});
/*	
	container.find(".category").each(function() {
		var fieldset = $(this);
		var roleCategoryID = fieldset.attr("rolecategoryid");
		
		fieldset.find("td.selected").each(function() {
			var td = $(this);
			var roleID = td.siblings("th.col-role").attr("roleid");
			var eventID = td.attr("eventid");
			
			//alert("Saving Person(" + personID + "), Role(" + roleID + "), Event(" + eventID + ")");
			postParams += "&rid=" + roleID + "&eid=" + eventID;
		});
	});*/
	
	// Post the selection to ajax.
	$.post(postUrl, postParams, function(data) {
		if (data == "True")	$.jGrowl("Saved");
	});
	
	return false;
}


/** 
 * Initialize Events
 */
function Events_Init() {
	
	// Auto Generate meetings for events
	$("#generateMeetings").click(function() {
		var postUrl = VirtualDirectory + "/services/ajaxEvent.ashx";
		var postParam = "f=GENERATEMEETINGS";
		
		$.post(postUrl, postParam, function(data) {
			if (data == "True") {
				$.jGrowl("Meetings Generated");
			}
		});
	});
}

/** 
 * Initialize Call Times
 */
function CallTime_Init() {
	
	$(".calltime-admin #saveButton").click(function() {
		if (Form_Validate()) {
			
			var postUrl = "services/ajaxEvent.ashx";
			var postParams = "f=SETCALLTIME";
			
			$(".calltime-admin .calltime.time-input").each(function(){
				var input = $(this);
				var eventID = input.parent().attr("eventid");
				var roleID = input.parent().parent().find(".col-role").attr("roleid");
				var callTime = input.val();
				
				postParams += "&eID=" + eventID + "&rID=" + roleID + "&ct=" + callTime;
			});
			
			$.post(postUrl, postParams, function(data) {
				if (data == "True") {
					$(".calltime-admin .error").removeClass("error");
					$.jGrowl("Saved!");
				} else {
					$.jGrowl("Error Saving. Please notify Jeremy");
				}
			});
		}
	});
}
