/*
 * set the id for the interval globally
 */
var intIntervalId;
var intAdminIntervalId;

/*
 * array for the current day events
 */
var arrEventsToDisplay;

/*
 * controller function for user events
 */
function displayEvents()
{
	document.getElementById('ticktock').innerHTML = '';
	var intSecondsLeft = addLeadingZero(clientSeconds());
	var intMinutesLeft = addLeadingZero(clientMinutes());
	var intHoursLeft = addLeadingZero(clientHours());
	var intNoEvents = arrEvents.length;

	if (arrEvents != 0) {
		for(var i = 0;i < arrEvents.length;i++) {
			writeEvent('ticktock',arrEvents[i][0],calculateDays(arrEvents[i][1]) + '/' + intHoursLeft + '/' + intMinutesLeft + '/' + intSecondsLeft,i,arrEvents[i][2],intNoEvents)
		}
		//if the first time the set interval i.e. start the clock
		if (typeof(intIntervalId) == 'undefined' || intIntervalId == null) {
			intIntervalId = setInterval("displayEvents()",500);
		}
	} else {
		//there are no events left
		document.getElementById('ticktock').innerHTML = 'You have no personal events, to have personal events try using the calendar. Click on the day you want to add an event then enter your events details.';
		clearInterval(intIntervalId);
		intIntervalId = null;
	}
}

function displayAdminEvents()
{
	document.getElementById('adminticktock').innerHTML = '';
	var intSecondsLeft = addLeadingZero(clientSeconds());
	var intMinutesLeft = addLeadingZero(clientMinutes());
	var intHoursLeft = addLeadingZero(clientHours());
	var intNoEvents = arrAdminEvents.length;

	if (arrAdminEvents != 0) {
		for(var i = 0;i < intNoEvents;i++) {
			writeAdminEvent('adminticktock',arrAdminEvents[i][0],calculateDays(arrAdminEvents[i][1]) + '/' + intHoursLeft + '/' + intMinutesLeft + '/' + intSecondsLeft,i,intNoEvents,arrAdminEvents[i][2])
		}
		//if the first time the set interval i.e. start the clock
		if (typeof(intAdminIntervalId) == 'undefined' || intAdminIntervalId == null) {
			intAdminIntervalId = setInterval("displayAdminEvents()",500);
		}
	}
}


/*
 * writes the events to the page in a lovely format
 * @param string strName Event name
 * @param string strDateAndTimeLeft days minutes and seconds left until the event dd/mm/ss
 * @param integer intId
 */
function writeEvent(strDivName, strName, strDateAndTimeLeft, intId, intEventId, intNoEvents)
{
	strOtherEvents = document.getElementById(strDivName).innerHTML;

	var arrDateAndTimeLeft = strDateAndTimeLeft.split('/');
	var strDays = arrDateAndTimeLeft[0];
	var strHours = arrDateAndTimeLeft[1];
	var strMinutes = arrDateAndTimeLeft[2];
	var strSeconds = arrDateAndTimeLeft[3];


	if (intId != 0) {
		strHr = '<hr class="ticktock-hr" />';
	} else {
		strHr = '';
	}

	if (strDays < 0) {
		strDays = 0;
		strHours = "00";
		strMinutes = "00";
		strSeconds = "00";
	}



	document.getElementById(strDivName).innerHTML = strOtherEvents
		+ '<span class="ticklist-'
		+ intId + '">'
		+ strHr
		+ addPadding(strDays,3) + ' Days '
		+ strHours + ' Hours '
		+ strMinutes + ' Minutes '
		+ strSeconds + ' Seconds Until '
		+ strName
		+ '<a href="#" onclick="deleteEvent(' + intEventId + ');return false;"><img style="border:none;" src="/images/design/delete.gif" /></a>'
		+ '</span>';
}


/*
 * writes the events to the page in a lovely format for admin events
 * @param string strName Event name
 * @param string strDateAndTimeLeft days minutes and seconds left until the event dd/mm/ss
 * @param integer intId
 */
function writeAdminEvent(strDivName, strName, strDateAndTimeLeft, intId, intNoEvents, strLink)
{
	strOtherEvents = document.getElementById(strDivName).innerHTML;
	var arrDateAndTimeLeft = strDateAndTimeLeft.split('/');

	if (intId != 0) {
		strHr = '<hr class="ticktock-hr" />';
	} else {
		strHr = '';
	}

	var arrDateAndTimeLeft = strDateAndTimeLeft.split('/');
	var strDays = arrDateAndTimeLeft[0];
	var strHours = arrDateAndTimeLeft[1];
	var strMinutes = arrDateAndTimeLeft[2];
	var strSeconds = arrDateAndTimeLeft[3];

	if (strDays < 0) {
		strDays = 0;
		strHours = "00";
		strMinutes = "00";
		strSeconds = "00";
	}

	document.getElementById(strDivName).innerHTML = strOtherEvents
		+ '<div class="ticklist-'
		+ intId + '">'
		+ strHr
		+ addPadding(strDays,3) + ' Days '
		+ strHours + ' Hours '
		+ strMinutes + ' Minutes '
		+ strSeconds + ' Seconds Until '
		+ '<a href="' + strLink + '">' + strName + '</a>'
		+ '</div>';
}


/*
 * Deletes the event via ajax and updates the current events
 * @param intEventId event id
 */
function deleteEvent(intEventId)
{
	new Ajax.Request("/ticktock/ajax-delete-event.php?event_id=" + intEventId, {
		method:'get',
		onSuccess: function(transport){
			var json = transport.responseText.evalJSON();
			arrEvents = json.events;
			getCalendar();
		},
		onFailure: function(){ alert('Something went wrong...') }
	});
}

/*
 * Calculates the number of days left before the event
 * @param string strDate date in dd/mm/yyyy
 * @return integer number of days until event
 */
function calculateDays(strDate)
{
	//explode the string
	var arrDate = strDate.split('/');
	var intYear = arrDate[2];
	var intMonth = arrDate[1];
	var intDay = arrDate[0];


	//dividing int to get number of days
	var intOneDay = 1000*60*60*24;

	var subjectDate = new Date(intYear,intMonth - 1, intDay);

	//number of days
	var intDays = Math.ceil((subjectDate.getTime()-clientTime.getTime())/(intOneDay)) - 1;

	if (intDays < 0) {
		if (isLeapYear(intYear)) {
			intDays = 366 + intDays;
		} else {
			intDays = 365 + intDays;
		}
	}

	return intDays;
}


/*
 * calulates whether the year is a leap year
 * @param integer intYear year in yyyy
 * @return boolean true if is leap year
 */
function isLeapYear(intYear)
{
	intYear = parseInt(intYear);

	if (intYear%4 == 0) {
		if (intYear%100 != 0) {
			return true;
		} else {
			if (intYear%400 == 0) {
				return true;
			} else {
				return false;
			}
		}
	}
	return false;
}

/*
 * calulates the number of seconds that are left until the next minute from clients clock
 * @return integer seconds remaining
 */
function clientSeconds()
{
	clientTime = new Date();
	var intSeconds = 59 - clientTime.getSeconds();

	return intSeconds;
}

/*
 * calculates the number of minutes until the next hour
 * @return integer number of minutes left
 */
function clientMinutes()
{
	clientTime = new Date();
	// minutes
	var intMinutes = 59 - clientTime.getMinutes();

	intMinutes = changeSixtyToZero(intMinutes);

	return intMinutes;
}

/*
 * calculates the number of hours until the next day
 * @return integer number of hours left
 */
function clientHours()
{
	clientTime = new Date();
	var intHours = 23 - clientTime.getHours();
	return intHours;
}

/*
 * addes padding to a string that is hidden
 * @param string strValue the string to add padding to
 * @param integer intMaxLength the max length of the string
 * @return string formatted string
 */
function addPadding(strValue,intMaxLength)
{
	strValue = String(strValue);

	var strPadding = '';
	if (strValue.length < intMaxLength) {
		for (i = strValue.length; i < intMaxLength; i++)
		{
			strPadding += 0;
		}
	}

	strValue = '<span style="visibility: hidden">' + strPadding + '</span>' + strValue;

	return strValue;
}


/*
 * addes a leading zero to an integer
 * @param integer value to effect
 * @return integer with leading zero
 */
function addLeadingZero(intValue)
{
	if (intValue <= 9) {
		intValue = '0' + intValue;
	}
	return intValue;
}

/*
 * changes six to zero
 * @param integer value to effect
 * @return integer
 */
function changeSixtyToZero(intValue)
{
	if (intValue == 60) {
		intValue = '0';
	}

	return intValue;
}



/////////////////////////
/* CALENDAR JAVASCRIPT */
/////////////////////////

/* global vars */
var intGlobalDay;
var intGlobalMonth;
var intGlobalYear;
var selectedGlobalCellClass;
var intGlobalCell;
var intGlobalRow;

/* calendar ajax for moving between months */

function getCalendar(query)
{

	if (query) {
		intGlobalRow = '';
		intGlobalCell = '';
		selectedGlobalCellClass = null;
	}

	new Ajax.Request("/calendar/calendar.php?view=" + query, {
		method:'get',
		onSuccess: function(transport){

			var response = transport.responseText

			document.getElementById("calendar").innerHTML = response;

			//select day
			if (intGlobalRow) {
				selectedCell(intGlobalRow, intGlobalCell);
				showEventList('',intGlobalDay,intGlobalMonth,intGlobalYear)
			} else {
				document.getElementById("event_form").style.display = 'none';
				document.getElementById("events").style.display = 'none';
			}


		},
		onFailure: function(){ alert('Something went wrong...') }
	});
}





/*
 * adds an event, then upadtes everything affected on the page
 */
function addEvent()
{
	document.forms['event_form'].submit.disabled = true;
	if (document.forms['event_form'].event.value) {
		new Ajax.Request("/calendar/ajax-save-event.php", {
			method:'post',
			parameters: {
			day: intGlobalDay,
			month: intGlobalMonth,
			year: intGlobalYear,
			event: document.forms['event_form'].event.value,
			repeat: document.forms['event_form'].repeat.checked,
			event_id: document.forms['event_form'].event_id.value
			},
			onSuccess: function(transport){
				var json = transport.responseText.evalJSON();
				arrEvents = json.events;
				if (intIntervalId == null) {
					displayEvents();
				}
				getCalendar();
			},
			onFailure: function(){ alert('Something went wrong...') }
		});
	}
}



/* gets the selected table cells indexes */
function selectedCell(intRow, intCell)
{
	objtable = document.getElementById("calendar_table");

	//if there is a cell already selected revert its style to its original
	if (selectedGlobalCellClass != null) {
		objtable.rows[intGlobalRow].cells[intGlobalCell].className = selectedGlobalCellClass;
	}

	//save into globals
	intGlobalCell = intCell;
	intGlobalRow = intRow;
	selectedGlobalCellClass = objtable.rows[intGlobalRow].cells[intGlobalCell].className;

	//change style
	objtable.rows[intGlobalRow].cells[intGlobalCell].className = 'selected';
}



function showEventList(thisLink,intDay,intMonth,intYear)
{

	//if the function is used from a dom object the get the table index
	if (thisLink) {
		intGlobalDay = intDay;
		intGlobalMonth = intMonth;
		intGlobalYear = intYear;

		intCell = thisLink.parentNode.cellIndex;
		intRow = thisLink.parentNode.parentNode.rowIndex;
	}

	//highligh selected cell
	selectedCell(intRow, intCell);
	new Ajax.Request("/calendar/ajax-get-events.php", {
		method:'get',
		parameters: {
			day: intDay,
			month: intMonth,
			year: intYear
		},
		onSuccess: function(transport){

			var json = transport.responseText.evalJSON();
			arrEventsToDisplay = json.events;

			displayListEvents();

		},
		onFailure: function(){ alert('Something went wrong...') }
	});

}

function displayListEvents()
{

	var strHtml = '';
	if (arrEventsToDisplay != null) {
		for(var x = 0;x < arrEventsToDisplay.length;x++) {
			strHtml += '<div id="display_event">'
				+ '<a href="#" onclick="editEvent('
				+ arrEventsToDisplay[x][0]
				+ ')"><img border="0" src="/images/design/edit.gif" title="edit" alt="edit"/></a>'
				+ '<a href="#" onclick="deleteEvent('
				+ arrEventsToDisplay[x][0]
				+ ')"><img border="0" src="/images/design/delete.gif" title="delete" alt="delete"/></a>'
				+ arrEventsToDisplay[x][1] + '</div>';
		}


	}
	document.getElementById("event_form").style.display = 'block'
	document.getElementById("events").style.display = 'block';
	document.getElementById("events").innerHTML = strHtml;
	resetEventForm();
}



function hideEventList(thisLink, intDay, intMonth, intYear)
{

	document.getElementById("events").innerHTML = '';
	document.getElementById("event_form").style.display = 'block';
	document.getElementById("events").style.display = 'block';

	resetEventForm();

	intCell = thisLink.parentNode.cellIndex;
	intRow = thisLink.parentNode.parentNode.rowIndex;

	selectedCell(intRow, intCell);

	intGlobalDay = intDay;
	intGlobalMonth = intMonth;
	intGlobalYear = intYear;
}

/*
 * puts the information from the globally stored array for todays into the form
 * @param integer event id
 */
function editEvent(intEventId)
{
	for(var x = 0;x < arrEventsToDisplay.length;x++) {
		if (arrEventsToDisplay[x][0] == intEventId) {
			var intArrayKey = x;
		}
	}

	//event value
	document.forms['event_form'].event.value = arrEventsToDisplay[intArrayKey][1];

	//repeat
	if (arrEventsToDisplay[intArrayKey][2] == 't') {
		document.forms['event_form'].repeat.checked = true;
	} else {
		document.forms['event_form'].repeat.checked = false;
	}
	document.forms['event_form'].submit.value = 'Edit';
	//hidden pk_id
	document.forms['event_form'].event_id.value = intEventId;
}

/*
 * resets the event form and returns the form button to add
 */
function resetEventForm()
{
	document.forms['event_form'].submit.value = 'Add';
	document.forms['event_form'].event.value = '';
	document.forms['event_form'].event_id.value = '';
	document.forms['event_form'].repeat.checked = true;
	document.forms['event_form'].event.focus();
	document.forms['event_form'].submit.disabled = false;
}

var intImageCycle = 1;
var objInterval = null;

function cycleImages()
{
	objInterval = self.setInterval("newImage()",2500);
}

function newImage()
{
    if (intImageCycle > 5) {
        window.clearInterval(objInterval);
        intImageCycle = 1;
    }

    document.getElementById("bubble").innerHTML = '<img src="/images/design/bubble' + intImageCycle + '.gif" />';
    intImageCycle++;
    
    /*
     * pre-cache incremental
     */
    if (intImageCycle <= 5) {
        objImage = new Image();
        objImage.src = '/images/design/bubble' + intImageCycle + '.gif';
    }
}