function AjaxRequest(url, options) {
var xmlHttpReq;
var opts = options;
var returnArgs = opts.returnArgs;
var method = opts.method;
var ajaxId = opts.ajaxId;
if (window.XMLHttpRequest) {
xmlHttpReq = new XMLHttpRequest();
if (xmlHttpReq.overrideMimeType) {
xmlHttpReq.overrideMimeType("text/html");
}
}
else if (window.ActiveXObject) {
try {
xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
try {
xmlHttpReq = new XMLHttpRequest();
}
catch (e) {
}
}
}
}
var onComplete = opts.onComplete;
var returnFunction = function() {
if (xmlHttpReq.readyState == 4) {
try {
if (xmlHttpReq.status == 200) {
var ajaxId = xmlHttpReq.getResponseHeader("Ajax-ID");
if (onComplete) {
onComplete(xmlHttpReq, returnArgs);
}
if (ajaxId && ajaxId != "") {
AjaxUtil.remove(parseInt(ajaxId));
}
}
}
catch(e) {
}
}
}
var send = function(url) {
var urlArray = url.split("?");
var path = urlArray[0];
var query = urlArray[1];
try {
if (method == "get") {
xmlHttpReq.open("GET", url, true);
xmlHttpReq.onreadystatechange = returnFunction;
xmlHttpReq.send("");
}
else {
xmlHttpReq.open("POST", path, true);
xmlHttpReq.setRequestHeader("Method", "POST " + path + " HTTP/1.1");
xmlHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttpReq.setRequestHeader("Ajax-ID", ajaxId);
xmlHttpReq.onreadystatechange = returnFunction;
xmlHttpReq.send(query);
}
}
catch (e) {
}
}
send(url);
this.resend = function(url, options) {
opts = options;
onComplete = opts.onComplete;
send(url);
};
this.getId = function() {
return ajaxId;
};
this.cleanUp = function() {
xmlHttpReq.onreadystatechange = function() {};
returnFunction = null;
returnArgs = null;
xmlHttpReq = null;
};
}
var AjaxUtil = {
counter : 1,
requests : new Array(),
request : function(url, options) {
/*
 * OPTIONS:
 * onComplete (function) - function to call after response is received
 * returnArgs (object) - object to pass to return function
 * reverseAjax (boolean) - use reverse ajax. (only one at a time)
 * method (string) - use "get" or "post". Default is post.
 */
var opts = (options == null) ? (new Object()) : options;
var ajaxId = (opts.reverseAjax) ? 0 : AjaxUtil.getNextId();
opts.ajaxId = ajaxId;
var request;
if (ajaxId == 0 && AjaxUtil.requests[0]) {
request = AjaxUtil.requests[0];
request.resend(url, opts);
}
else {
request = new AjaxRequest(url, opts);
AjaxUtil.requests[ajaxId] = request;
}
if (!opts.onComplete) {
AjaxUtil.remove(ajaxId);
}
},
update : function(url, id, options) {
var element = $(id);
if (element) {
if (options == null) {
options = new Object();
}
var origOnComplete = options.onComplete;
options.onComplete = function(xmlHttpReq, returnArgs) {
element.innerHTML = xmlHttpReq.responseText;
executeLoadedScript(element);
if (origOnComplete) {
origOnComplete();
}
}
AjaxUtil.request(url, options);
}
},
getNextId : function() {
var id = AjaxUtil.counter++;
if (AjaxUtil.counter > 20) {
/* Reset array in a round-robin fashion */
/* Reserve index 0 for reverse ajax requests */
AjaxUtil.counter = 1;
}
return id;
},
remove : function(id) {
if (id) {
var request = AjaxUtil.requests[id];
if (request) {
request.cleanUp();
request = null;
}
}
}
}
var ReverseAjax = {
initialize: function() {
Event.observe(window, "unload", function() {ReverseAjax.release();});
ReverseAjax.request();
},
request: function() {
AjaxUtil.request(themeDisplay.getPathMain() + "/portal/reverse_ajax",
{
onComplete: ReverseAjax.response,
reverseAjax: true
});
},
response: function(xmlHttpRequest) {
var res =$J(xmlHttpRequest.responseText);
var status = res.status;
if (status && status != "failure") {
if (status == "success") {
if (res.chatMessages) {
Messaging.getChatsReturn(res.chatMessages);
}
if (res.chatRoster) {
MessagingRoster.getEntriesReturn(res.chatRoster);
}
}
ReverseAjax.request();
}
},
release : function() {
AjaxUtil.request(themeDisplay.getPathMain() + "/portal/reverse_ajax?release=1", {reverseAjax:true});
}
}
function $J(JSONText) {
return eval("(" + JSONText + ")");
}
function executeLoadedScript(el) {
var scripts = el.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
if (scripts[i].src) {
var head = document.getElementsByTagName("head")[0];
var scriptObj = document.createElement("script");
scriptObj.setAttribute("type", "text/javascript");
scriptObj.setAttribute("src", scripts[i].src);
head.appendChild(scriptObj);
}
else {
try {
if (is_safari) {
eval(scripts[i].innerHTML);
}
else if (is_mozilla) {
eval(scripts[i].textContent);
}
else {
eval(scripts[i].text);
}
}
catch (e) {
//alert(e);
}
}
}
}
function loadForm(form, action, elId, returnFunction) {
var pos = action.indexOf("?");
var path = action;
var queryString = "";
if (pos != -1) {
path = action.substring(0, pos);
queryString = action.substring(pos + 1, action.length);
}
if (!endsWith(queryString, "&")) {
queryString += "&";
}
for (var i = 0; i < form.elements.length; i++) {
var e = form.elements[i];
if ((e.name != null) && (e.value != null)) {
queryString += e.name + "=" + encodeURIComponent(e.value) + "&";
}
}
if (elId != null) {
document.body.style.cursor = "wait";
pos = path.indexOf("/portal/layout");
path = path.substring(0, pos) + "/portal/render_portlet";
returnFunction =
function (xmlHttpReq) {
document.getElementById(elId).innerHTML = xmlHttpReq.responseText;
document.body.style.cursor = "default";
};
}
loadPage(path, queryString, returnFunction);
}
/*
 * NOTE: loadPage() has been depricated.  Use AjaxUtil.request() instead
 */
function loadPage(path, queryString, returnFunction, returnArgs) {
AjaxUtil.request(path + "?" + queryString, {
onComplete: returnFunction,
returnArgs: returnArgs
});
}
function printJSON(data) {
if (data && data.id) {
var target = document.getElementById(data.id);
if (target) {
target.innerHTML = data.toString();
}
}
}