/***************************************************************************
 *
 *   Paul Saulnier Web Site Platform - http://www.paulsaulnier.ca
 *
 *   IMPORTANT
 *   The code in this file is the intellectual property of Paul Saulnier 
 *   and there are limitations on its reuse. You may only use this file 
 *   and other associated and supporitng files with the web site
 *   for which it was originally implemented by Paul Saulnier. You MAY not
 *   use this code on another web site without permission from Paul Saulnier.
 *
 ***************************************************************************/


// GLOBAL VARIABLES	
var editorAccess = false; 		// Specifies whether admin access controls should be displayed
						// This is not a security hole because the server-side will always
						// check for appropriate access!

/* GLOBAL VARIABLES */
var object;

/* HOOKS CALLED BY VARIOUS PROCESSES */
function updatepage(str, http_request) {
	// Response from an AJAX post call
	if ( http_request.responseText != "" ) {
		try 
		{
			object = JSON.parse(http_request.responseText);
		}
		catch ( e )
		{
			alert("Error while JSON parsing output:\n"+http_request.responseText);
			return;
		}
	}else{
		alert("No output was returned from the server.");
		return;
	}
	if ( object.error ) {
		alert(object.error);
		switch ( object.mode ) {
			case "saveevent":
				if ( document.getElementById("validationCodeImage") ) {
					document.getElementById("validationCodeImage").src = 
						document.getElementById("validationCodeImage").src + '?' + (new Date()).getTime();
				}
				setButtonStates(true); // Enable all buttons
				break;

		}
		return;
	}else if ( !object.mode ) {
		alert(http_request.responseText);
		return;
	}

	// Deal with this returned object
	switch ( object.mode ) {
		case "viewevent":
			// Display the calendar event
			document.getElementById("calendarEventTitle").innerHTML = object.title+"";
			document.getElementById("calendarEventDate").innerHTML = object.date;
			document.getElementById("calendarEventDescription").innerHTML = object.description+"";
			document.getElementById("calendarEventHistory").innerHTML = object.history+"";
			displayAjaxPopUpObject("calendarEvent", "event"+object.calid, 400);
			break;
			
		case "editevent":
			// Edits an existing calendar event
			document.getElementById("titleField").value = object.title;
			document.getElementById("dateField").value = object.date;
			document.getElementById("descriptionField").value = object.description+"";
			document.getElementById("categoryField").value = object.categoryid;
			if ( object.history != null ) {
				document.getElementById("historyLog").innerHTML = object.history+"";				
			}else{
				document.getElementById("historyLog").innerHTML = "";
			}
			
			document.getElementById("historyLog").style.display = "";
			if ( object.hidden == 0 ) 
			{
				showCalendarEditor("edit", "event"+object.calid);
			}
			else
			{
				showCalendarEditor("approve", "event"+object.calid);
			}
			break;

		case "deleteevent":
			// An event was deleted. Hide if we can see it
			closeAjaxPopup();

			if ( document.getElementById("event"+object.calid) ) 
			{
				document.getElementById("event"+object.calid).style.display = "none";
			}

			break;

		case "saveevent":
			// Apply changes to live calendar
			if ( document.getElementById("event"+object.calid) ) 
			{
				// Remove old event being displayed first
				document.getElementById("event"+object.calid).parentNode.removeChild(document.getElementById("event"+object.calid));
			}

			if ( document.getElementById('day'+object.datecode) && object.hidden != 1 ) 
			{
				// Now add a new event under the new day
				html = '<div class="category '+object.className+'" id="event'+object.calid+'"><a href="javascript:editCalendarEvent(\''+object.calid+'\');">'+object.title+'</a></div>';
				document.getElementById('day'+object.datecode).innerHTML = 
					document.getElementById('day'+object.datecode).innerHTML + html;
			}

			if ( object.operation != "add_continue" ) 
			{
				closeAjaxPopup();
	
				if ( object.hidden == 1 )
				{
					alert("Your event was submitted successfully. It will not be visible until approved.");
				}
			}
			else if ( object.operation == "add_continue" ) 
			{
				// Add and continue operation. Just remove the date
				document.getElementById("dateField").value = "";
				document.getElementById("validationCodeField").value = "";
				if ( document.getElementById("validationCodeImage") ) {
					document.getElementById("validationCodeImage").src = 
						document.getElementById("validationCodeImage").src + '?' + (new Date()).getTime();
				}
				object.calid = 0;
				setButtonStates(true); // Enable all buttons

			}

			break;

		case "submitevent":
			document.getElementById("validationCode").style.display = "";
			showCalendarEditor("submit", relativeToObject);
			break;

		default:
			alert("Unknown mode: "+ http_request.responseText);
	}
}

/* COMMANDS THAT CAN BE EXECUTED */

// Displays the event using AJAX
function viewCalendarEvent(calid)
{
	object ={
		mode:"viewevent",
		calid:calid
	};
	xmlhttpPost("process.php", JSON.stringify(object));
}

// Displays the editor for adding a new calendar event 
function addNewEvent(relativeToObject, categoryid, dateValue)
{
	document.getElementById("titleField").value = "";
	document.getElementById("dateField").value = dateValue;
	document.getElementById("descriptionField").value = "";
	document.getElementById("birthdayPersonField").value = "";
	document.getElementById("birthdayAgeField").value = "";
	document.getElementById("birthdaySubmitterField").value = "";
	document.getElementById("historyLog").innerHTML = "";
	document.getElementById("historyLog").style.display = "none";
	document.getElementById("categoryField").value = categoryid;

	if ( editorAccess ) 
	{
		showCalendarEditor("addnew", relativeToObject);
	} 
	else 
	{
		showCalendarEditor("submit", relativeToObject);
	}
}

// Shows the calendar editor
function showCalendarEditor(mode, relativeToObject)
{
	// Reset states
	document.getElementById("approveButtons").style.display = "none";
	document.getElementById("addNewButton").style.display = "none";
	document.getElementById("updateButtons").style.display = "none";
	document.getElementById("validationCode").style.display = "none";
	document.getElementById("birthdayFields").style.display = "none";
	document.getElementById("validationCodeField").value = "";

	setButtonStates(true); // Enable all buttons

	switch ( mode ) 
	{
		case "addnew":
			document.getElementById("calendarEditorTitle").innerHTML = "Add New Event";
			document.getElementById("addNewButton").style.display = "";
			break;

		case "submit":
			document.getElementById("calendarEditorTitle").innerHTML = "Submit New Event for Approval";
			document.getElementById("addNewButton").style.display = "";
			document.getElementById("validationCode").style.display = "";
			document.getElementById("validationCodeImage").src = 
				document.getElementById("validationCodeImage").src + '?' + (new Date()).getTime();
			break;

		case "edit":
			document.getElementById("calendarEditorTitle").innerHTML = "Edit Event";
			document.getElementById("updateButtons").style.display = "";
			break;

		case "approve":
			document.getElementById("calendarEditorTitle").innerHTML = "Approve or Reject Event";
			document.getElementById("approveButtons").style.display = "";
			break;
	}
	categoryChanged();
	displayAjaxPopUpObject("calendarEditor", relativeToObject, 600, true);	
}

// Show an editor for this event. HTML for the editor is generated by another file
function editCalendarEvent(calid)
{
	object ={
		mode:"editevent",
		calid:calid
	};
	xmlhttpPost("process.php", JSON.stringify(object));
}

// Processes an editor operation
function editOperation(operation)
{
	setButtonStates(false); // Disable all buttons
	
	if ( object ) var calid = object.calid;

	if ( operation == "delete" || operation == "reject" ) 
	{
		if ( !confirm("Do you really want to permanently delete this event?") ) return;

		// Need to delete (or reject) this operation
		object ={
			mode:"delete",
			calid:calid
		};
	}
	else if ( operation == "add_continue" || operation == "update" || operation == "add" || operation == "approve" )
	{
		if ( !editorAccess && document.getElementById("categoryField").value == birthdayCategoryID ) {
			if ( document.getElementById('birthdayPersonField').value.length == 0 ) {
				alert("Please tell us who is having a birthday!");
				setButtonStates(true); // Enable all buttons
				return false;
			}
			if ( document.getElementById('birthdaySubmitterField').value.length == 0 ) {
				alert("Please tell us who you are so they will know who submitted this.");
				setButtonStates(true); // Enable all buttons
				return false;
			}
		} else {
			if ( document.getElementById('titleField').value.length == 0 ) {
				alert("You must specify a title.");
				setButtonStates(true); // Enable all buttons
				return false;
			}
		}

		if ( document.getElementById('categoryField').value.length == 0 ) {
			alert("You must specify a category.");
			setButtonStates(true); // Enable all buttons
			return false;
		}
		
		// Do not persist calid for adds
		if ( operation == "add" || operation == "add_continue" )
		{
			// Do not persist the calid
			if ( object ) object.calid = null;
			calid = null;
		}
		
		// Saving changes to the database
		object ={
			mode:operation,
			editorAccess:editorAccess,
			calid:calid,
			categoryid:document.getElementById("categoryField").value,
			categorytitle:document.getElementById("categoryField").innerHTML,
			description:document.getElementById("descriptionField").value,
			title:document.getElementById("titleField").value,
			validationCode:document.getElementById("validationCodeField").value,
			date:document.getElementById("dateField").value,
			birthdayPerson:document.getElementById("birthdayPersonField").value,
			birthdayAge:document.getElementById("birthdayAgeField").value,
			birthdaySubmitter:document.getElementById("birthdaySubmitterField").value
		};
	}

	xmlhttpPost("process.php", JSON.stringify(object));

}


function categoryChanged(){
	if ( editorAccess ) return;

	if ( document.getElementById("categoryField").value == birthdayCategoryID ) {
		// Birthdays is selected
		document.getElementById("normalFields").style.display = "none";
		document.getElementById("birthdayFields").style.display = "block";
	}else{
		// Birthdays is not selected
		document.getElementById("normalFields").style.display = "block";
		document.getElementById("birthdayFields").style.display = "none";
	}
}

// Enables or disables all buttons
function setButtonStates(enabled)
{
	var l = document.getElementsByTagName("input");
	for(i = 0; i < l.length; i++) { 
		if( l[i].getAttribute('type') == 'button') {
			l[i].disabled = !enabled;
		}
	}
}