// ajax.js - Ajax service library
// Copyright (c) 2008, Clasma Events Inc.

// Define namespace

var ajax=function() {

// Public start

var public={

// Request methods

GET:"GET",
POST:"POST",
HEAD:"HEAD",

// Ready states

RS_UNINITIALIZED:0,
RS_LOADING:1,
RS_LOADED:2,
RS_INTERACTIVE:3,
RS_COMPLETED:4,

// Status codes

S_OFFLINE:0,
S_OK:200,
S_NOTFROUND:404,

// Security

user:null,
password:null,

// Messages

wait:"<table border='0' cellspacing='0' cellpadding='0'><tr><td><img src='res/wait.gif' width='16' height='16' style='margin-right:4px'/></td><td>Requesting content...</td></tr></table>",

err:"<table border='0' cellspacing='0' cellpadding='0'><tr><td><img src='res/error.gif' width='16' height='16' style='margin-right:4px'/></td><td>Ajax: ",

err1:"not supported",

// Helper functions

isReady:function(r) {return r.readyState==public.RS_COMPLETED || r.readyState=="complete";},
isValid:function(r) {return r.status==ajax.S_OK || r.status==public.S_OFFLINE;},

setResponse:function(id,s) {document.getElementById(id).innerHTML=s;},

setWait:function(id) {public.setResponse(id,public.wait);},
setError:function(id,err) {public.setResponse(id,public.err+err+"</td></tr></table><div>&nbsp;</div>");},

// request
// Send request to server

request:function(url,method,args,cb,async)
{
	// ready params
	if(method==null) method=public.GET;
	if(args==null) args="";
	if(async==null) async=true;

	// create request object?
	var r=private.create();

	// open request
	r.open(method,url,async,public.user,public.password);

	// set post header?
	if(method==public.POST)
		r.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

	if(cb!=null)
	{
		// set response handler
		r.onreadystatechange=function()
		{
			// request is ready?
			if(public.isReady(r))
				cb(r);
		}
	}
	// send request to server
	r.send(args);

	return r;
},

// include
// Request contents of url and insert into tag

include:function(url,id,args,cb)
{
	// setup wait text
//	public.setWait(id);

	// setup callback
	var proc=function(r)
	{
		// request status ok?
		if(public.isValid(r)) public.setResponse(id,r.responseText);
		else public.setError(id,"#"+r.status+" "+r.statusText);

		// execute callback
		if(cb!=null) cb(r);
	}

	// send request?
	try {public.request(url,public.POST,args,proc);}
	catch(e) {public.setError(id,e.message);}
}

// Public end

};

// Private start

var private={

// Connection objects

objs:new Array(
"MSXML2.XMLHttp.7.0",
"MSXML2.XMLHttp.6.0",
"MSXML2.XMLHttp.5.0",
"MSXML2.XMLHttp.4.0",
"MSXML2.XMLHttp.3.0",
"MSXML2.XMLHttp",
"Microsoft.XMLHttp"),

// create
// Return new http request object

create:function()
{
	// create ActiveX object?
	if(window.ActiveXObject)
	{
		// try these in order
		for(var n=0;n<private.objs.length;n++)
		{
			try
			{
				// object exists?
				var obj=new ActiveXObject(private.objs[n]);
				return obj;
			}
			catch(e) {}
		}
	}
	// create native object?
	if(XMLHttpRequest)
		return new XMLHttpRequest();

	// no request object
    throw new Error(public.err1);
}

// End Private

};

return public;}();
