var KEY_BACKSPACE = 8;
var KEY_DELETE = 46;
var KEY_ENTER = 13;
var KEY_CURSOR_LEFT = 37;
var KEY_CURSOR_RIGHT = 39;
var KEY_CURSOR_DOWN = 40;
var KEY_CURSOR_UP = 38;
var KEY_ESCAPE = 27;

var ENTRY_ID = "entryID";
var PARENT_ENTRY_ID = "parentEntryID";

var INITIAL_BRIGHTNESS = 100;
var MAX_BRIGHTNESS = 255;
var FADE_UP_INCR = 50;
var FADE_DOWN_INCR = -10;

var strURI = document.location.href;
var gParity;
var domain = strURI.match( "(.*://(www\.)?([^/:]+))" );
domain = ( domain && domain[ 1 ] ) ? domain[ 1 ] : '';

var AJAX_REQUEST_URL = domain + "/core/ajax/handler.php";
var SCRIPT_ENTRY_VIEWER = "/core/scripts/entryViewer.php";
var IMG_SPINNER = "/core/images/spinner.gif";

var CLASS_GET_COMMENTS = "CommentHandler";
var ACTION_GET_COMMENTS = "getCommentsXML";
var CLASS_DELETE = "DeleteHandler";
var ACTION_DELETE = "deleteEntry";
var CLASS_VOTE = "VoteHandler";
var ACTION_VOTE = "saveVote";
var CLASS_SEARCH = "SearchHandler";
var ACTION_SEARCH_GETRESULTS = "getSearchDataXML";

var SEARCH_SEARCH_TEXT = "searchText";
var SEARCH_MAX_ENTRIES = 20;
var gSearchResultsContainer = null;
var gLastSearchText = "";
var gSearchRequest = null;
var gCommentRequest = null;
var gVoteRequestGUID = 1;
var gUniqueId = 1;
//var gSearchFrenzyTimer = null;

var objCountdown = null;

function getParity() {
	if ( gParity == "even" ) {
		gParity = "odd";
	} else {
		gParity = "even";
	}
	return gParity;
}

function Person( domElement ) {
	this.scale = 1.0;
	this.overrideLinkURL = null;	
	if ( domElement.getElementsByTagName( 'name' )[0] && 
			domElement.getElementsByTagName( 'name' )[0].firstChild ) {
		this.name = domElement.getElementsByTagName( 'name' )[0].firstChild.data;
	} else {
		this.name = '';
	}
	if ( domElement.getElementsByTagName( 'profilelink' )[0] ) {
		this.profileLink = domElement.getElementsByTagName( 'profilelink' )[0].firstChild.data;
	}
	if ( domElement.getElementsByTagName( 'iconurl' )[0].firstChild ) {
		this.iconurl = domElement.getElementsByTagName( 'iconurl' )[0].firstChild.data;
	}
	this.getTableRow = function() {
		var tr = document.createElement( 'TR' );
		tr.className = getParity();
		var td = this.getTableCell();
		tr.appendChild( td );
		return tr;		
	};
	
	this.getTableCell = function() {
		var td = document.createElement( 'TD' );
		td.style.verticalAlign = "top";
		var profileLink = document.createElement( 'A' );
		profileLink.style.verticalAlign = "bottom";
		if ( this.overrideLinkURL ) {
			profileLink.href = this.overrideLinkURL;
		} else if ( this.profileLink ) {
			profileLink.href = this.profileLink;
		}
		td.style.width = "92px";
		td.style.textAlign = "right";
		if ( this.iconurl )	{
			td.style.fontSize = "7pt";
			var icon = document.createElement( 'IMG' );
			icon.src = this.iconurl;
			icon.className = "icon";
			icon.style.padding = "0";
			icon.style.width = ( 30 * this.scale ) + "px";
			icon.style.height = ( 40 * this.scale ) + "px";
			profileLink.appendChild( icon );
		}		
		profileLink.appendChild( document.createTextNode( this.name ) );
		td.appendChild( profileLink );
		return td;		
	};
}

function SearchResultCategory( domElement ) {
	if ( domElement.getAttribute( 'name' ) ) {
		this.name = domElement.getAttribute( 'name' );
	} else {
		this.name = '';
	}
	if ( domElement.getAttribute( 'classname' ) ) {
		this.entryClassName = domElement.getAttribute( 'classname' );
	} else {
		this.entryClassName = '';
	}
	if ( domElement.getAttribute( 'entrycount' ) ) {
		this.entryCount = domElement.getAttribute( 'entrycount' );
	} else {
		this.entryCount = '';
	}
	this.getDOM = function() {
		var table = document.createElement( 'TABLE' );
		table.className = 'dataTable';
		table.style.width = 'auto';
		var thead = document.createElement( 'THEAD' );
		var tbody = document.createElement( 'TBODY' );
		var trHeader = document.createElement( 'TR' );
		var thTitle = document.createElement( 'TH' );
		thTitle.colSpan = 2;
		thTitle.appendChild( document.createTextNode( this.name + " (" + this.entryCount + ")" ) );
		trHeader.appendChild( thTitle );
		thead.appendChild( trHeader );			
		var entryNodes = domElement.getElementsByTagName( 'entry' );
		var tdEntryTitle;
		var trEntry;
		var node;
		if ( this.name == 'Photos' ) {
			trEntry = document.createElement( 'TR' );
			trEntry.className = getParity();
			tdEntryTitle = document.createElement( 'TD' );
			for ( i = 0; i < entryNodes.length; i++ ) {			
				node = entryNodes[i];
				if ( node.getElementsByTagName( 'htmlcontent' )[0] && 
					node.getElementsByTagName( 'htmlcontent' )[0].firstChild ) {
					tdEntryTitle.innerHTML += node.getElementsByTagName( 'htmlcontent' )[0].firstChild.data;
				}				
			}
			trEntry.appendChild( tdEntryTitle );
			tbody.appendChild( trEntry );
		} else {
			for ( i = 0; i < entryNodes.length; i++ ) {			
				trEntry = document.createElement( 'TR' );
				trEntry.className = getParity();
				node = entryNodes[i];
				var authorDisplayMode = "1";
				if ( node.getAttribute( 'authordisplaymode' ) ) {
					authorDisplayMode = node.getAttribute( 'authordisplaymode' );
				} 
				if ( authorDisplayMode != "-1" ) {
					var userNodes = node.getElementsByTagName( 'person' );
					if ( userNodes.length == 1 ) {
						var author = new Person( userNodes[0] );
						trEntry.appendChild( author.getTableCell() );
					}
				}
				tdEntryTitle = document.createElement( 'TD' );
				if ( node.getElementsByTagName( 'htmlcontent' )[0] && 
					node.getElementsByTagName( 'htmlcontent' )[0].firstChild ) {
					tdEntryTitle.innerHTML = node.getElementsByTagName( 'htmlcontent' )[0].firstChild.data;
				}				
				trEntry.appendChild( tdEntryTitle );
				tbody.appendChild( trEntry );
			}
		}
		table.appendChild( thead );		
		table.appendChild( tbody );		
		return table;
	};
}

function removeChildren( objElement ) {
	while ( objElement.childNodes.length > 0 ) {
		objElement.removeChild( objElement.childNodes[0] );
	}
}

function isObject( a ) {
    return ( a && typeof a == 'object' );
}

function isEmpty( objTextField ) {
	if ( ( objTextField.value.length === 0 ) || ( objTextField.value === null ) ) {
		return true;
	} else {
		return false;
	}
}

function showMoreObject( e, objText, objShow, objMore ) {
	if ( !objText || !objMore || !objShow ) { return false;	}
	e = (e) ? e : (window.event ) ? window.event : null;
	if ( !e ) { return false; }
	var code = e.keyCode ? e.keyCode : e.which ? e.which : null;
	if ( !code ) {
		return false;
	}
	if ( objText.value.length >= objText.maxLength && 
			code != KEY_BACKSPACE && 
			code != KEY_DELETE && 
			code != KEY_CURSOR_LEFT &&
			code != KEY_CURSOR_RIGHT ) {
		objShow.style.display = "block";
		objMore.focus();
	}
	return true;
}

function toggleVisible( obj ) {
	if ( !obj ) { return false; }
	if ( !obj.style ) { return false; }
	if ( obj.style.display != "none" ) {
		obj.style.display = "none";
		return false;
	} else {
		obj.style.display = "block";
		return true;
	}
}	

function vote( entryID, objImageUp, objImageDown, direction ) {
	gVoteRequestGUID += 1; // Increment a number to append to the URL in order to prevent browser caching
	if ( direction > 0 ) {
		objImageUp.src = "/core/actioners/VoteActioner.php?action=voteUp&entryID=" + entryID + "&amp;" + gVoteRequestGUID; 
		objImageDown.src = "/core/images/ThumbsDown.gif"; // Reset the other image in case this is a switched vote
	} else {
		objImageDown.src = "/core/actioners/VoteActioner.php?action=voteDown&entryID=" + entryID + "&amp;" + gVoteRequestGUID; 
		objImageUp.src = "/core/images/ThumbsUp.gif"; // Reset the other image in case this is a switched vote
	}
	return true;
}

function showOnValue( selectField, showElementName, showValue ) {
	if ( selectField.value == showValue ) {
		document.getElementById( showElementName ).style.display = "block";
	} else {
		document.getElementById( showElementName ).style.display = "none";
	}
}

function switchToTab( tabContainerID, tabID ) {
	var tabPageID = tabContainerID + "-page" + tabID;
	var tabAnchorID = tabContainerID + "-tab" + tabID;
	var tabContainerObj = document.getElementById( tabContainerID );
	var tabPageObj = document.getElementById( tabPageID );
	if ( !tabPageObj ) {
		alert( "Tab not yet loaded, please try again in a moment" );
		return false;
	}
	for ( var i = 0; i < tabContainerObj.childNodes.length; i++ ) {
		var objChild = tabContainerObj.childNodes[ i ];
		if ( objChild.tagName == "DIV" ) {
			objChild.style.display = "none";
		}
		if ( objChild.tagName == "A" ) {
			objChild.className = "navigationTab";	
		}
	}
	var tabAnchorObj = document.getElementById( tabAnchorID );
	if ( !tabAnchorObj ) { alert( "System error - Tab anchor not found: " + tabAnchorID ); }
	tabAnchorObj.className = "navigationTabActive";	
	tabAnchorObj.blur();
	tabPageObj.style.display = "block";	
	return true;
}

function capitaliseFirstLetter( objText ) {
	objText.value = objText.value.substring(0, 1).toUpperCase() + objText.value.substring(1, objText.value.length).toLowerCase();
}

function showAndHide( objShow, objHide ) {
	if ( isObject( objShow ) ) {
		objShow.style.display = "block";
	} else {
		document.getElementById( objShow ).style.display = "block";
	}
	if ( isObject( objHide ) ) {
		objHide.style.display = "none";
	} else {
		document.getElementById( objHide ).style.display = "none";
	}
}

function displayDebuggingInfo() {
	document.getElementById( "debugInfo" ).style.display = "block";
}

function deleteConfirm() {
	return confirm( "Are you sure you want to delete this entry?" );
}

function forgotMyPassword() {
	document.getElementById( "getPasswordForm" ).style.display = "inline";
	document.getElementById( "logonForm" ).style.display = "none";
}

function titleCursorBlink( strMessage ) {
	if ( !document.getElementById( "rollingTitle" ) ) {
		return false;
	}
	var rollingTitle = document.getElementById( "rollingTitle" );
	if ( rollingTitle.innerHTML.length > strMessage.length ) {
		rollingTitle.innerHTML = rollingTitle.innerHTML.substr( 0, rollingTitle.innerHTML.length - 1 );
	} else {
		rollingTitle.innerHTML = rollingTitle.innerHTML + "_";
	}
	setTimeout( "titleCursorBlink( '" + strMessage + "' )", 500 );
	return true;
}

function revealTitle( strMessage ) {
	if ( !document.getElementById( "rollingTitle" ) ) {
		return false;
	}
	var rollingTitle = document.getElementById( "rollingTitle" );
	rollingTitle.style.color = "rgb(" + INITIAL_BRIGHTNESS + "," + INITIAL_BRIGHTNESS + "," + INITIAL_BRIGHTNESS + ")";	
	if ( rollingTitle.innerHTML.length >= strMessage.length ) {
		titleCursorBlink( strMessage );
		return true;
	} else {	
		rollingTitle.innerHTML = strMessage.substr( 0, rollingTitle.innerHTML.length + 1 );
		setTimeout( "revealTitle( '" + strMessage + "' )", 60 );
		return true;
	}
}

function fadeInTitle( strMessage, intFade, direction ) {
	var rollingTitle = document.getElementById( "rollingTitle" );
	rollingTitle.style.color = "rgb(" + intFade + "," + intFade + "," + intFade + ")";	
	if ( direction == 1 && intFade + FADE_UP_INCR < MAX_BRIGHTNESS ) {
		setTimeout( "fadeInTitle( '" + strMessage + "', " + ( intFade + FADE_UP_INCR ) + ", 1 )", 60 );
	} else if ( ( intFade + FADE_UP_INCR ) >= 255 || 
				( direction == -1 && intFade > INITIAL_BRIGHTNESS ) ) {
		setTimeout( "fadeInTitle( '" + strMessage + "', " + ( intFade + FADE_DOWN_INCR ) + ", -1 )", 60 );
	}
}

function getXMLHTTPObject() 
{
    var xmlhttp;
    /*@cc_on
     @if (@_jscript_version >= 5)
      try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } 
      catch (e) 
      {
          try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } 
          catch (E) { xmlhttp = false; }
      } 
     @else
      xmlhttp = false;
     @end @*/
    if ( !xmlhttp && typeof XMLHttpRequest != 'undefined' ) {
		try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp = false; }
    }
    return xmlhttp;
}

function setSearchActive( objSearchBox, isActive ) {
	objSearchBox.className = isActive ? 'searchActive' : 'search';
}

function handleSearchMessageResponse( req, objSearchBox ) {
	setSearchActive( objSearchBox, false );	
	// Re-check the search box since it might have been cancelled request was made
	if ( !objSearchBox.value || objSearchBox.value.length < 3 )	{
		gSearchResultsContainer.style.display = "none";
		return;
	}	
	if ( gSearchResultsContainer != undefined ) {
		removeChildren( gSearchResultsContainer );
	} else {
		gSearchResultsContainer = document.createElement( 'DIV' );
		gSearchResultsContainer.className = "searchResults";
		objSearchBox.parentNode.appendChild( gSearchResultsContainer );
	}	
	gSearchResultsContainer.style.display = "block";
	var responseDOM = req.responseXML.documentElement;
	var errorsDOM = responseDOM.getElementsByTagName( 'errors' )[0];
	var categoriesDOM = responseDOM.getElementsByTagName( 'categories' )[0];
	var usersDOM = responseDOM.getElementsByTagName( 'users' )[0];
	var errorMessage = '';
	var resultsHeaderText = "";
	var errorNodes;
	var userNodes = new Array();
	if ( errorsDOM ) {
		errorNodes = errorsDOM.getElementsByTagName( 'error' );
	}
	var i;
	var categories = new Array();
	if ( categoriesDOM ) {
		var entryCount = 0;
		var categoryNodes = categoriesDOM.getElementsByTagName( 'category' );
		for ( i = 0; i < categoryNodes.length; i++ ) {
			var newCategory = new SearchResultCategory( categoryNodes[i] );
			categories[categories.length] = newCategory;
			entryCount += parseInt( newCategory.entryCount, 10 );
		}
		if ( entryCount == SEARCH_MAX_ENTRIES ) {
			resultsHeaderText += "displaying closest-matching " + entryCount + " entries";
		} else {
			resultsHeaderText += entryCount + " entry(s)";
		}
	}
	if ( usersDOM )	{
		userNodes = usersDOM.getElementsByTagName( 'person' );
		if ( resultsHeaderText ) {
			resultsHeaderText += " and ";
		}
		resultsHeaderText += userNodes.length + " user(s)";
	}
	if ( !errorNodes ) {
		resultsHeader = document.createElement( 'H2' );
		resultsHeader.style.margin = "0 0 10px 0";
		resultsHeader.appendChild( document.createTextNode( resultsHeaderText ) );
		gSearchResultsContainer.appendChild( resultsHeader );
	}
	if ( errorNodes ) {
		// Concatenate error message(s)
		for ( i = 0; i < errorNodes.length; i++ ) {
			if ( errorMessage ) { errorMessage += ', '; }
			errorMessage += errorNodes[i].firstChild.data;
		}
		// Display error message(s)
		var paraError = document.createElement( 'P' );
		paraError.className = "error";
		paraError.style.margin = "0";
		paraError.appendChild( document.createTextNode( errorMessage ) );
		gSearchResultsContainer.appendChild( paraError );
	}
	for ( i = 0; i < categories.length; i++ ) {
		gSearchResultsContainer.appendChild( categories[i].getDOM() );
	}
	if ( userNodes.length > 0 )	{
		var userTable = document.createElement( 'TABLE' );
		var userTBody = document.createElement( 'TBODY' );
		var userTHead = document.createElement( 'THEAD' );
		var userTHeadTH = document.createElement( 'TH' );
		userTable.style.width = 'auto';
		userTable.className = 'dataTable';
		userTHeadTH.appendChild( document.createTextNode( "Users (" + userNodes.length + ")" ) );
		userTHead.appendChild( userTHeadTH );
		userTable.appendChild( userTHead );
		for ( i = 0; i < userNodes.length; i++ ) {
			var user = new Person( userNodes[i] );
			userTBody.appendChild( user.getTableRow() );
		}
		userTable.appendChild( userTBody );
		gSearchResultsContainer.appendChild( userTable );
	}
}

function initSearch( e, objSearchBox ) {
	var code;
	var searchText = objSearchBox.value;	
	e = (e) ? e : (window.event ) ? window.event : null;
	if ( !e ) { return false; }
	code = e.keyCode ? e.keyCode : e.which ? e.which : null;
	if ( !code ) { return false; }
	if ( ( !searchText || searchText.length < 3 ) || ( code && code == KEY_ESCAPE ) ) {
		if ( gSearchResultsContainer ) {
			gSearchResultsContainer.style.display = "none";
		}
		return false;
	}		
	if ( searchText == gLastSearchText ) {
		return false;	
	}	
	if ( gSearchRequest != undefined ) {
		gSearchRequest.abort();
	}		
	gSearchRequest = getXMLHTTPObject();
	gSearchRequest.onreadystatechange = function() {
		if ( 'function' != typeof handleSearchMessageResponse ) {
			return false; // The code has been disposed
		}
		if ( gSearchRequest.readyState != 4 ) {
			return false;
		} else if ( !gSearchRequest.responseXML ) {
			alert( "Error performing search: " + gSearchRequest.responseText );
		} else if ( !gSearchRequest.responseText ) {
			alert( "Error performing search" );
		} else {
			handleSearchMessageResponse( gSearchRequest, objSearchBox );
		}
		return true;
	};
	setSearchActive( objSearchBox, true );
	gSearchRequest.open( "POST", AJAX_REQUEST_URL, true );
	gSearchRequest.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
	gSearchRequest.send( "class=" + CLASS_SEARCH + 
		"&action=" + ACTION_SEARCH_GETRESULTS + 
		"&" + SEARCH_SEARCH_TEXT + "=" + escape( searchText ) );
	gLastSearchText = searchText;
	return true;
}

function handleGetCommentsResponse( objCommentContainer ) {
	alert( gCommentRequest.responseText );
}

function initGetComments( e, objCommentContainer, parentEntryID ) {
	if ( !parentEntryID ) {
		alert( "No parentEntryID passed to initGetComments()" );
	}
	if ( gCommentRequest != undefined ) {
		gCommentRequest.abort();
	}
	gCommentRequest = getXMLHTTPObject();
	gCommentRequest.onreadystatechange = function() {
		if ( 'function' != typeof handleGetCommentsResponse ) {
			return false; // The code has been disposed
		}
		if ( gCommentRequest.readyState != 4 ) {
			return false;
		} else if ( !gCommentRequest.responseXML ) {
			alert( "Error getting comments: " + gCommentRequest.responseText );
		} else if ( !gCommentRequest.responseText ) {
			alert( "Error getting comments" );
		} else { 
			handleGetCommentsResponse( objCommentContainer );
		}
		return true;
	};
	gCommentRequest.open( "POST", AJAX_REQUEST_URL, true );
	gCommentRequest.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
	gCommentRequest.send( "class=" + CLASS_GET_COMMENTS + 
		"&action=" + ACTION_GET_COMMENTS + 
		"&" + PARENT_ENTRY_ID + "=" + parentEntryID );
	return true;
}

function handleVoteResponseSuccess( objSender, increment ) {
	if ( increment == 0 ) {
		objSender.className = objSender.className.substr(0, objSender.className.length - 1) + "E";
	} else {
		objSender.className = 'v' + ( increment == 1 ? "Up" : "Down" ) + "A";
	}
	adjustVote( objSender, increment == 0 ? -1 : 1 )
	// Reset the class of the other option
	var oppositeVoteElementId = '';
	if ( objSender.id.search( 'Up' ) != -1 ) {
		oppositeVoteElementId = objSender.id.replace( 'Up', 'Down' );
	} else if ( objSender.id.search( 'Down' ) != -1 ) {
		oppositeVoteElementId = objSender.id.replace( 'Down', 'Up' );	
	} else {
		// Couldn't find opposite element
		return;
	}
	var oppositeVoteElement = document.getElementById(oppositeVoteElementId);
	if ( oppositeVoteElement ) {
		var currentState = oppositeVoteElement.className.substring(oppositeVoteElement.className.length - 1);
		if ( currentState == 'A' ) {
			oppositeVoteElement.className = oppositeVoteElement.className.substr(0, oppositeVoteElement.className.length - 1) + "E";
			adjustVote( oppositeVoteElement, increment == 0 ? 1 : -1 )
		}
	}
}

function adjustVote( element, adjustment ) {
	var existingVote = parseInt( element.innerHTML );
	if ( isNaN(existingVote) ) {
		return;
	}
	element.innerHTML = existingVote + adjustment;
}


function handleVoteError( objSender, oldClassName ) {
	objSender.className = 'vError';
	var fName = "handleRevertVoteError('" + objSender.id + "', '" + oldClassName + "')";
	setTimeout(fName, 1000);
}

function handleRevertVoteError( objId, oldClassName ) {
	var obj = document.getElementById( objId );
	obj.className = oldClassName;
}

function aVote( objSender, increment ) {
	var currClassName = objSender.className;
	var currentState = currClassName.substring(currClassName.length - 1);
	if ( currentState != 'E' && currentState != 'A' ) {
		return false;
	}
	if ( ( currClassName == 'vDownA' && increment == -1 ) || ( currClassName == 'vUpA' && increment == 1 ) ) {
		// We've clicked on our existing vote. We want to remove it
		increment = 0;
	}
	var entryId = objSender.getAttribute('entryId');
	if ( objSender.voteReq != undefined ) {
		// Cancel existing vote action 
		objSender.voteReq.abort();
	}
	// Cancel voting on other option
	if ( increment != 0 ) {
		var oppositeVoteElement = document.getElementById("v" + ( increment == 1 ? "Down" : "Up" ) + entryId );
		if ( oppositeVoteElement ) {
			if ( oppositeVoteElement.voteReq != undefined ) {
				// Cancel existing vote action in opposite direction
				oppositeVoteElement.voteReq.abort();
			}
		}
	}
	objSender.voteReq = getXMLHTTPObject();
		objSender.voteReq.onreadystatechange = function() {
		if ( 'function' != typeof handleVoteResponseSuccess ) {
			return false; // The code has been disposed
		}
		if ( objSender.voteReq.readyState != 4 ) {
			return false;
		} else if ( !objSender.voteReq.responseXML ) {			
			objSender.title = "Error voting: " + objSender.voteReq.responseText;
			handleVoteError( objSender, currClassName );
		} else if ( !objSender.voteReq.responseText ) {
			handleVoteError( objSender, currClassName );
		} else {
			var responseDOM = objSender.voteReq.responseXML.documentElement;
			var errorsDOM = responseDOM.getElementsByTagName( 'errors' )[0];
			if ( errorsDOM ) {
				var errorNodes = errorsDOM.getElementsByTagName( 'error' );
				var errorMessage = '';
				for ( i = 0; i < errorNodes.length; i++ ) {
					if ( errorMessage ) { errorMessage += ', '; }
					errorMessage += errorNodes[i].firstChild.data;
				}
				objSender.title = "Error voting: " + errorMessage;
				handleVoteError( objSender, currClassName );
			}
			else {
				handleVoteResponseSuccess( objSender, increment );
			}
		}
		return true;
	};
	objSender.voteReq.open( "GET", AJAX_REQUEST_URL + "?class=" + CLASS_VOTE + 
		"&action=" + ACTION_VOTE + "&" + ENTRY_ID + "=" + entryId + "&increment=" + increment, true );
	objSender.className = objSender.className.substr(0, objSender.className.length - 1) + "W";
	objSender.voteReq.send(null);
	return false; 
}

function animateCollapse( objId ) {
	var obj = document.getElementById( objId );
	var currentHeight = obj.style.height ? parseInt( obj.style.height, 10 ) : obj.offsetHeight;
	if ( currentHeight < 1 ) {
		obj.style.display = 'none';
		return false;	
	}
	var newHeight = Math.floor(currentHeight / 2);
	obj.style.height = newHeight + 'px';
	setTimeout( "animateCollapse( '" + objId + "' );", 40 );	
}

function handleDeleteResponseSuccess( objContainer ) {
	var obj = objContainer;
	do {
		if ( !obj.getAttribute ) {
			return false;
		}
		obj = obj.parentNode;
	}
	while ( obj && !obj.getAttribute( "entrycontainer" ) );
	if ( obj ) {
		// We've found the entry container
		obj.style.overflow = 'hidden';
		obj.style.paddingBottom = 0;
		obj.style.paddingTop = 0;
		gUniqueId += 1;
		obj.id = gUniqueId + '';
		animateCollapse( obj.id );
	}
}

function initDeleteEntry( e, objContainer, entryID ) {
	if ( objContainer.disabled ) {
		return false;
	}
	if ( !entryID ) {
		alert( "No entryID passed to initDelete()" );
	}
	objContainer.disabled = true;
	objContainer.href = '';
	for ( var i = 0; i < objContainer.childNodes.length; i++ ) {
		var objChild = objContainer.childNodes[ i ];
		if ( objChild.tagName == "IMG" ) {
			objChild.src = IMG_SPINNER;
		}
	}
	if ( objContainer.gDeleteRequest != undefined ) {
		objContainer.gDeleteRequest.abort();
	}
	objContainer.gDeleteRequest = getXMLHTTPObject();
	objContainer.gDeleteRequest.onreadystatechange = function() {
		if ( 'function' != typeof handleDeleteResponseSuccess ) {
			return false; // The code has been disposed
		}
		if ( objContainer.gDeleteRequest.readyState != 4 ) {
			return false;
		} else if ( !objContainer.gDeleteRequest.responseXML ) {
			alert( "Error deleting: " + objContainer.gDeleteRequest.responseText );
		} else if ( !objContainer.gDeleteRequest.responseText ) {
			alert( "Error deleting" );
		} else {
			var responseDOM = objContainer.gDeleteRequest.responseXML.documentElement;
			var errorsDOM = responseDOM.getElementsByTagName( 'errors' )[0];
			if ( errorsDOM ) {
				objContainer.disabled = false;
				objContainer.style.fontWeight = 'normal';
				var errorNodes = errorsDOM.getElementsByTagName( 'error' );
				var errorMessage = '';
				for ( i = 0; i < errorNodes.length; i++ ) {
					if ( errorMessage ) { errorMessage += ', '; }
					errorMessage += errorNodes[i].firstChild.data;
				}
				alert( "Error trying to delete entry: " + errorMessage );
			} else {
				handleDeleteResponseSuccess( objContainer );
			}
		}
		return true;
	};
	objContainer.gDeleteRequest.open( "POST", AJAX_REQUEST_URL, true );
	objContainer.gDeleteRequest.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
	objContainer.gDeleteRequest.send( "class=" + CLASS_DELETE + 
		"&action=" + ACTION_DELETE + 
		"&" + ENTRY_ID + "=" + entryID );
	return false;
}

function countdown() {
	if ( !objCountdown ) {
		alert( "No objCountdown available to countdown function" );
		return false;
	}
	if ( !objCountdown.countdownDate ) {
		var eventDateString = objCountdown.getAttribute( "date" );
		var msecLeft = objCountdown.getAttribute( "msecleft" );
		if ( !msecLeft && !eventDateString ) {
			alert( "No date or mescleft attributes on countdown object" ); 
			return false;                                            
		}                           
		if ( eventDateString ) {
			objCountdown.countdownDate = new Date( eventDateString );
		} else {
			objCountdown.countdownDate = new Date();
			objCountdown.countdownDate.setTime( objCountdown.countdownDate.getTime() + parseInt(msecLeft, 10) );	
		}	
	}
	d = new Date();
	var count = Math.floor( ( objCountdown.countdownDate.getTime() - d.getTime() ) / 1000 );
	var countdownText = "";
	var waitingPrefix = objCountdown.getAttribute( "waitingprefix" );
	if( count > 0 ) {
		var countdownSecs = count % 60;
		count = Math.floor( count / 60 );
		countdownText = countdownSecs + "s";
		var countdownMins = count % 60;
		count = Math.floor( count / 60 );
		if ( countdownMins ) {
			countdownText = countdownMins + "m " + countdownText;
		}
		var countdownHours = count % 24;
		count = Math.floor( count / 24 );
		if ( countdownHours ) {
			countdownText = countdownHours + "h " + countdownText;
		}
		var countdownDays = count;    
		if ( countdownDays ) {
			countdownText = countdownDays + " days " + countdownText;
		}
		if ( waitingPrefix ) {
			countdownText = waitingPrefix + countdownText;
		}
	} else {
		var elapsedMessage = objCountdown.getAttribute( "elapsedmessage" );
		countdownText = elapsedMessage ? elapsedMessage : "elapsed!";
	}
	var prefix = objCountdown.getAttribute( "prefix" );
	objCountdown.innerHTML = ( prefix ? prefix : "" ) + countdownText;
	setTimeout( "countdown()", 1000 );
	return true;
}

function initCountdown( objIdCountdown ) {	
	objCountdown = document.getElementById( objIdCountdown );
	countdown();
}
