
// ----------------------------------------------------------------------
// Global Objects/Functions:
//     Requester               - AJAX Wrapper Class
//     Requester.isCompatible  - Check browser compatability
//     EventManager            - Add events to DOM objects
// ----------------------------------------------------------------------

var OPTIONS = {
    showURLS:0,
    showResults:0
}

// AJAX wrapper class
//
function Requester()
{
	var reqObject;
	var _errorHandler; // this will hold a function

	var GET = "GET";
	var POST = "POST";
	var OPEN_BRACKET  = "(";
	var CLOSE_BRACKET = ")";
	var UNDEFINED = "undefined";
	var RAND = "?r=";
	var AMP = "&";

	if(window.XMLHttpRequest)
	{
		reqObject = new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{
		try
		{
			reqObject = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(err)
		{
			throw(new Error("Cannot create XMLHttpRequest : Incompatible browser"));
		}
	}

	function _errorHandler(status)
	{
		alert("Error getting data!\n\nThere was an error (" + status + ") retreiving the requested data. Please try again.\n\nIf the problem persists, please contact the site webmaster.");
	}

	function _getHandler(handlerFunction)
	{
		function _handle()
		{
			if(((typeof handlerFunction) != UNDEFINED) && (reqObject.readyState == 4))
			{
				if(reqObject.status == 200)
				{
          if (OPTIONS['showResults']) {
              alert(reqObject.responseText) ;
					}
          handlerFunction(evalJson(reqObject.responseText));
				}
				else if(reqObject.status !=0)
				{
					_errorHandler(reqObject.status);
				}
			}
		}

		return _handle;
	}

	function get(url, params, handler, debug)
	{
		var rand = Math.random()
		var urlToUse = url + RAND + rand + AMP + params;
    urlToUse = encodeURI(urlToUse) ;

    if (OPTIONS['showURLs']) {
        if (debug) {
            prompt('*** DEBUG MODE: THIS URL WILL NOT BE RUN ***',urlToUse)
            return
        } else {
            var val = prompt('',urlToUse)
            if (!val) {
                alert('URL cancelled')
                return
            }
        }
    }

    reqObject.open(GET, urlToUse, true);
		reqObject.onreadystatechange = _getHandler(handler);
		reqObject.send(null);
	}
	this.get = get;

	function post(url, params, handler)
	{
		var rand = Math.random()
		var urlToUse = url + RAND + rand + AMP + 'results_format=' + RESULTSFORMAT + AMP + params;
    urlToUse = encodeURI(urlToUse) ;

    if (OPTIONS['showURLs']) {
        prompt('',urlToUse)
    }
    reqObject.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

    reqObject.open(POST, urlToUse, true);
		reqObject.onreadystatechange = _getHandler(handler);
		reqObject.send(null);
	}
	this.post = post;

	function evalJson(json)
	{
		try
		{
			return eval(OPEN_BRACKET + json + CLOSE_BRACKET);
		}
		catch(err)
		{
			throw(new Error("Invalid Json : " + err.description + "\n\n" + json));
		}
	}
	this.evalJson = evalJson;
}
Requester.isCompatible = function() /* static tester method */
{
	var hasXhr = false;
	if(window.XMLHttpRequest) // mozilla and IE7
	{
		hasXhr = true;
	}
	else if(window.ActiveXObject)
	{
		try
		{
			var tmp = new ActiveXObject("Microsoft.XMLHTTP"); //IE 5 - 6 - must try to instantiate
			hasXhr = true;
		}
		catch (e)
		{
			hasXhr = false;
		}
	}
	else
	{
		hasXhr = false;
	}

	if (Function.call && hasXhr) // Function.call  yeilds IE 5.5 (can't test for 6)
	{
		return true;
	}
	else
	{
		return false;
	}
}

var EventManager = new function()
{
	this.CLICK = "click";
	this.CHANGE = "change";
	this.SUBMIT = "submit";
	this.MOUSEWHEEL = "mousewheel";
	this.MOUSEOVER = "mouseover";
	this.MOUSEOUT = "mouseout";
	this.KEYPRESS = "keypress";

	var ON = "on";
	var LOAD = "load";
	var UNLOAD = "unload";
	var FF_WHEEL = "DOMMouseScroll";

	function add(element, eventName, handler)
	{
		function _ev(ev)
		{
			var theEvent = ev || window.event;
			theEvent.targetElement = theEvent.target || theEvent.srcElement;
			theEvent.attachedElement = element;

			var eventResult = handler(theEvent);

			if(ev.preventDefault && (eventResult === false))
			{
				ev.preventDefault();
				ev.stopPropagation();
			}

			return eventResult;
		}

		if (element.attachEvent)
		{
			element.attachEvent(ON + eventName, _ev);
		}
		else
		{
			element.addEventListener(eventName, _ev, false);
		}
	}
	this.add = add;

	function remove(element, eventName, handler)
	{
		if (element.detachEvent)
		{
			element.detachEvent(ON + eventName, handler);
		}
		else
		{
			element.removeEventListener(eventName, handler, false);
		}
	}
	this.remove = remove;

	function addOnload(handler)
	{
		add(window, LOAD, handler);
	}
	this.addOnload = addOnload;

	function addOnunload(handler)
	{
		add(window, UNLOAD, handler);
	}
	this.addOnunload = addOnunload;
}


