// JavaScript Document/***	@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*/function MessageLoader(outerContainerID, dataURL){	this._outerContainer = document.getElementById(outerContainerID);		if(dataURL != undefined)	{		this._dataURL = dataURL;	}		this._writeContainer();}//where to load the data fromMessageLoader.prototype._dataURL = "data.txt";//var to hold an instance of the XMLHTTPRequest objectMessageLoader.prototype._request = undefined;MessageLoader.prototype._outerContainer = undefined;//ID for the html div we will create to display the dataMessageLoader.prototype._containerID = "innerContainer";//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);}/***************Private 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>");	var innerContainer = document.createElement("div");		innerContainer.setAttribute("id", this._containerID);		innerContainer.setAttribute("class", this._containerClass);				//need this for IE		innerContainer.setAttribute("className", this._containerClass);			this._outerContainer.appendChild(innerContainer);	}//renders the entire widgetMessageLoader.prototype._render = function(title){	var content = document.getElementById(this._containerID);		content.appendChild(document.createTextNode(title));}/***************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")		{			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;}