//ajax.js  - to be inluded on every page that uses ajax to access data

//Define global variables
var request;			//XMLHTTML Object - the ajax connection
var div_id;				//Id of the div tag in which the returned response will be stored
var i;					//counting variable


	try {
		request = new XMLHttpRequest();
	} catch (trymicrosoft) {
		try {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (othermicrosoft) {
		  try {
		  	request = new ActiveXObject("Microsoft.XMLHTTP");
		  } catch (failed) {
			request = false;
		  }
		}
	  }
if (!request)
     alert("Error initializing XMLHttpRequest!");

/*This function is called everytime an ajax request is made.
	-method: POST or GET
	-url: location of the server side script
	-id: id of the HTML element where the response will be stored */
function QueryServer(method, url, id, mode, parameters)
{
	div_id = id;					//store ID as global var so other functions can access it
	var parameter_str = null;
	if(mode == "CategoriesMenu") {
		$selected = document.getElementById("categories-menu-view").value;
		url += "&id=" + $selected;
	}
	if(mode == "OrderByMenu") {
		$selected = document.getElementById("orderby").value;
		url += "&orderby=" + $selected;
	}
	if(mode == "FGamesMenu") {
		$selected = document.getElementById("add_game").value;
		url += "&id=" + $selected;
		
	}
	if(mode == "MoveMenu") {
		$selected = document.getElementById("categories-menu-view").value;
		url += "&id=" + $selected;
	}
	//open a connection to the server
	request.open(method, url, true);
	if(method == 'POST') {			//if the method is POST, set headers and parameter string
		parameter_str = EncodePOSTParameters(parameters);
		request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	request.setRequestHeader("Content-length", parameters.length);
		request.setRequestHeader("Connection", "close");
	}
	
	//When the server is done set the function according to the mode
	if(mode == "HTML_switch") request.onreadystatechange = SetHTMLSwitchVisible;
	if(mode == "HTML_normal") request.onreadystatechange = SetHTML;
	if(mode == "CatUpdate") request.onreadystatechange = CatUpdate;
	if(mode == "PrintCategories") request.onreadystatechange = SetHTML;
	if(mode == "UpdateCategory") request.onreadystatechange = CatUpdate;
	if(mode == "Link") request.onreadystatechange = LinkUpdate;
	if(mode == "CategoriesMenu") request.onreadystatechange = SetHTML;
	if(mode == "FGamesMenu") request.onreadystatechange = SetHTML;
	if(mode == "OrderByMenu") request.onreadystatechange = SetHTML;
	if(mode == "MoveMenu") request.onreadystatechange = MoveMenu;
	if(mode == "ArticleUpdate") request.onreadystatechange = ArticleUpdate;
	if(mode == "Index") request.onreadystatechange = IndexUpdate;
	if(mode == "Moderators") request.onreadystatechange = ModsUpdate;
	
	//Send the request
	request.send(parameter_str);
}

//Build a string containing all POST parameters
function EncodePOSTParameters(obj) {
	 var getstr = "";
      for (i=0; i<obj.elements.length; i++) {
         if (obj.elements[i].tagName == "INPUT") {		//check that the tag is an input
            if (obj.elements[i].type == "text") {			//
               getstr += obj.elements[i].name + "=" + obj.elements[i].value + "&";
            }
            if (obj.elements[i].type == "checkbox") {
               if (obj.elements[i].checked) {
                  getstr += obj.elements[i].name + "=" + obj.elements[i].value + "&";
               } else {
                  getstr += obj.elements[i].name + "=&";
               }
            }
            if (obj.elements[i].type == "radio") {
               if (obj.elements[i].checked) {
                  getstr += obj.elements[i].name + "=" + obj.elements[i].value + "&";
               }
            }
         }   
         if (obj.elements[i].tagName == "SELECT") {
            var sel = obj.elements[i];
            getstr += sel.name + "=" + sel.options[sel.selectedIndex].value + "&";
         }
		 if (obj.elements[i].tagName == "TEXTAREA") {
           	getstr += obj.elements[i].name + "=" + obj.elements[i].value + "&";
         }
         
      }
	  return getstr;
}

//Same as SetHTML with one added feature: if this function is called
//	from an onclick event, the contents of a div will switch between
//	blank and the response.
function SetHTMLSwitchVisible() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		//expand/collapse the content
		if(document.getElementById(div_id).innerHTML == "") {
			document.getElementById(div_id).innerHTML = request.responseText;
		} else {
			document.getElementById(div_id).innerHTML = "";
		}
	}
}

//Fill a div tag with the server response 
function SetHTML() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		document.getElementById(div_id).innerHTML = "";
		document.getElementById(div_id).innerHTML = request.responseText;
	}
}

//Refreshes the page so that all information is up to date after
//	a category is updated
function CatUpdate() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		if(request.responseText == false) alert('There was an error while attempting to change this link');
		else {
			// Update the page
			var output = request.responseText.split("|SPLIT|");
			document.getElementById('categories-main').innerHTML = output[0];
			document.getElementById('categories-inactive').innerHTML = output[1];
			document.getElementById('edit-area').innerHTML = output[2];
		}
	}
}
//Refreshes the page so that all information is up to date after
//	changes are made to a link such as edited, deleted or added
function LinkUpdate() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		if(request.responseText == false) alert('There was an error while attempting to change this category');
		else {
			// Update the page
			var output = request.responseText.split("|SPLIT|");
			document.getElementById('links-approve').innerHTML = output[0];
			document.getElementById('link-outer').innerHTML = output[1];
			document.getElementById('edit-area').innerHTML = output[2];
		}
	}
}
//Refreshes the page so that all information is up to date after
//	changes are made to an article such as edited, deleted or added
function ArticleUpdate() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		if(request.responseText == false) alert('There was an error while attempting to change this article');
		else {
			// Update the page
			var output = request.responseText.split("|SPLIT|");
			document.getElementById('article-display').innerHTML = output[0];
			document.getElementById('edit-area').innerHTML = output[1];
		}
	}
}

function IndexUpdate() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		if(request.responseText == false) alert('There was an error while attempting to change this article');
		else {
			// Update the page
			var output = request.responseText.split("|SPLIT|");
			document.getElementById('index-unapproved-links').innerHTML = output[0];
			document.getElementById('index-unapproved-articles').innerHTML = output[1];
			document.getElementById('edit-area').innerHTML = output[2];
		}
	}
}

function ModsUpdate() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		if(request.responseText == false) alert('There was an error while attempting to add/edit this moderator\'s details');
		else {
			// Update the page
			var output = request.responseText.split("|SPLIT|");
			document.getElementById('display-moderators').innerHTML = output[0];
			document.getElementById('edit-area').innerHTML = output[1];
		}
	}
}

function MoveMenu() {
	//only update if server has finished sending the response
	if(request.readyState == 4 && request.status == 200)
	{
		if(request.responseText == false) alert('There was an error while attempting to move this category');
		else {
			// Update the page
			var output = request.responseText.split("|SPLIT|");
			document.getElementById('categories-main').innerHTML = output[0];
			document.getElementById('categories-inactive').innerHTML = output[1];
			document.getElementById('edit-area').innerHTML = output[2];
			document.getElementById('parent-menu').innerHTML = "";
		}
	}
}