/**
*	@fileoverview Simple example that shows how to encapsulate XMLHTTPRequestCalls
*
*	@author Mike Chambers (mesh@adobe.com)
*/

/**
*	Constructor for the class.
*
*	@param {String} dataURL The path to the data that the class will load (OPTIONAL)
*
*	@constructor
*/
var undefined = null;

function MessageLoader(dataURL, containerID, containerClass){
	if(dataURL != undefined){
		this._dataURL = dataURL;
	}
	this._containerID = containerID;
	this._containerClass = containerClass;
	this._writeContainer();
	
}

//where to load the data from
MessageLoader.prototype._dataURL = "";

//var to hold an instance of the XMLHTTPRequest object 
MessageLoader.prototype._request = undefined;

//ID for the html div we will create to display the data 
MessageLoader.prototype._containerID = "container";

//name of the css class for the HTML container 
MessageLoader.prototype._containerClass = "ml_container";

/**************** Public APIs **********************/

/**
*	Tells the class to load its data and render the results.
*/
MessageLoader.prototype.load = function() {
	//get a new XMLHTTPRequest and store it in an instance var.
	this._request = this._getXMLHTTPRequest();
	
	//set the var so we can scope the callback
	var _this = this;
	
	//callback will be an anonymous function that calls back into our class
	//this allows the call back in which we handle the response (_onData())
	// to have the correct scope.
	this._request.onreadystatechange = function(){_this._onData()};
	this._request.open("GET", this._generateDataUrl(), true);
	this._request.send(null);
}

/***************Rendering APIs ********************/

//writes the top level div for the class / widget 
MessageLoader.prototype._writeContainer = function() {
	//styles should be in external CSS
	//document.write("<div id='" + this._containerID + "' class='" + this._containerClass + "'></div>");
}

//renders the entire widget
MessageLoader.prototype.standardRender = function() {
	var content = document.getElementById(this._containerID);
	//alert(this._request.responseText); //debug alert text
	content.innerHTML = this._request.responseText;
	//content.appendChild(document.createTextNode(this._request.responseText)); //createTextNode
}

/***************Private Data Loading Handlers*******************/

//return the URL from which the data will be loaded 
MessageLoader.prototype._generateDataUrl = function() {
	return this._dataURL;
}


//callback for when the data is loaded from the server 
MessageLoader.prototype._onData = function() {
	if(this._request.readyState == 4) {
		if(this._request.status == "200") {
			//alert("status 200");
			//this._render(this._request.responseText);
			
			//if the onDraw callback has been defined
			//call it to let the listener know that we are done creating the list
			if(this.onDraw != undefined) {
				this.onDraw();
			}
		} else {	
			//check if an error callback handler has been defined
			if(this.onError != undefined) {
				//pass an object to the callback handler with info about the error
				this.onError({status:this_request.status, statusText:this._request.statusText});
			}
		}
		//clean up
		delete this._request;
	}
}

/***************Private Data Util Functions ********************/


//returns an XMLHTTPRequest instance (based on browser) 
MessageLoader.prototype._getXMLHTTPRequest = function() {
	var xmlHttp;
	try {
		xmlHttp = new ActiveXObject("Msxml2.XMLHttp");
	} catch(e) {
		try	{
			xmlHttp = new ActiveXObject("Microsoft.XMLHttp");
		} catch(e2) {
		}
	}
	if(xmlHttp == undefined && (typeof XMLHttpRequest != 'undefined')) {
		xmlHttp = new XMLHttpRequest();
	}
	return xmlHttp;
}

