// State Variables
var userId;
var bookList; // response from server
var title = new Array();
var author = new Array();
var isbn = new Array();
var price = new Array(); // Associative Array

// Paging Variables
var itemsPerPage = 8;
var pageNum = 1;
var totalNumOfItems;
var numOfPages;
var numOfPagesPerSlice = 5;

// Progress Variables
var numOfElements; // number of elements on a given page
var pricesPending;

// Ajax Objects
var ajaxObj0;
var ajaxObj1;
var ajaxObj2;
var ajaxObj3;
var ajaxObj4;
var ajaxObj5;
var ajaxObj6;
var ajaxObj7;


// Function that requests the saved book list from the server
function loadSaved(uid)
{
	userId = uid;

	var dateObj = new Date();
	var currentTime = dateObj.getTime();

	var ajaxObj = createXMLHttpRequest();
	ajaxObj.onreadystatechange = function(){
	   if(ajaxObj.readyState == 4)
		{
			if(ajaxObj.status == 200)
			{
				bookList = ajaxObj.responseText;
				parseBookList(bookList); // Breaks up response into arrays
				drawTable(pageNum); // Draws the initial table w/o prices
				getPrice(pageNum); // Fills in the prices
				updateProgress(); // Updates the progress
			}
			else
			{
				alert("There was a problem processing your request");
			}
		}
	}
	ajaxObj.open("GET", "cgi-bin/savedsearchlist.pl?cid=" + uid + "&d=" + currentTime, true);
	ajaxObj.send(null);
}

function getBookList(uid)
{
	var dateObj = new Date();
	var currentTime = dateObj.getTime();

	var ajaxObj = createXMLHttpRequest();
	ajaxObj.onreadystatechange = function(){
		if(ajaxObj.readyState == 4)
		{
			bookList = ajaxObj.responseText;
		}
		else
		{
			alert("There was a problem getting the book list");
		}
	}
	ajaxObj.open("GET", "cgi-bin/savedsearchlist.pl?cid=" + uid + "&d=" + currentTime, false);
	ajaxObj.send(null);
}

// Function to break up list returned by perl script savedsearchlist
// Re-creates arrays on each call
function parseBookList(r)
{
	var lines = r.split("<>");
	totalNumOfItems = lines[0];
	numOfPages = Math.ceil(totalNumOfItems / itemsPerPage);

	isbn = new Array();
	title = new Array();
	author = new Array();

	for(var i = 1; i < lines.length; i++)
	{
		var line = lines[i].split("|");
		isbn[i-1] = line[0];
		title[i-1] = line[1];
		author[i-1] = line[2];
	}
}

// Function to get the initial table on the page without the prices
function drawTable(pn)
{
	if(totalNumOfItems != 0)
	{
		var startIndex = (itemsPerPage * (pn - 1));
		var stopIndex = (itemsPerPage * pn) - 1;
		if( stopIndex > (isbn.length - 1))
		{
			stopIndex = isbn.length - 1;
		}

		// Might not be full itemsPerPage, used for loop to display each row
		numOfElements = stopIndex - startIndex + 1; 
		pricesPending = numOfElements;
	
		var tbl = document.createElement("table");
		tbl.id = "accountWatchTable";
	
		// First Row will be in <thead> element
		var thead = document.createElement("thead");

		// First Row
		var tr = document.createElement("tr");

		// Check Box Column
		var td0 = document.createElement("td");
		td0.style.width = "20px";
		td0.style.backgroundColor = "rgb(150,150,150)";
		var checkAll = document.createElement("input");
		checkAll.id = "topCheckBox";
		checkAll.type = "checkbox";
		checkAll.onclick = selectAll;
		td0.appendChild(checkAll);	
	
		// Title Column
		var td1 = document.createElement("td");
		td1.style.width = "330px";
		td1.style.backgroundColor = "rgb(150,150,150)";
		td1.style.color = "white";
		td1.style.fontWeight = "bold";
		td1.appendChild(document.createTextNode("Title"));

		// Author Column
		var td2 = document.createElement("td");
		td2.style.width = "170px";
		td2.style.backgroundColor = "rgb(150,150,150)";
		td2.style.color = "white";
		td2.style.fontWeight = "bold";
		td2.appendChild(document.createTextNode("Author"));

		// ISBN Column
		var td3 = document.createElement("td");
		td3.style.width = "100px";
		td3.style.backgroundColor = "rgb(150,150,150)";
		td3.style.color = "white";
		td3.style.fontWeight = "bold";
		td3.appendChild(document.createTextNode("ISBN"));

		// Price Column
		var td4 = document.createElement("td");
		td4.style.width = "80px";
		td4.style.backgroundColor = "rgb(150,150,150)";
		td4.style.color = "white";
		td4.style.fontWeight = "bold";
		td4.appendChild(document.createTextNode("Price"));

		// Add Columns To The Row
		tr.appendChild(td0);
		tr.appendChild(td1);
		tr.appendChild(td2);
		tr.appendChild(td3);
		tr.appendChild(td4);

		thead.appendChild(tr);	
		tbl.appendChild(thead);

		// Start of Dynamic Content
		var tbody = document.createElement("tbody");
		for(var i = 0; i < numOfElements; i++)
		{
			var tempIndex = startIndex + i;
			var tempISBN = isbn[tempIndex];

			// Create Row
			var tr = document.createElement("tr");

			// Check Box Column
			var td0 = document.createElement("td");
			var input = document.createElement("input");
			input.type = "checkbox"
			input.name = "box" + i;
			input.id = "box" + i;
			input.value = tempISBN;
			td0.appendChild(input);

			// Title Column
			var td1 = document.createElement("td");
			var link1 = document.createElement("a");
			link1.style.textDecoration = "none";
			link1.href = "/r-textbook-comparison-isbn-search-" + tempISBN;
			link1.appendChild(document.createTextNode(title[tempIndex]));
			td1.appendChild(link1);
	
			// Author Column
			var td2 = document.createElement("td");
			var tempAuthor = author[tempIndex];
			var link2 = document.createElement("a");
			link2.style.textDecoration = "none";
			link2.href = "/r-textbook-comparison-isbn-search-" + tempISBN;
			if(!tempAuthor || tempAuthor.length == 0)
			{
				link2.appendChild(document.createTextNode("N/A"));
			}
			else
			{
				link2.appendChild(document.createTextNode(tempAuthor));
			}
			td2.appendChild(link2);
	
			// ISBN Column
			var td3 = document.createElement("td");
			var link3 = document.createElement("a");
			link3.style.textDecoration = "none";
			link3.href = "/r-textbook-comparison-isbn-search-" + tempISBN;
			link3.appendChild(document.createTextNode(tempISBN));
			td3.appendChild(link3);

			// Price Column
			var td4 = document.createElement("td");
			td4.id = tempISBN;
			td4.style.textAlign = "right";
			td4.style.paddingRight = "5px";
			td4.appendChild(document.createTextNode(""));

			// Add Columns To The Row
			tr.appendChild(td0);
			tr.appendChild(td1);
			tr.appendChild(td2);
			tr.appendChild(td3);
			tr.appendChild(td4);
			tbody.appendChild(tr);
		}

		//Navigation and Delete Button Row
		var navRow = document.createElement("tr");
	
		// Navigation Column
		var navTd = document.createElement("td");
		navTd.colSpan = "3";
		navTd.style.backgroundColor = "rgb(150, 150, 150)";
		navTd.style.color = "white";
		navTd.style.fontWeight = "bold";
		var pagingNode = createPagingNode();
		navTd.appendChild(pagingNode);

		// Delete Button Column
		var delTd = document.createElement("td");
		delTd.colSpan = "2";
		delTd.style.backgroundColor = "rgb(150, 150, 150)";
		delTd.style.textAlign = "right";
	
		var delBtn = document.createElement("input");
		delBtn.type = "button";
		delBtn.onclick = deleteSelected;
		delBtn.value = "Delete Selected";

		delTd.appendChild(delBtn);
		navRow.appendChild(navTd);
		navRow.appendChild(delTd);
	
		tbody.appendChild(navRow);
	
	

		tbl.appendChild(tbody);
		$("accountWatchTableDiv").appendChild(tbl);
	}
	else
	{
		var tbl = document.createElement("table");
		tbl.id = "accountWatchTable";
		var thead = document.createElement("thead");
		var tr = document.createElement("tr");
		var td = document.createElement("td");
		td.appendChild(document.createTextNode("You Don't Have Any Saved Books"));
		tr.appendChild(td);
		thead.appendChild(tr);
		tbl.appendChild(thead);
		
		$("accountWatchTableDiv").appendChild(tbl);
	}

}

function createPagingNode()
{
	var totalNumOfSlices = Math.ceil(numOfPages / (numOfPagesPerSlice - 2));
	var sliceNum;

	if(pageNum == 1)
	{
		sliceNum = 0;
	}
	else
	{
		for(sliceNum = 0; sliceNum < totalNumOfSlices; sliceNum++)
		{
			if(pageNum >= ((sliceNum * (numOfPagesPerSlice - 2)) + 2) 
				&& pageNum <= ((sliceNum * (numOfPagesPerSlice - 2)) + (numOfPagesPerSlice - 1)))
			{
				break;
			}
		}
	}
	var startPageNum = ((sliceNum * (numOfPagesPerSlice - 2)) + 1);
	var endPageNum = ((sliceNum * (numOfPagesPerSlice - 2)) + numOfPagesPerSlice);

	if(endPageNum > numOfPages)
	{
		endPageNum = numOfPages;
	}

	var pagingParentNode = document.createElement("div");
	if(pageNum != 1)
	{
			// Create << Prev Link	
			var prevLink = document.createElement("a");
			prevLink.href = "#";
			prevLink.onclick = prevPage;
			prevLink.appendChild(document.createTextNode("<< Prev"));
			pagingParentNode.appendChild(prevLink);
			pagingParentNode.appendChild(document.createTextNode(" | "));
	}
		
	for(var i = startPageNum; i <= endPageNum; i++)
	{

		// Cases: 	1. Active page number
		//				2. Start and end page number updates slice number
		//				3. Regular pages.		

		var tempi = i;

		if(i == pageNum)
		{
			var activeLink = document.createElement("b");
			activeLink.appendChild(document.createTextNode(i));
			pagingParentNode.appendChild(activeLink);
		}
		else
		{
			var regLink = document.createElement("span");
			regLink.innerHTML = "<a href=\"#\" onclick=\"javascript:gotoPage(" + i + ");\">" + i + "</a>";
			//regLink.href = "#";
			//regLink.onclick = return gotoPage(tempi);
			//regLink.appendChild(document.createTextNode(i));
			pagingParentNode.appendChild(regLink);
		}

		if(i != endPageNum)
		{
			pagingParentNode.appendChild(document.createTextNode(" | "));
		}
	}

	if(pageNum < numOfPages)
	{
			var nextLink = document.createElement("a");
			nextLink.href = "#";
			nextLink.onclick = nextPage;
			nextLink.appendChild(document.createTextNode("Next >>"));
			pagingParentNode.appendChild(document.createTextNode(" | "));
			pagingParentNode.appendChild(nextLink);
	}

	return pagingParentNode;
}	

function prevPage()
{
	abortGetPrice();
	pageNum--;
	var accountWatchTblDiv = $("accountWatchTableDiv");
	accountWatchTblDiv.removeChild(accountWatchTblDiv.firstChild);
	drawTable(pageNum);
	getPrice(pageNum);
}
	
function gotoPage(num)
{
	abortGetPrice();
	pageNum = num;
	var accountWatchTblDiv = $("accountWatchTableDiv");
	accountWatchTblDiv.removeChild(accountWatchTblDiv.firstChild);
	drawTable(pageNum);
	getPrice(pageNum);
}

function nextPage()
{
	abortGetPrice();
	pageNum++;
	var accountWatchTblDiv = $("accountWatchTableDiv");
	accountWatchTblDiv.removeChild(accountWatchTblDiv.firstChild);
	drawTable(pageNum);
	getPrice(pageNum);
}

function abortGetPrice()
{
	if(ajaxObj0 != null)
	{
		ajaxObj0.abort();
	}
	if(ajaxObj1 != null)
	{
		ajaxObj1.abort();
	}
	if(ajaxObj2 != null)
	{
		ajaxObj2.abort();
	}
	if(ajaxObj3 != null)
	{
		ajaxObj3.abort();
	}
	if(ajaxObj4 != null)
	{
		ajaxObj4.abort();
	}
	if(ajaxObj5 != null)
	{
		ajaxObj5.abort();
	}
	if(ajaxObj6 != null)
	{
		ajaxObj6.abort();
	}
	if(ajaxObj7 != null)
	{
		ajaxObj7.abort();
	}
}

// Function to populate price list depending on the pageNumber	
function getPrice(pn)
{
	var startIndex = (itemsPerPage * ( pn - 1 ));
	var stopIndex = (itemsPerPage * ( pn - 1 )) + 7;
	if( stopIndex > (isbn.length - 1))
	{
		stopIndex = isbn.length - 1;
	}	

	numOfElements = stopIndex - startIndex + 1;
	pricesPending = numOfElements; // Used for updateProgress later.

	for(var i = 0; i < numOfElements; i++)
	{
		var isbnIndex = startIndex + i;
		var isbnStr = isbn[isbnIndex];

		if(price[isbnStr] == null)
		{
			if(i == 0)
			{
				ajaxObj0 = createXMLHttpRequest();
				ajaxObj0.onreadystatechange = function(){
   				if (ajaxObj0.readyState==4) 
					{
						try
						{
      					if (ajaxObj0.status==200)
							{
								var response = ajaxObj0.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
	   		     		} 
							else 
							{
         						alert("Message returned, but with error status.");
        					}
						}
						catch(err)
						{
							// Do Nothing
						}
  	   			}
				}
				ajaxObj0.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
				ajaxObj0.send(null);
			}
			if(i == 1)
			{
				ajaxObj1 = createXMLHttpRequest();
				ajaxObj1.onreadystatechange = function(){
		  			if (ajaxObj1.readyState==4) 
					{
						try
						{
      					if (ajaxObj1.status==200)
							{
								var response = ajaxObj1.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
			        		} 
							else 
							{
        		 				alert("Message returned, but with error status.");
    						}
						}
						catch(err)
						{
							// Do Nothing
						}
      			}
				}
			   ajaxObj1.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
	   		ajaxObj1.send(null);
			}
			if(i == 2)
			{
				ajaxObj2 = createXMLHttpRequest();
				ajaxObj2.onreadystatechange = function(){
   				if (ajaxObj2.readyState==4) 
					{
						try
						{
      					if (ajaxObj2.status==200)
							{
								var response = ajaxObj2.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
   		   	  		} 
							else 
							{
          					alert("Message returned, but with error status.");
  	     					}
						}	
						catch(err)
						{
							// Do Nothing
						}
	     			}
				}
			   ajaxObj2.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
		   	ajaxObj2.send(null);
			}
			if(i == 3)
			{
				ajaxObj3 = createXMLHttpRequest();
				ajaxObj3.onreadystatechange = function(){
   				if (ajaxObj3.readyState==4) 
					{
						try
						{
      					if (ajaxObj3.status==200)
							{
								var response = ajaxObj3.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
		      	  		} 
							else 
							{
	      	    			alert("Message returned, but with error status.");
   	     				}
						}
						catch(err)
						{
							// Do Nothing
						}
     				}
				}
			   ajaxObj3.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
			   ajaxObj3.send(null);
			}
			if(i == 4)
			{
				ajaxObj4 = createXMLHttpRequest();
				ajaxObj4.onreadystatechange = function(){
		   		if (ajaxObj4.readyState==4) 
					{
						try
						{
	     					if (ajaxObj4.status==200)
							{
								var response = ajaxObj4.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
		      	  		} 
							else 
							{
        		 				alert("Message returned, but with error status.");
	     					}
						}
						catch(err)
						{
							// Do Nothing
						}
      			}
				}
			   ajaxObj4.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
	   		ajaxObj4.send(null);
			}
			if(i == 5)
			{
				ajaxObj5 = createXMLHttpRequest();
				ajaxObj5.onreadystatechange = function(){
   				if (ajaxObj5.readyState==4) 
					{
						try
						{
      					if (ajaxObj5.status==200)
							{
								var response = ajaxObj5.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
			        		} 
							else 
							{
        						alert("Message returned, but with error status.");
     						}
						}
						catch(err)
						{
							//Do Nothing
						}
	      		}
				}
			   ajaxObj5.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
	   		ajaxObj5.send(null);
			}
			if(i == 6)
			{
				ajaxObj6 = createXMLHttpRequest();
				ajaxObj6.onreadystatechange = function(){
   				if (ajaxObj6.readyState==4) 
					{
						try
						{
		   				if (ajaxObj6.status==200)
							{
								var response = ajaxObj6.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
			        		} 
							else 
							{
	         	 			alert("Message returned, but with error status.");
   	     				}
						}
						catch(err)
						{
							// Do Nothing
						}
		      	}	
				}
				ajaxObj6.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
		   	ajaxObj6.send(null);
			}
			if(i == 7)
			{
				ajaxObj7 = createXMLHttpRequest();
				ajaxObj7.onreadystatechange = function(){
		   		if (ajaxObj7.readyState==4) 
					{
      				try
						{
							if (ajaxObj7.status==200)
							{
								var response = ajaxObj7.responseText;
								var line = response.split("|");
								var isbnStr = line[0];
								var tempPrice = line[1] * 1;
        						price[isbnStr] = "$" + tempPrice.toFixed(2);
								pricesPending--;
								updateProgress();
								$(isbnStr).innerHTML = "<a href=\"/r-textbook-comparison-isbn-search-" 
										+ isbnStr + "\" >" + price[isbnStr] + "</a>";
			        		} 
							else 
							{
        						alert("Message returned, but with error status.");
      					}
						}
						catch(err)
						{
							// Do Nothing
						}
	     			}
				}
			   ajaxObj7.open("GET", "cgi-bin/bookprice.pl?isbn=" + isbnStr, true);
			  	ajaxObj7.send(null);
			}
		}
		else
		{
			pricesPending--;
			updateProgress();
			$(isbnStr).innerHTML = price[isbnStr];
		}
	}
}

// Function to update progress
function updateProgress()
{
	if(pricesPending != 0)
	{
		var percentComplete = ((numOfElements - pricesPending) / numOfElements) * 100;	
		percentComplete = percentComplete.toFixed(1);
		$("accountWatchProgress").innerHTML = "Loading: " + percentComplete + "%";
	}
	else
	{
		$("accountWatchProgress").innerHTML = "Loading: 100.0%";
	}
}

function selectAll()
{
	var topCheckBox = $("topCheckBox");
	if(topCheckBox.checked == true)
	{
		for(var i = 0; i < numOfElements; i++)
		{
			var tempId = "box" + i;
			var checkBox = $(tempId);
			checkBox.checked = true;
		}
	}
	else
	{
		for(var i = 0; i < numOfElements; i++)
		{
			var tempId = "box" + i;
			var checkBox = $(tempId);
			checkBox.checked = false;
		}
	}	
}


// Function to delete books from account
function deleteSelected()
{
	
	abortGetPrice();
	// Construct list of isbns to delete	

	var deleteList = "";
	for(var i = 0; i < numOfElements; i++)
	{
		var tempId = "box" + i;
		var checkBox = $(tempId);
		if(checkBox.checked == true)
		{	
			deleteList = deleteList + checkBox.value + "+";
		}
	}

	deleteList = deleteList.substring(0, deleteList.lastIndexOf("+"));

	// Send list of isbns to server to delete
	var ajaxObj = createXMLHttpRequest();
	ajaxObj.onreadystatechange = function(){
	   if(ajaxObj.readyState == 4)
		{
			if(ajaxObj.status == 200)
			{
				var response = ajaxObj.responseText;
				if(response == "Success")
				{
					// Books Deleted 
					// Remove old table
					var accountWatchTblDiv = $("accountWatchTableDiv");
					accountWatchTblDiv.removeChild(accountWatchTblDiv.firstChild);
					// Start Redraw of Table
					loadSaved(userId);
				}
				else
				{
					// Problem Deleting Books Display Error
					alert("There was a problem deleting your books. Please try again later");
				}
			}
			else
			{
				alert("There was a problem processing your request");
			}
		}
	}
	ajaxObj.open("GET", "cgi-bin/deletesaved.pl?list=" + deleteList, true);
	ajaxObj.send(null);
	
}

function sellEdit(isbn)
{

	window.location = "/cgi-bin/editsell.pl?isbn=" + isbn;
}

function sellDelete(isbn)
{
	var ajaxObj = createXMLHttpRequest();
	ajaxObj.onreadystatechange = function(){
		if(ajaxObj.readyState == 4)
		{
			if(ajaxObj.status == 200)
			{
				// remove row
				var response = ajaxObj.responseText;

				if(response != "Failed" && response != "NoLogin")
				{
					var retISBN = response.substring(response.indexOf("-") + 1, response.lastIndexOf("-"));
					var numForSale = response.substring(response.lastIndexOf("-") + 1, response.length);
					var tableRow = $("sell" + retISBN);
					tableRow.parentNode.removeChild(tableRow);
						
					if(numForSale == "0")
					{
						var sellTable = $("accountSellTable");

						if(sellTable.innerHTML)
						{
							sellTable.innerHTML = "<tr><td>You're Not Selling Any Books.</td></tr>";
						}
						else
						{
							alert("inside else");
							sellTable.removeChild(sellTable.firstChild);
						}
					}
				}
			}
		}
	}
	ajaxObj.open("GET", "cgi-bin/deletesell.pl?isbn=" + isbn, true);
	ajaxObj.send(null);
}

// Simplifies getElementById
function $(id) { return document.getElementById(id); }

// Gets the AJAX Object
function createXMLHttpRequest() 
{
	try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
   try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
   try { return new XMLHttpRequest( ); } catch(e) {}
   alert("XMLHttpRequest not supported");
   return null;
}
