/*
/* Hijax Object Constructor - from Jeremy Keith - http://adactio.com */
/* 
/* Modifications by The Stranger/Portland Mercury:
/* -- boolean 'obscure' property added: uses value of name property of links as query instead of href
/* -- added simpleUpdate method for passing query complete from javascript instead of form or link
/* -- added support for checkboxes in forms
/* -- added ability to put ajax results into a new element, specified by canvasnewelement and canvasnewid
/*
*/

function Hijax() {

 var container,url,canvas,canvasnewelement,canvasnewid,data,loading,callback,request,obscure,errorhandler,timer;

 this.setContainer = function(value) {
  container = value;
 };
 this.setUrl = function(value) {
  url = value;
 };
 this.setCanvas = function(value) {
  canvas = value;
 };
 this.setLoading = function(value) {
  loading = value;
 };
 this.setCallback = function(value) {
  callback = value;
 };
 this.setObscure = function(value) {
	 obscure = value;
 };
 this.setCanvasNewElement = function(value1,value2) {
	canvasnewelement = value1;
	canvasnewid = value2;
 };
 this.setErrorHandler = function(value) {
	 errorhandler = value;
 };
 
 this.simpleUpdate = function() {
	 return !start();
 };

 this.captureData = function() {
  if (container.nodeName.toLowerCase() == "form") {
   container.onsubmit = function() {
    var query = "";
    for (var i=0; i<this.elements.length; i++) {
     query+= this.elements[i].name;
     query+= "=";
     if (this.elements[i].type == "checkbox") {
			 if (this.elements[i].checked) {
				 query+=this.elements[i].value;
			 }
		 } else {
		 	query+= escape(this.elements[i].value);
		 }
     query+= "&";
    }
    data = query;
    return !start();
   };
  } else {
   var links = container.getElementsByTagName("a");
   for (var i=0; i<links.length; i++) {
    links[i].onclick = function() {
     if (obscure) {
			var query = this.getAttribute("name");
		 } else {
		 	var query = this.getAttribute("href").split("?")[1];
		 }
     url+= "?"+query;
     return !start();
    };
   }
   links = null;
  }
 };

 var start = function() {
  request = getHTTPObject();
  if (!request || !url) {
   return false;
  } else {
   initiateRequest();
   return true;
  }
 };

 var getHTTPObject = function() {
  var xmlhttp = false;
  if (window.XMLHttpRequest) {
   xmlhttp = new XMLHttpRequest();
  } else if(window.ActiveXObject) {
   try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e) {
    try {
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {
     xmlhttp = false;
    }
   }
  }
  return xmlhttp;
 };

 var initiateRequest = function() {
	 timer = setTimeout(function() {
				/* some browsers will fire readystatechange when abort is called, counteract this by emptying onreadystatechange handler */
				request.onreadystatechange = function() {};
				request.abort();
				if (errorhandler) { errorhandler(); }
				}, 60000);
  if (loading) {
   loading();
  }
  request.onreadystatechange = completeRequest;
  if (data) {
   request.open("POST", url, true);
   request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
   request.send(data);
  } else {
   request.open("GET", url, true);
   request.send(null);
  }
 };

 var completeRequest = function() {
  if (request.readyState == 4) {
   if (request.status == 200 || request.status == 304) {
			clearTimeout(timer);
			if (canvasnewelement) {
				var blankCanvas = document.createElement(canvasnewelement);
				blankCanvas.id = canvasnewid;
				blankCanvas.className = 'blankcanvas';
				insertAfter(blankCanvas,canvas);
			}
			if (blankCanvas) {
				blankCanvas.innerHTML = request.responseText;
			} else if (canvas) {
				canvas.innerHTML = request.responseText;
			}
    if (callback) {
     callback();
    }
   } else {
		 if (errorhandler) {
			 errorhandler();
		 }
	 }
  }
 };

}