
if (Function.prototype.bind == null) {
	Function.prototype.bind = function(object) {
		var __method = this;
		return function() {
			return __method.apply(object, arguments);
		}
	}
}

// Cerum Namespace

if (typeof(Cerum) == "undefined")
	Cerum = { };


Cerum.$ = function(arg) {
	if (arg == null || typeof(arg) == "undefined") {
		return null;
	}
	if (arguments.length > 1) {
		var e=[];
		for (var i=0; i<arguments.length; i++) {
			e.push(Cerum.$(arguments[i]));
		}
		return e;
	} else if (typeof arg == 'string') {
		return document.getElementById(arg);
	} else {
		return arg;
	}
}

// returns if the element belongs to current document
// if the argument is not element, function returns true
Cerum.$$ = function(element) {
	if (typeof(element) == "string") {
		element = Cerum.$(element);
	}
	if (element == null || typeof(element) == "undefined" ||
	    element.tagName == null || typeof(element.tagName) == "undefined") {
	    return true;
	}

	var id = element.getAttribute('id');
	if (typeof(id) == "undefined" || id == null || id == "")
		return element.ownerDocument == document;
	else
		return document.getElementById(id) == element;
}

Cerum.isPortlet = function() {
	return Cerum.portlet == true;
}

Cerum.emptyFunction = function() { };

Cerum.Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}

/**
 * Logging functionality.
 */

Cerum.Log = {

	enabled: function() {
		return CerumAjaxDebugEnabled();
	},

	info: function(msg) {
	    if (Cerum.Log.enabled())
			CerumAjaxDebug.logInfo(msg);
	},

	error: function(msg) {
		if (Cerum.Log.enabled())
			CerumAjaxDebug.logError(msg);
	},

	log: function(msg) {
		if(Cerum.Log.enabled())
			CerumAjaxDebug.log(msg);
	}
}


/**
 * The Ajax class handles low level details of creating and pooling XmlHttpRequest objects,
 * as well as registering and execution of pre-call, post-call and failure handlers.
 */
 Cerum.Ajax = {
 	// Creates a new instance of a XmlHttpRequest
	createTransport: function() {
	    var transport = null;
	    if (window.ActiveXObject) {
	        transport = new ActiveXObject("Microsoft.XMLHTTP");
	        Cerum.Log.info("Using ActiveX transport");
	    } else if (window.XMLHttpRequest) {
	        transport = new XMLHttpRequest();
	        Cerum.Log.info("Using XMLHttpRequest transport");
	    }

	    if (transport == null) {
	        Cerum.Log.error("Cerum.Ajax.createTransport: Could not locate ajax transport. Your browser does not support the required XMLHttpRequest object or Cerum could not gain access to it.");
	    }
	    return transport;
	},

	transports: [],

	// Returns a transport from pool if any of them is not being used, or creates new instance
	getTransport: function() {
		var t = Cerum.Ajax.transports;
		for (var i = 0; i < t.length; ++i) {
			if (t[i].readyState == 0) {
				return t[i];
			}
		}
		t.push(Cerum.Ajax.createTransport());
		return t[t.length-1];
	},

	preCallHandlers: [],
	postCallHandlers: [],
	failureHandlers: [],

	registerPreCallHandler: function(handler) {
		var h = Cerum.Ajax.preCallHandlers;
		h.push(handler);
	},

	registerPostCallHandler: function(handler) {
		var h = Cerum.Ajax.postCallHandlers;
		h.push(handler);
	},

	registerFailureHandler: function(handler) {
		var h = Cerum.Ajax.failureHandlers;
		h.push(handler);
	},

	invokePreCallHandlers: function() {
		var h = Cerum.Ajax.preCallHandlers;
		if (h.length > 0) {
			Cerum.Log.info("Invoking pre-call handler(s)...");
		}
		for (var i = 0; i < h.length; ++i) {
			h[i]();
		}
	},

	invokePostCallHandlers: function() {
		var h = Cerum.Ajax.postCallHandlers;
		if (h.length > 0) {
			Cerum.Log.info("Invoking post-call handler(s)...");
		}
		for (var i = 0; i < h.length; ++i) {
			h[i]();
		}
	},

	invokeFailureHandlers: function() {
		var h = Cerum.Ajax.failureHandlers;
		if (h.length > 0) {
			Cerum.Log.info("Invoking failure handler(s)...");
		}
		for (var i = 0; i < h.length; ++i) {
			h[i]();
		}
	}
}

CerumAjaxGetTransport = Cerum.Ajax.getTransport;

// Global handlers stubs

Cerum.Ajax.registerPreCallHandler(function() {
	if (typeof(window.CerumGlobalPreCallHandler) != "undefined") {
	    var global=CerumGlobalPreCallHandler;
	    if (global!=null) {
	    	global();
	    }
	}
});

Cerum.Ajax.registerPostCallHandler(function() {
	if (typeof(window.CerumGlobalPostCallHandler) != "undefined") {
	    var global=CerumGlobalPostCallHandler;
	    if (global!=null) {
	    	global();
	    }
	}
});

Cerum.Ajax.registerFailureHandler(function() {
	if (typeof(window.CerumGlobalFailureHandler) != "undefined") {
	    var global=CerumGlobalFailureHandler;
	    if (global!=null) {
	    	global();
	    }
	}
});

// DEBUG FUNCTIONS
function CerumAjaxDebugEnabled() {
    if (typeof(CerumAjaxDebugEnable)=="undefined") {
        return CerumAjaxDebugEnable==true;
    } else {
        return CerumAjaxDebugEnable==true;
    }
}

