// remote scripting library
// (c) copyright 2005 modernmethod, inc
var sajax_debug_mode = false;
var sajax_failure_redirect = "";
var sajax_remote_uri = "";
var sajax_request_type = "";
var sajax_target_id = "";
function sajax_debug(text) {
if (sajax_debug_mode) {
alert(text);
}
return true;
}
function sajax_failure(text) {
if(sajax_failure_redirect != "" && !sajax_debug_mode) {
window.location.href = sajax_failure_redirect;
} else {
sajax_debug(text);
}
return false;
}
var sajax_requests = [];
function sajax_cancel(id) {
if(arguments.length === 0) {
for (var i = 0; i < sajax_requests.length; i++) {
if(sajax_requests[i]) {
sajax_requests[i].abort();
sajax_requests.splice(i, 1, null);
}
}
} else if(sajax_requests[id]) {
sajax_requests[id].abort();
sajax_requests.splice(id, 1, null);
}
}
//Support IE 5
if (typeof(encodeURIComponent) == "undefined") {
encodeURIComponent = function(string) {
this.encodeChar = function(c) {
c = c.charCodeAt(0);
var utf8 = "";
if (c < 128) {
utf8 += String.fromCharCode(c);
} else if((c > 127) && (c < 2048)) {
utf8 += String.fromCharCode((c >> 6) | 192);
utf8 += String.fromCharCode((c & 63) | 128);
} else {
utf8 += String.fromCharCode((c >> 12) | 224);
utf8 += String.fromCharCode(((c >> 6) & 63) | 128);
utf8 += String.fromCharCode((c & 63) | 128);
}
var encoded = "";
for(var i = 0; i < utf8.length; i++) {
encoded += "%"+utf8.charCodeAt(i).toString(16).toUpperCase();
}
return encoded;
};
string = string.replace(/\r\n/g,"\n");
var encoded = "";
for (var n = 0; n < string.length; n++) {
if(string.charAt(n).match(/[~!*()'a-z0-9]/i) === null) {
encoded += encodeChar(string.charAt(n));
} else {
encoded += string.charAt(n);
}
}
return encoded;
};
}
//Support IE 5, 5.5 and 6
if (typeof(window.XMLHttpRequest) == "undefined") {
window.XMLHttpRequest = function() {
var msxmlhttp = Array(
'Msxml2.XMLHTTP.6.0',
'Msxml2.XMLHTTP.5.0',
'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0',
'Msxml2.XMLHTTP',
'Microsoft.XMLHTTP');
for (var i = 0; i < msxmlhttp.length; i++) {
try { return new window.ActiveXObject(msxmlhttp[i]); }
catch(e) {}
}
return null;
};
}
function sajax_do_call(func_name, args, method, asynchronous, uri) {
//Handle old code calls
switch(arguments.length) {
case 0:
return false;
case 1:
var args = [];
case 2:
var method = "GET";
case 3:
var asynchronous = true;
case 4:
var uri = "";
}
if(sajax_request_type != "") {
method = sajax_request_type;
}
if(method !== "POST") {
method = "GET";
}
if(sajax_remote_uri != "") {
uri = sajax_remote_uri;
}
if(uri == "") {
uri = window.location.href.replace(/#.*$/, "");
}
var i, x;
var geturi = "";
var data;
var target_id = sajax_target_id;
var argsarray = Array();
sajax_debug("in sajax_do_call().." + method + "/" + sajax_target_id);
for(i = 0; i < args.length-1; i++) {
argsarray[i] = args[i];
}
data = "rs=" + encodeURIComponent(func_name);
if(argsarray.length > 0) {
try {
//the ending & is here to avoide issues with safari 1.2 appending junk on POST
data += "&rsargs=" + encodeURIComponent(JSON.stringify(argsarray)) + '&';
} catch(e) {
return sajax_failure("JSON.stringify() failed for user agent:\n" + navigator.userAgent);
}
}
try {
x = new window.XMLHttpRequest();
} catch(e) {}
if(x === null || typeof x.readyState !== "number") {
//TODO support iframe ajaxing
//document.getElementsByTagName("pre")[0].innerHTML
return sajax_failure("NULL sajax object for user agent:\n" + navigator.userAgent);
}
if(method == "POST" && typeof x.setRequestHeader == "undefined") {
//TODO convert uri to absolute uri
if((uri+data).length < 512) {
sajax_debug("Browser did not support POST, switching to GET");
method = "GET";
} else {
return sajax_failure("Request failed for user agent:\n" + navigator.userAgent);
}
}
if (method == "GET") {
geturi = uri;
if (geturi.indexOf("?") == -1) {
geturi += "?" + data;
} else {
geturi += "&" + data;
}
if(geturi.length > 512){
method = "POST";
sajax_debug("Data to long for GET switching to POST");
} else {
uri = geturi;
data = null;
}
}
x.open(method, uri, asynchronous);
if (method == "POST") {
x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
//Prevent Opera from executing the callback multiple times.
var alreadydone = false;
var responcefunc = function() {
if (alreadydone === true) {
return false;
}
if (x.readyState != 4) {
return false;
}
var status;
var data;
var txt = x.responseText.replace(/^\s*|\s*$/g,"");
status = txt.charAt(0);
if(status == "-" || status == "+") {
data = txt.substring(2);
} else {
data = txt;
}
if(status == "" && (x.status == 200 || x.status == "" || x.status == "12019")) {
// let's just assume this is a pre-response bailout and let it slide for now
return false;
} else if(status != "+" || x.status != 200) {
alert("Error " + x.status + ": " + data);
return false;
} else {
alreadydone = true;
var callback;
var extra_data = false;
if (typeof args[args.length-1] == "object") {
callback = args[args.length-1].callback;
extra_data = args[args.length-1].extra_data;
} else {
callback = args[args.length-1];
}
try {
if(typeof(JSON) != "undefined" && typeof(JSON.parse) != "undefined") {
try {
var res = JSON.parse(data);
} catch(e) {
return sajax_failure("JSON.parse failed for user agent:\n" + navigator.userAgent);
}
} else {
sajax_debug("Warning: JSON is being directly executed via eval()!");
eval("var res = ("+data+"); res;");
}
if(target_id) {
document.getElementById(target_id).innerHTML = res;
} else {
callback(res, extra_data);
}
sajax_requests.splice(id, 1, null);
} catch(e) {
sajax_debug("Caught error " + e + ": Could not parse " + data );
return false;
}
}
return true;
};
if(asynchronous) {
x.onreadystatechange = responcefunc;
}
sajax_debug(func_name + " uri = " + uri + "/post = " + data);
try {
x.send(data);
}
catch(e) {
if(method === "POST" && geturi === "") {
sajax_debug("Browser did not support POST, tyring GET instead");
sajax_request_type = "";
return sajax_do_call(func_name, args, "GET", asynchronous);
} else {
return sajax_failure("Request failed for user agent:\n" + navigator.userAgent);
}
}
sajax_debug(func_name + " waiting..");
if(asynchronous) {
var id = sajax_requests.length;
sajax_requests[id] = x;
return id;
} else {
return responcefunc();
}
}