/* Copyright 2008 Damien Watson, damien.watson@gmail.com */

var xhr = {

	init : false,
	req: null,		// stores url for playblack
	silent: false,		// if true, don't update indicator or "chrome"
	indicator: null,	// shows status of request to user
	active: false,		// shows whether xhr is currently processing request
// 	debug: true,		// turn on console debugging
	debug: false,		// turn on console debugging
	stack: [],

	request : function(url, method, params, silent, contentType){

		if(xhr.init == false){
			xhr.init = true;
			xhr.feedback = bom.feedback;
			xhr.indicator = bom.connection;
		}

		try{

			if(xhr.active == false){

				xhr.active = true;
				xhr.req = url;
				xhr.silent = silent ? silent : false;
				xhr.send(url, method, params, contentType);

			}else{
				xhr.indicator.innerHTML = 'Busy';
				bom.report('busy');
			}

		}catch(e){
			xhr.defaultError(e);
		}
	},

	send : function(url, request_method, params){

		var connection;
		if (window.XMLHttpRequest) { // Mozilla, Safari,...

			connection = new XMLHttpRequest();

		} else if (window.ActiveXObject) { // IE

			try{
				connection = new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){

				try{
					connection = new ActiveXObject("Microsoft.XMLHTTP");
				}catch(e){}
			}
		}

		if (connection) {
	
			try{
	
				connection.onreadystatechange = function(){
		
					if (connection.readyState == 1) {
						xhr.indicator.style.backgroundColor = '#FFFF33';
						xhr.indicator.innerHTML = 'Loading';
					}
					if (connection.readyState == 4) {
						if (connection.status == 200) {
							xhr.indicator.style.backgroundColor = '#33FF33';
							xhr.indicator.innerHTML = 'Ready';
							xhr.read(connection.responseText);
						}else{
							xhr.indicator.style.backgroundColor = '#FF3333';
							xhr.indicator.innerHTML = "<a href=\"" + xhr.req + "\">Retry</a>";
							xhr.defaultError('failed');
						}
					}
				}

// 				if(connection.overrideMimeType){
// 					connection.overrideMimeType("text/html; charset=ISO-8859-1");
// 				}

				if(params.length > 0){
					params += '&response=ajax';
				}else{
					params += 'response=ajax';
				}

				if(request_method == 'GET'){
					connection.open(request_method, url + '?' + params + '&random=' + Math.random(), true);
					// connection.setRequestHeader("Connection", "close");
					connection.send(null);
				}else{


					url += '?random=' + Math.random();

					connection.open(request_method, url, true);
					connection.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
					connection.setRequestHeader("Content-length", params.length);
					connection.setRequestHeader("Connection", "close");
					connection.setRequestHeader("Cache-Control", "must-revalidate");
					connection.send(params);
				}

			}catch(e){

				if(xhr.debug === true){
					msg = e + "<br>request data: "
						+ "<br> readyState:" + connection.readyState
						+ "<br> status: " + connection.status
						+ "<br> headers: " + connection.getAllResponseHeaders() + "<br>";
					xhr.defaultError(msg);
				}else{
					xhr.defaultError(e);
				}
			}

		}else{
			bom.report('Cannot create an XMLHTTP instance.');
			return false;
		}
	},

	defaultError : function(msg){
		xhr.active = false;
		bom.report("Error sending request: " + msg);
	},

	read : function(xml){

		try{ //Internet Explorer

			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.loadXML(xml);

		}catch(e){

			try{ //Firefox, Mozilla, Opera, etc.
				parser = new DOMParser();
				xmlDoc = parser.parseFromString(xml, "text/xml");
			}catch(e){
				xhr.defaultError(e);
			}
		}

		try{
			xhr.update(xmlDoc);
		}catch(e){
			xhr.defaultError(e);
		}
	},

	update : function(xmlDoc){

// 		bom.report('updating');

		var x = xmlDoc.getElementsByTagName('element');
		for (var i = 0, len = x.length; i < len; i++){

			var command = {};

			try{

				for (var j = 0, nodes = x[i].childNodes.length; j < nodes; j++){
					var varname = x[i].childNodes[j].tagName;
					var varval = x[i].childNodes[j].firstChild.nodeValue;
					command[varname] = varval;
				}

			}catch(e){
				alert(e);
			}

// 				alert(x[i].childNodes[j].nodeType);
// 				alert(x[i].childNodes[j].tagName);
// 				alert(x[i].childNodes[j].nodeValue);

			if(el = xGetElementById(command.node)){

				if(command.mode){

					switch(command.mode){
	
						case 'replace':
							el.innerHTML = command.value;
						break;
						case 'prepend':
							el.innerHTML = command.value + el.innerHTML;
						break;
						case 'append':
							el.innerHTML = el.innerHTML + command.value;
						break;
						case 'clear':
							el.innerHTML = '';
						break;
					}
				}

				if(command.addClass){
					xAddClass(el, command.addClass)
				}

				if(command.removeClass){
					xRemoveClass(el, command.removeClass)
				}

				if(xhr.debug === true){
					bom.report(command.node + ': ' + command.value, 'debug');
				}

			}else{
				if(xhr.debug === true){
					bom.report('Element not found, ' + command.node + ': ' + command.value, 'debug');
				}
			}

			if(!!command.callback){
				eval(command.callback + '()');
			}

		}
		xhr.active = false;
	}
}

/*

// unify caching
var request = (typeof(XMLHttpRequest) != "undefined") ?
    new XMLHttpRequest() : new ActiveXObject("Msxml2.XMLHTTP");
request.open("GET", url, false);
request.send(null);
if(!request.getResponseHeader("Date"))
{
  var cached = request;
  request = (typeof(XMLHttpRequest) != "undefined") ?
      new XMLHttpRequest() :
      new ActiveXObject("Msxml2.XMLHTTP");
  var ifModifiedSince = cached.getResponseHeader("Last-Modified");
  ifModifiedSince = (ifModifiedSince) ?
      ifModifiedSince : new Date(0); // January 1, 1970
  request.open("GET", url, false);
  request.setRequestHeader("If-Modified-Since", ifModifiedSince);
  request.send("");
  if(request.status == 304)
  {
    request = cached;
  }
}
*/
