// Setup XML handling variables
var xmlHttp = getXmlHttpObject();
var xmlDoc = null;

//Mozilla emulator for innerText
try {
  HTMLElement.prototype.__defineGetter__("innerText",
			  function () { return(this.textContent); });
  HTMLElement.prototype.__defineSetter__("innerText",
			  function (txt) { this.textContent = txt; });
} catch (e) {;}

var globalResourceState;
var globalUserState;
var globalAccessRule;
var globalModerationState;

/******************************************************************************
* AJAX Functions                                                                                                                              *
******************************************************************************/
// Retrives states of the 4 global variables above using AJAX
// Passess control over to parseAndHandleStates()
function getStates() {
	// sendUrl should be set by the jsp
	sendServerXML("/services/resources/resource-access", parseAndHandleStates, sendUrl);
}


//Loads XML DOM with XML file from passed parameters
function sendServerXML(URLpath, callFunc, url) {
	var url = "http://" + document.domain + addPort() + URLpath + "?url=" + url + "&format=xml";
	var func = callFunc.toString().replace( /"/ig, "'" ) ;
	try {
		//Internet Explorer
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		eval("xmlDoc.onreadystatechange = function () {if (xmlDoc.readyState == 4) { var r = " + func + "(); }}");
	} catch(e) {
		try	{
			//Firefox, Mozilla, Opera, etc.
			xmlDoc=document.implementation.createDocument("","",null);
			xmlDoc.async=false;
			xmlDoc.onload = callFunc;
		} catch(e) {
			alert('Your browser must be XML compatible: ' + e.message);
			return;
		}
	}
	xmlDoc.load(url);
}


// Render the page appropriately based on the 4 global variables above
function parseAndHandleStates() {
	var errorCaptured = false;
	// Error handler, handles and displays any error XML returned by server
	// Retrieve XML for IE
	if (typeof window.ActiveXObject != 'undefined' ) {
		try {
			var errorCode = xmlDoc.getElementsByTagName("resp/error").item(0).attributes.getNamedItem("code").nodeValue;
			var messageText = xmlDoc.getElementsByTagName("resp/error").item(0).attributes.getNamedItem("message").nodeValue;
			errorCaptured = true;
			//alert("Error Code: " + errorCode + ", " + messageText);
		} catch (e) {;}
	} else {
		try {
			// Retrieve XML for Mozilla
			var resp = xmlDoc.firstChild.childNodes[0].nodeValue;
			var errorCode = xmlDoc.childNodes[0].childNodes[1].getAttribute("code");
			var messageText = xmlDoc.childNodes[0].childNodes[1].getAttribute("message");

			if (errorCode != null) {
				//alert("Error Code: " + errorCode + ", " + messageText);
				errorCaptured = true;
			}
		} catch(e) {
			// Retrieve XML for Safari
			var errorCode = docObj.firstChild.childNodes[1].getAttribute("code");
			var messageText = docObj.firstChild.childNodes[1].getAttribute("message");
			if (errorCode != null) {
				//alert("Error Code: " + errorCode + ", " + messageText);
				errorCaptured = true;
			}
		}
	}

	if (errorCaptured == false) {
		// Capture user authentication/state variables
		if (typeof window.ActiveXObject != 'undefined' ) {
			var userState = xmlDoc.getElementsByTagName("resource_access/user_state")[0];
			var accessRule = xmlDoc.getElementsByTagName("resource_access/access_rule")[0];
			var resourceState = xmlDoc.getElementsByTagName("resource_access/resource_state")[0];
			globalModerationState = xmlDoc.getElementsByTagName("resource_access/moderation_state")[0];
		} else {
			var domObjParser=new DOMParser();
			var docObj=domObjParser.parseFromString(xmlHttp.responseText,"text/xml");

			try {
				var resp = xmlDoc.firstChild;
				var resourceAccess = resp.childNodes[1];
				var userState = resourceAccess.childNodes[1];
				var accessRule = resourceAccess.childNodes[3];
				var resourceState = resourceAccess.childNodes[5];
				globalModerationState = resourceAccess.childNodes[7];
			}
			catch (e) {
				var resp = docObj.firstChild;
				var resourceAccess = resp.childNodes[1];
				var userState = resourceAccess.childNodes[1];
				var accessRule = resourceAccess.childNodes[3];
				var resourceState = resourceAccess.childNodes[5];
				globalModerationState = resourceAccess.childNodes[7];
			}
		}


		globalResourceState = resourceState.childNodes[0].nodeValue;
		globalUserState = userState.childNodes[0].nodeValue;
		globalAccessRule = accessRule.childNodes[0].nodeValue;
	}
	initialisePageDisplay();
}

function initialisePageDisplay() {
	var closed       = (globalResourceState != "OPEN")?true:false;
	var userAuth     = (globalUserState == "AUTHENTICATED")?true:false;
	var authRequired = (globalAccessRule == "AUTHENTICATED")?true:false;

	hideMe("writeCommentLink");
	showMe("listComments");
	if (closed) {
		/* Display comments closed message  */
		hideMe("commentsLogin");
		showMe("commentsClosed");
		hideMe("postCommentForm");
		hideMe("postCommentThanks");
	} else if (!userAuth && authRequired) {
		showMe("commentsLogin");
		hideMe("commentsClosed");
		hideMe("postCommentForm");
		hideMe("postCommentThanks");
	} else {
		/* if ((!userAuth && !authRequired) || (userAuth && !authRequired) || (userAuth && authRequired)) */
		hideMe("commentsLogin");
		hideMe("commentsClosed");
		showMe("postCommentForm");
		hideMe("postCommentThanks");
	}
}

// Asynchronously post form to server
// Sets XML DOM variable depending on browser
function submitForm(form, URLpath, callFunc) {
	// Disable submit form buttons
	disableCommentForm();
	xmlHttp.open("POST", URLpath,  true);
	xmlHttp.onreadystatechange = submitStateChanged;
	var xmlMessage = buildPOST(form);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xmlHttp.send(xmlMessage);
}

/* This code is for omniture track specifically for tracking the successful post of a review on the button that fires the AJAX post*/
function trackMe() {
	var s=s_gi(s_account);
	s.trackingServer='webstat.channel4.com';
	s.linkTrackVars='events,prop26,eVar26';
	s.linkTrackEvents='event26';
	s.events='event26';
	s.prop26 = "event26";
	s.tl(this,'o','Comment');
}


function submitStateChanged() {
	switch (xmlHttp.readyState) {
	case 0:
		//uninitialized
		break;
	case 1:
		//loading
		break;
	case 2:
		//loaded
		break;
	case 3:
		//interactive
		break;
	case 4:
		//complete
		returnCommentsRequest(xmlHttp.responseXML);
		break;
	default: 
		document.getElementById("generalError").innerHTML = "An unexpected error occured.  Please try again later.<br />";
		enableCommentForm();
		break;
	}
}


// Callback function, checks for and displays error messages
function returnCommentsRequest(xmlDoc) {
	// Checks returned XML to see if posted form has any "errors" or is "ok"
	var resp = xmlDoc.getElementsByTagName("resp").item(0).attributes.getNamedItem("status").nodeValue;
	// Check for returned XML error response
	if (resp == "error") {
		var errorList = commentsGetElementsByClassName("errorMessage", document.body);
		var formErrors;
		if (typeof window.ActiveXObject != "undefined" ) {
			formErrors = xmlDoc.getElementsByTagName("resp/error");
		} else {
			formErrors = xmlDoc.getElementsByTagName("error");
		}
		if (formErrors.length > 0) {
			for (var i=0; i<errorList.length; i++) {
				errorList[i].innerHTML = "";
			}
		
			for (var i=0; i < formErrors.length; i++) {
				errorCode = formErrors.item(i).attributes.getNamedItem("code").nodeValue;
				messageText = formErrors.item(i).attributes.getNamedItem("message").nodeValue;
				try {
					parameter = formErrors.item(i).attributes.getNamedItem("parameter").nodeValue;
					errorID = parameter + "Error";
					document.getElementById(errorID).innerHTML = messageText;
				}  catch(e) {
					document.getElementById("generalError").innerHTML += messageText + "<br />";
				}
			}
			enableCommentForm();
		}

	// Check for returned XML OK response
	} else if (resp == "ok") {
		//Omnitiure tracking
		trackMe();
		hideMe("postCommentForm");
		showMe("postCommentThanks");
	} else {
		//Any unhandled errors
		enableCommentForm();
	}
}

// Adds port number to URL
function addPort() {
var port = window.location.port;
	if ((port == "") || (port == "undefined")) {return("");} else {
	return(":" + port);
	}
}

// Clears contens of HTML object, equivalent to innerHTML=""
function clearContent(el) {
	nEl = el.cloneNode(false);		// first clone the object, without it’s child elements.
	el.parentNode.insertBefore(nEl,el);	// Pop the new element in before the old one.
	el.parentNode.removeChild(el);		// Now get rid of the one that has all that icky content
}


// Dynamically construct form to be posted to server
function buildPOST(theFormName) {
    theForm =  document.getElementById(theFormName);
    var qs = '';
    for (e=0;e<theForm.elements.length;e++) {
        if (theForm.elements[e].name!='') {
            var name = theForm.elements[e].name;
            qs+=(qs=='')?'':'&';
            qs+= name+'='+escape(theForm.elements[e].value);
        }
    }
    qs+="\n";
    return qs
}

/******************************************************************************
* Non-AJAX Functions                                                                                                                      *
******************************************************************************/
// Textarea character counter
function updateCounter(inputObj, counterObj, limit) {
	// Dynamically builds object (textarea) variable
	// this is done to cope with multiple objects with the same ID in different forms
	inputForm = inputObj.form;
	var counterObj = eval("document." + inputForm.name + "." + counterObj);
	var thisObj = eval("document." + inputForm.name + "." + inputObj.name);
	var textAreaObj =  eval("document." + inputForm.name + "." + counterObj.id);	

	if (parseInt(limit) - parseInt(thisObj.value.length) >=0) {
		thisObj.style.color = "#000";
	} else {
		thisObj.style.color = "#f00";
	}
	textAreaObj.value = parseInt(limit) - parseInt(thisObj.value.length);
}


// Sets checkbox value for server
// Replaces true/false values by y/n for use with user anonymous service
function setCheckBoxValue(thisObj) {
	if (thisObj.checked == true){thisObj.value = "y";} else {thisObj.value = "n";}
}


function hideMe(id) {
	/*document.getElementById(id).style.display = 'none';*/
	try {
		document.getElementById(id).className = "hide";
	} catch(e) {
		//do nothing
	}
}

function showMe(id) {
	/*document.getElementById(id).style.display = 'block';*/
	try {
		document.getElementById(id).className = "show";
	} catch(e) {
		//do nothing
	}
}

// Gets all elements with a certain class name in an array
function commentsGetElementsByClassName(classname, node) {
	if(!node) {
		node = document.getElementsByTagName("body")[0];
	}
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
	if(re.test(els[i].className))a.push(els[i]);
	return a;
}


// Parameters:
//   url - string to search through representing a complete url containing name value pairs separated by & (assumes that ? exists in the url)
//   param - string to find in url
// Returns: the first value of the parameter with name param, else null
function getParamValue(url,param) {
	if (url.length > 0) {
		decUrl = decodeURIComponent(url);
		decUrl = decUrl.substring(decUrl.indexOf("?")+1, decUrl.length);
		var decUrlArray = decUrl.split("&");
		for (var i = 0; i <= decUrlArray.length - 1; i++) {
			var left = decUrlArray[i].substring(0, decUrlArray[i].indexOf("="));
			var right = decUrlArray[i].substring(decUrlArray[i].indexOf("=") + 1, decUrl.length);
			if (param == left) {
				return right;
			}
		}
	}
	return null;
}


function getXmlHttpObject() {
	// Create the XMLHTTPRequest object
	var xmlHttp;
	try {
		// Firefox, Opera 8.0+, Safari + others
		xmlHttp=new XMLHttpRequest();
	} catch (e) {
		// Internet Explorer
		try {
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				// IE5 and IE6
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}
	return xmlHttp;
}

function disableCommentForm() {
	document.getElementById("postCommentSubmit").disabled = true;
//	document.getElementById("commentForm").disabled = true;
}

function enableCommentForm() {
	document.getElementById("postCommentSubmit").disabled = false;
//	document.getElementById("commentForm").disabled = false;
}
