/**
 * GetXMLHttpObject is a fast way of getting the xmlHttp object we need for all AJAX requests
 */
function GetXmlHttpObject() {
	var xmlHttp=null;
	try { // Firefox, Opera, Safari
	  xmlHttp=new XMLHttpRequest();
	}
	catch (e) { // Internet Explorer
	  try {
	    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
	  }
	  catch (e) {
	    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	  }
	}
	return xmlHttp;
}

/**
 * GetTextValue is a simple way of getting the value of a text field, given the id of the text field.
 * This works for textareas and hidden fields as well.
 */
function GetTextValue(ID) {
    return document.getElementById(ID).value;
}

/**
 * GetCheckboxValue checks wether or not a checkbox has been checked, given the id of the checkbox.
 * Returns true or false
 */
function GetCheckboxValue(ID) {
    return document.getElementById(ID).checked;
}

/**
 * GetRadioValue is a bit trickier. To make this work, the radiobuttons MUST be in some kind of container (div, p, span etc).
 * Will return the value of the slected radiobutton given the containerID.
 * Note that only one radiobutton group is allowed in the container for this to work.
 */
function GetRadioValue(ID) {
    var radios = document.getElementById(ID);
    if(radios) {
        var inputs = radios.getElementsByTagName('input');
        if(inputs) {
            for(var i = 0; i < inputs.length; ++i) {
            if (inputs[i].type == 'radio' && inputs[i].checked)
                return inputs[i].value;
            }
        }
    }
    return "";
}

/**
 * GetSelectValue returns the value of a selected drop-down option in a <select> group, given the selects' id
 */
function GetSelectValue(ID) {
    var obj = document.getElementById(ID);
    var n = obj.selectedIndex;
    return obj[n].text;
}

/**
 * NoAJAXSupport adds an errorbox to the start of the element passed on via. it's ID
 */
function NoAJAXSupport(ID) {
    var container = document.getElementById(ID);
    var errorDiv = document.createElement('div');
    errorDiv.innerHTML = NoAJAXSupportString;
    errorDiv.className = "noAJAXError";
    container.insertBefore(errorDiv, container.firstChild);
}

/*******************************************************************************************************
 * AJAX submit functions - these will submit different data in different forms. 
 *******************************************************************************************************/

/**
 * Tip Editors Form
 */
function tipEditorsForm(FormID) {
  /*
   * Get the values from our fields
   */
  var email = $(FormID + '_fieldReplyEmail');
  var message = $(FormID + '_fieldMessage');
  var cid = $(FormID + '_fieldCid');  
  var name = $(FormID + '_fieldName');
  var linkUrl = $(FormID + '_fieldUrl');
  var replyTo = $(FormID + '_fieldCid');
  var captcha = $(FormID + '_fieldCaptcha');
  
  var captchaImg = $(FormID + '_captchaImage');
  var processingBar = $(FormID + '_loading');
  var done = $(FormID + "_done");
  var notDone = $(FormID + "_notdone");
  var errorMessage = $(FormID + "_errorMessage");
  
  var captchaValue = "";
  
  if(captcha != null)
	  captchaValue = captcha.value;
  
  /*
   * Set up the request parameters. We include sid to make sure that no browsercaching bugs our system 
   */
	var url="/ajax/tipeditors";
	url=url+"?sid="+Math.random();

	var myAjax = new Ajax.Request(url, {
		parameters: {
		  replyTo: email.value,
		  message: message.value,
		  name: name.value,
		  url: linkUrl.value,
		  cid: cid.value,
		  captcha: captcha.value
		},
		onLoading: function(){ processingBar.show() },
		onSuccess: function(transport){
				var responseXML = transport.responseXML || "no response text";
				var status = responseXML.getElementsByTagName("status")[0].childNodes[0].nodeValue;
				var responseText = responseXML.getElementsByTagName("response-text")[0].childNodes[0].nodeValue;
				var returnMessage = responseXML.getElementsByTagName("return-message")[0].childNodes[0].nodeValue;
				if(status == "ERROR") {
					errorMessage.show();
					errorMessage.innerHTML = returnMessage;
					done.hide();
					processingBar.hide();
					captchaImg.src = captchaImg.src + '?' + (new Date()).getTime();
					captcha.innerHTML = "";
				}else{
					email.value = "";
					message.value = "";
					name.value = "";
					linkUrl.value = "";
					errorMessage.innerHTML = "";
					captcha.innerHTML = "";
					errorMessage.hide();
					processingBar.hide();
					notDone.hide();
					done.appear();
				}
	
	},
		onFailure: function(){ alert('Something went wrong...') }
	});
}


/**
 * News Letter Form Ajax Code
 */
function newsletterForm(FormID) {
	/*
	 * Get the values from our fields
	 */
	var email = $(FormID + '_fieldEmail');
	var form = $(FormID + '_fieldForm');
	var cid = $(FormID + '_fieldCid');  
	var type = ($(FormID + '_fieldTypeRadio') != null) ? $(FormID + '_fieldTypeRadio') : $(FormID + '_fieldTypeHidden');
	
	var processingBar = $(FormID + '_loading');
	var done = $(FormID + "_done");
	var notdone = $(FormID + "_notdone");
	var errorMessage = $(FormID + "_errorMessage");

    /*
     * Set up the request parameters. We include sid to make sure that no browser caching bugs our system 
     */
	var url="/ajax/newslettersubscription";
	url=url+"?sid="+Math.random();

	var myAjax = new Ajax.Request(url, {
		parameters: {
		  email: email.value,
		  form:  form.value,
		  type:  type.value,
		  cid:	 cid.value
		},
		onLoading: function(){ processingBar.show() },
		onSuccess: function(transport){
				var responseXML = transport.responseXML || "no response text";
				
				var status = responseXML.getElementsByTagName("status")[0].childNodes[0].nodeValue;
				var responseText = responseXML.getElementsByTagName("response-text")[0].childNodes[0].nodeValue;
				var returnMessage = responseXML.getElementsByTagName("return-message")[0].childNodes[0].nodeValue;
				if(status == "ERROR") {
					errorMessage.show();
					errorMessage.innerHTML = returnMessage;
					done.hide();
					processingBar.hide();
				}else{
					errorMessage.innerHTML = "";
					errorMessage.hide();
					processingBar.hide();
					notdone.hide();
					done.appear();
				}
		},
		onFailure: function(){ alert('Something went wrong...') }
	});
}

/**
 * Email a friend Ajax code
 */
function emailToFriendForm(FormID) {
    /*
     * Get the values from our fields
     */
	var name = $(FormID + '_fieldName');
	var cid = $(FormID + '_fieldCid');  
	var emailTo = $(FormID + '_fieldEmailTo');
	var message = $(FormID + '_fieldMessage');	
	var linkUrl = $(FormID + '_fieldUrl');
	
	message = message ? message.value : "";
	
	var processingBar = $(FormID + '_loading');
	var done = $(FormID + "_done");
	var notDone = $(FormID + "_notdone");	
	var errorMessage = $(FormID + "_errorMessage");

    /*
     * Set up the request parameters. We include sid to make sure that no browser caching bugs our system 
     */
	var url="/ajax/emailtofriend";
	url=url+"?sid="+Math.random();
	
	var myAjax = new Ajax.Request(url, {
		parameters: {
		  name: name.value,
		  emailTo: emailTo.value,
		  message: message,
		  cid: cid.value,
		  url: linkUrl.value
		},
		onLoading: function(){ processingBar.show() },
		onSuccess: function(transport){
				var responseXML = transport.responseXML || "no response text";
				//alert(transport.responseText);
				var status = responseXML.getElementsByTagName("status")[0].childNodes[0].nodeValue;
				var responseText = responseXML.getElementsByTagName("response-text")[0].childNodes[0].nodeValue;
				var returnMessage = responseXML.getElementsByTagName("return-message")[0].childNodes[0].nodeValue;
				if(status == "ERROR") {
					errorMessage.show();
					errorMessage.innerHTML = returnMessage;
					done.hide();
					processingBar.hide();
				}else {
					processingBar.hide();
					done.show();
					notDone.hide();
					errorMessage.innerHTML = "";
					errorMessage.hide();
				}
		},
		onFailure: function(){ alert('Something went wrong...') }
	});
}

/**
 * Poll Form Ajax Code
 */
function pollForm(FormID) {
    /*
     * Get the values from our fields
     */
	var vote = $(FormID + '_selectedRadio');
	var pollId = $(FormID + '_fieldPollId');
	var cid = $(FormID + '_fieldCid');
	
	var processingBar = $(FormID + "_loading");
	var notdone = $(FormID + "_notdone");
	var backToVoteLink = $(FormID + "_backToVoteLink");
	var done = $(FormID + "_done");    
	var errorNoVote =  $(FormID + "_errorNoVote");
	var errorAlreadyVoted =  $(FormID + "_errorAlreadyVoted");
	var errorGeneral =  $(FormID + "_errorGeneral");	
	
    /*
     * Set up the request parameters. We include sid to make sure that no browsercaching bugs our system 
     */
    var url="/ajax/poll";
    url=url+"?sid="+Math.random();
	var myAjax = new Ajax.Request(url, {
		parameters: {
		  vote:   vote.value,
		  pollId: pollId.value,
		  cid: cid.value
		},
		onLoading: function(){ processingBar.appear() },
		onSuccess: function(transport){
				var responseXML = transport.responseXML || "no response text";
				var responseType = responseXML.getElementsByTagName("response-type")[0].childNodes[0].nodeValue;
				var responseText = responseXML.getElementsByTagName("response-text")[0].childNodes[0].nodeValue;		
 				if(responseType == "OK") {
					processingBar.hide();
					notdone.hide();
					backToVoteLink.hide();
					done.show();
					
					errorNoVote.hide();
					errorAlreadyVoted.hide();
					errorGeneral.hide();
				}else{
					if (responseText=="voteDone") {
						errorNoVote.show();
					}else if (responseText=="AlreadyVoted") {
						errorAlreadyVoted.show();
					}else if (responseText=="generalError") {
						errorGeneral.show();
					}
					processingBar.hide();
				}
		},
		onFailure: function(){ alert('Something went wrong...') }
	});
}

function tellaFriendtoggle(tellaFriendDiv) {
	var tellaFriendDiv = $(tellaFriendDiv);
	if (tellaFriendDiv.style.display=="none"){
		tellaFriendDiv.appear();
	}
	else {
		tellaFriendDiv.hide();	
	}
}

function forumNewThreadForm(FormID) {
	var title = $(FormID + '_fieldTitle');
	var body = $(FormID + '_fieldBody');
	var action = $(FormID + '_fieldAction');
	var forum = $(FormID + '_fieldForum');
	var cid = $(FormID + '_fieldCid');
	
	var processingBar = $(FormID + "_loading");
	var notdone = $(FormID + "_notdone");
	var done = $(FormID + "_done");
	var errorMessage = $(FormID + "_errorMessage");

	var url="/ajax/forum";
	url = url+"?sid="+Math.random();
	var myAjax = new Ajax.Request(url, {
		parameters: {
		  action: escape(action.value),
		  forum: escape(forum.value),
		  cid: escape(forum.value),
		  title: escape(title.value),
		  body: escape(body.value)
		},
		onLoading: function(){ processingBar.appear(); },
		onSuccess: function(transport){
			var responseXML = transport.responseXML || "no response text";
			var status = responseXML.getElementsByTagName("status")[0].childNodes[0].nodeValue;
			var responseText = responseXML.getElementsByTagName("response-text")[0].childNodes[0].nodeValue;
			var returnMessage = responseXML.getElementsByTagName("return-message")[0].childNodes[0].nodeValue;
			if(status == "ERROR") {
				errorMessage.show();
				errorMessage.innerHTML = returnMessage;
				done.hide();
			}else{
				errorMessage.innerHTML = "";
				errorMessage.hide();
				notdone.hide();
				done.appear();
			}
			processingBar.hide();
		},
		onFailure: function(){ alert('Something went wrong...') }
	});	
}

function forumNewPostingForm(FormID) {
	var body = $(FormID + '_fieldBody');
	var action = $(FormID + '_fieldAction');
	var thread = $(FormID + '_fieldThread');
	var cid = $(FormID + '_fieldCid');
	
	var processingBar = $(FormID + "_loading");
	var notdone = $(FormID + "_notdone");
	var done = $(FormID + "_done");
	var errorMessage = $(FormID + "_errorMessage");

	var url="/ajax/forum";
	url = url+"?sid="+Math.random();
	var myAjax = new Ajax.Request(url, {
		parameters: {
		  action: escape(action.value),
		  thread: escape(thread.value),
		  body: escape(body.value),
		  cid: cid.value
		},
		onLoading: function(){ processingBar.appear(); },
		onSuccess: function(transport){
				var responseXML = transport.responseXML || "no response text";
				
				var status = responseXML.getElementsByTagName("status")[0].childNodes[0].nodeValue;
				var responseText = responseXML.getElementsByTagName("response-text")[0].childNodes[0].nodeValue;
				var returnMessage = responseXML.getElementsByTagName("return-message")[0].childNodes[0].nodeValue;
				if(status == "ERROR") {
					errorMessage.show();
					errorMessage.innerHTML = returnMessage;
					done.hide();
				}else{
					errorMessage.innerHTML = "";
					errorMessage.hide();
					notdone.hide();
					done.appear();
				}
				processingBar.hide();

		},
		onFailure: function(){ alert('Something went wrong...') }
	});	
}


/*******************************************************************************************************
 * AJAX get fucntions - these will get different data from the system.
 *******************************************************************************************************/

function GetComments(articleID, firstPost, lastPost, sorting, backend, limit) {
    xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null){
        NoAJAXSupport(FormID);
       return;
    }
    var params = "action=retrieve&article="+articleID+"&first="+firstPost+"&last="+lastPost+"&sorting="+sorting;
    var url="/"+backend;
    url=url+"?sid="+Math.random();
    xmlHttp.open("POST",url,true);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    /*
     * Set up the method to handle our response
     */
    xmlHttp.onreadystatechange = function() {
        if(xmlHttp.readyState == 4) {
            setContent('comments_container', "");
            var xmlDoc=xmlHttp.responseXML.documentElement;
            if(xmlDoc.getElementsByTagName('response-type')[0].childNodes[0].nodeValue == 'ok') {
                var e = 0;
                var styleClass;
                var author;
                var time;
                var body;
                var html;
                var comments = xmlDoc.getElementsByTagName('comment');
                for(var i = 0; i < comments.length; i++) {
                    styleClass = (e == 0) ? 'even' : 'uneven';
                    e = (e == 0) ? 1 : 0;
                    html = '<div class="'+styleClass+'">';
                    author = comments[i].getElementsByTagName('author')[0].childNodes[0].nodeValue;
                    time = comments[i].getElementsByTagName('time')[0].childNodes[0].nodeValue;
                    body = comments[i].getElementsByTagName('body')[0].childNodes[0].nodeValue;
                    html = html + '<div class="author">'+author+'</div>';
                    html = html + '<div class="time">'+time+'</div>';
                    html = html + '<div class="body">'+body+'</div></div>';
                    setContent('comments_container', getContent('comments_container')+html);
                }
                
                var num = xmlDoc.getElementsByTagName("amount")[0].childNodes[0].nodeValue;
                var first = xmlDoc.getElementsByTagName("firstPost")[0].childNodes[0].nodeValue;
                var last = xmlDoc.getElementsByTagName("lastPost")[0].childNodes[0].nodeValue;
                var older = xmlDoc.getElementsByTagName("older")[0].childNodes[0].nodeValue;
                var newer = xmlDoc.getElementsByTagName("newer")[0].childNodes[0].nodeValue;
                var showing = xmlDoc.getElementsByTagName("showing")[0].childNodes[0].nodeValue;
                var newFirst;
                var newLast;
                var linkName;
                var divToUse;
                
                setContent('comments_total_top', showing);
                show('comments_total_top');
                
                if(parseInt(first) > 0) {
                    newFirst = parseInt(first) - parseInt(limit);
                    if(newFirst < 0)
                       newFirst = 0;
                    newLast = newFirst + parseInt(limit);
                    
                    linkName = (sorting == 'desc') ? newer : older;
                    
                    setContent('comments_prev', '<span class="linkLook" onclick="GetComments(\'' + articleID + '\', \'' +newFirst+ '\', \'' +newLast+ '\', \'' +sorting+ '\', \'' +backend+ '\', \'' +limit+ '\');">&laquo; '+linkName+'</span>');
                    show('comments_prev');
                }
                
                if(parseInt(num) > parseInt(last)) {
                    newLast = parseInt(last)+parseInt(limit);
                    if(newLast > num)
                       newLast = num;
                    newFirst = newLast - parseInt(limit);
                    
                    linkName = (sorting == 'desc') ? older : newer;
                    
                    setContent('comments_next', '<span class="linkLook" onclick="GetComments(\'' + articleID + '\', \'' +newFirst+ '\', \'' +newLast+ '\', \'' +sorting+ '\', \'' +backend+ '\', \'' +limit+ '\');">'+linkName+' &raquo;</span>');
                    show('comments_next');
                }
            }
            else
                show(FormID + "_error" + xmlDoc.getElementsByTagName("response-text")[0].childNodes[0].nodeValue);
            hide('comments_loading'); 
        }
        else
            show('comments_loading');
    }
    /*
     * Send the request
     */
    xmlHttp.send(params);
    
    /*
     * We hide the errors when a person re-submits to give a better feel
     */
    hide('comments_generalError', 'comments_next', 'comments_prev');
    return false;
}

function SortComments(way) {       
    if(way == 'asc') {
        GetComments(articleId, 0, limit, way, backend, limit);
        hide('comments_sorting_asc');
        show('comments_sorting_desc');
    }
    else {
        GetComments(articleId, 0, limit, way, backend, limit);
        hide('comments_sorting_desc');
        show('comments_sorting_asc');
    }
}
function GetCommentsNum(articleID, backend) {
return false;
}
function _GetCommentsNum(articleID, backend) {
    xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null){
        NoAJAXSupport(FormID);
       return;
    }
    var params = "action=num&article="+articleID;
    var url="/"+backend;
    url=url+"?sid="+Math.random();
    /*
     * Set up the method to handle our response
     */
    xmlHttp.onreadystatechange = function() { 
        if(xmlHttp.readyState == 4) {
            var xmlDoc=xmlHttp.responseXML.documentElement;
            var num = xmlDoc.getElementsByTagName("amount")[0].childNodes[0].nodeValue;
            if(!isNumeric(num) || num < 1)
                show('comments_noComments');
            else {
                if(sorting == 'ASC')
                    show('comments_sorting_desc');
                else
                    show('comments_sorting_asc');
                show('comments_container');
                     
                GetComments(articleId, firstpost, limit, sorting, backend, limit);
            }
        }
    }
    /*
     * Send the request
     */
    xmlHttp.open("POST",url,true);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.send(params);
}
