function Jax() {
    var loadingTimeout = 400;
    var iframe;
    this.loadingFunction = function() {};
    this.doneLoadingFunction = function() {};
    this.stringify = function(arg) {
        var c, i, l, o, u, v;
        switch (typeof arg) {
        case 'object':
            if (arg) {
                if (arg.constructor == Array) {
                    o = '';
                    for (i = 0; i < arg.length; ++i) {
                        v = this.stringify(arg[i]);
                        if (o && (v !== u)) {
                            o += ',';
                        }
                        if (v !== u) {
                            o += v;
                        }
                    }
                    return '[' + o + ']';
                } else if (typeof arg.toString != 'undefined') {
                    o = '';
                    for (i in arg) {
                        v = this.stringify(arg[i]);
                        if (v !== u) {
                            if (o) {
                                o += ',';
                            }
                            o += this.stringify(i) + ':' + v;
                        }
                    }
                    return '{' + o + '}';
                } else {
                    return;
                }
            }
            return '';
        case 'unknown':
        case 'undefined':
        case 'function':
            return u;
        case 'string':
            arg = arg.replace(/"/g, "\\\"");
            l = arg.length;
            o = '"';
            for (i = 0; i < l; i += 1) {
                c = arg.charAt(i);
                if (c >= ' ') {
                    if (c == '\\' || c == '"') {
                        o += '\\';
                    }
                    o += c;
                } else {
                    switch (c) {
                    case '"':
                        o += '\\"';
                        break;
                    case '\b':
                        o += '\\b';
                        break;
                    case '\f':
                        o += '\\f';
                        break;
                    case '\n':
                        o += '\\n';
                        break;
                    case '\r':
                        o += '\\r';
                        break;
                    case '\t':
                        o += '\\t';
                        break;
                    default:
                        c = c.charCodeAt();
                        o += '\\u00';
                        o += Math.floor(c / 16).toString(16);
                        o += (c % 16).toString(16);
                    }
                }
            }
            return o + '"';
        default:
            return String(arg);
        }
    }
    this.getRequestObject = function() {
        if (window.XMLHttpRequest) {
            http_request = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            var msxmlhttp = new Array('Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
            for (var i = 0; i < msxmlhttp.length; i++) {
                try {
                    http_request = new ActiveXObject(msxmlhttp[i]);
                } catch(e) {
                    http_request = null;
                }
            }
        }
        if (!http_request) {
            alert('Unfortunatelly you browser doesn\'t support this feature.');
            return false;
        }
        return http_request;
    }
    this.$ = function(sId) {
        if (!sId) {
            return null;
        }
        var returnObj = document.getElementById(sId);
        if (!returnObj && document.all) {
            returnObj = document.all[sId];
        }
        return returnObj;
    }
    this.addEvent = function(obj, type, fn) {
        if (obj.attachEvent) {
            obj['e' + type + fn] = fn;
            obj[type + fn] = function() {
                obj['e' + type + fn](window.event);
            }
            obj.attachEvent('on' + type, obj[type + fn]);
        } else {
            obj.addEventListener(type, fn, false);
        }
    }
    this.removeEvent = function(obj, type, fn) {
        if (obj.detachEvent) {
            obj.detachEvent('on' + type, obj[type + fn]);
            obj[type + fn] = null;
        } else {
            obj.removeEventListener(type, fn, false);
        }
    }
    this.submitITask = function(comName, func, postData, responseFunc) {
        var xmlReq = this.buildXmlReq(comName, func, postData, responseFunc, true);
        this.loadingFunction();
        if (!this.iframe) {
            this.iframe = document.createElement('iframe');
            this.iframe.setAttribute("id", 'ajaxIframe');
            this.iframe.setAttribute("height", 0);
            this.iframe.setAttribute("width", 0);
            this.iframe.setAttribute("border", 0);
            this.iframe.style.visibility = 'hidden';
            document.body.appendChild(this.iframe);
            this.iframe.src = xmlReq;
        } else {
            this.iframe.src = xmlReq;
        }
    }
    this.extractIFrameBody = function(iFrameEl) {
        var doc = null;
        if (iFrameEl.contentDocument) {
            doc = iFrameEl.contentDocument;
        } else if (iFrameEl.contentWindow) {
            doc = iFrameEl.contentWindow.document;
        } else if (iFrameEl.document) {
            doc = iFrameEl.document;
        } else {
            alert("Error: could not find sumiFrame document");
            return null;
        }
        return doc.body;
    }
    this.buildXmlReq = function(comName, func, postData, responseFunc, iframe) {
        var xmlReq = '';
        if (iframe) {
            xmlReq += '?';
        } else {
            xmlReq += '&';
        }
        xmlReq += 'option=' + comName;
        xmlReq += '&no_html=1';
        xmlReq += '&task=azrul_ajax';
        xmlReq += '&func=' + func;
        if (postData) {
            xmlReq += "&" + postData;
        }
        return xmlReq;
    }
    this.submitTask = function(comName, func, postData, responseFunc) {
        var xmlhttp = this.getRequestObject();
        var targetUrl = jax_live_site;
        xmlhttp.open('POST', targetUrl, true);
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                    jax.doneLoadingFunction();
                    jax.processResponse(xmlhttp.responseText);
                } else {}
            }
        }
        var id = 1;
        var xmlReq = this.buildXmlReq(comName, func, postData, responseFunc);
        this.loadingFunction();
        xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xmlhttp.send(xmlReq);
    }
    this.processIResponse = function() {
        jax.doneLoadingFunction();
        var resp = (this.extractIFrameBody(this.iframe).innerHTML);
        resp = resp.replace(/&lt;/g, "<");
        resp = resp.replace(/&gt;/g, ">");
        resp = resp.replace(/&amp;/g, "&");
        resp = resp.replace(/&quot;/g, '"');
        resp = resp.replace(/&#39;/g, "'");
        this.processResponse(resp);
    }
    this.processResponse = function(responseTxt) {
        var result = eval(responseTxt);
        for (var i = 0; i < result.length; i++) {
            var cmd = result[i][0];
            var id = result[i][1];
            var property = result[i][2];
            var data = result[i][3];
            var objElement = this.$(id);
            switch (cmd) {
            case 'as':
                if (objElement) {
                    eval("objElement." + property + "=  data \; ");
                }
                break;
            case 'al':
                if (data) {
                    alert(data);
                }
                break;
            case 'ce':
                this.create(id, property, data);
                break;
            case 'rm':
                this.remove(id);
                break;
            case 'cs':
                var scr = id + '(';
                if (this.isArray(data)) {
                    scr += '(data[0])';
                    for (var l = 1; l < data.length; l++) {
                        scr += ',(data[' + l + '])';
                    }
                } else {
                    scr += 'data';
                }
                scr += ');';
                eval(scr);
                break;
            default:
                alert("Unknow command: " + cmd);
            }
        }
        delete responseTxt;
    }
    this.isArray = function(obj) {
        if (obj) {
            return obj.constructor == Array;
        }
        return false;
    }
    this.buildCall = function(comName, sFunction) {}
    this.icall = function(comName, sFunction) {
        var arg = "";
        if (arguments.length > 2) {
            for (var i = 2; i < arguments.length; i++) {
                var a = arguments[i];
                if (this.isArray(a)) {
                    arg += "arg" + i + "=" + this.stringify(a) + "&";
                } else if (typeof a == "string") {
                    var t = new Array('_d_', encodeURIComponent(a));
                    arg += "arg" + i + "=" + this.stringify(t) + "&";
                } else {
                    var t = new Array('_d_', encodeURIComponent(a));
                    arg += "arg" + i + "=" + this.stringify(t) + "&";
                }
            }
        }
        if (jax_site_type == '1.5') {
            this.submitTask(comName, sFunction, arg);
        } else {
            this.submitITask(comName, sFunction, arg);
        }
    }
    this.call = function(comName, sFunction) {
        var arg = "";
        if (arguments.length > 2) {
            for (var i = 2; i < arguments.length; i++) {
                var a = arguments[i];
                if (this.isArray(a)) {
                    arg += "arg" + i + "=" + this.stringify(a) + "&";
                } else if (typeof a == "string") {
                    a = a.replace(/"/g, "&quot;");
                    var t = new Array('_d_', encodeURIComponent(a));
                    arg += "arg" + i + "=" + this.stringify(t) + "&";
                } else {
                    var t = new Array('_d_', encodeURIComponent(a));
                    arg += "arg" + i + "=" + this.stringify(t) + "&";
                }
            }
        }
        this.submitTask(comName, sFunction, arg);
    }
    this.create = function(sParentId, sTag, sId) {
        var objParent = this.$(sParentId);
        objElement = document.createElement(sTag);
        objElement.setAttribute('id', sId);
        if (objParent) {
            objParent.appendChild(objElement);
        }
    }
    this.remove = function(sId) {
        objElement = this.$(sId);
        if (objElement && objElement.parentNode && objElement.parentNode.removeChild) {
            objElement.parentNode.removeChild(objElement);
        }
    }
    this.getFormValues = function(frm) {
        var objForm;
        objForm = this.$(frm);
        if (!Array.prototype.indexOf) {
            Array.prototype.indexOf = function(elt) {
                var len = this.length;
                var from = Number(arguments[1]) || 0;
                from = (from < 0) ? Math.ceil(from) : Math.floor(from);
                if (from < 0) from += len;
                for (; from < len; from++) {
                    if (from in this && this[from] === elt) return from;
                }
                return - 1;
            };
        }
        var postData = new Array();
        if (objForm && objForm.tagName == 'FORM') {
            var formElements = objForm.elements;
            var assCheckbox = new Array();
            var assCntIdx = 0;
            if (formElements.length > 0) {
                for (var i = 0; i < formElements.length; i++) {
                    if (!formElements[i].name) {
                        continue;
                    }
                    if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false) {
                        continue;
                    }
                    var name = formElements[i].name;
                    if (name) {
                        if (formElements[i].type == 'select-multiple') {
                            postData[i] = new Array();
                            for (var j = 0; j < formElements[i].length; j++) {
                                if (formElements[i].options[j].selected === true) {
                                    var value = formElements[i].options[j].value;
                                    postData[i][j] = new Array(name, encodeURIComponent(value));
                                }
                            }
                        } else if (formElements[i].type == 'checkbox') {
                            if (assCheckbox.indexOf(formElements[i].name) == -1) {
                                assCheckbox[assCntIdx] = formElements[i].name assCntIdx++;
                            }
                        } else {
                            var value = formElements[i].value;
                            value = value.replace(/"/g, "&quot;");
                            postData[i] = new Array(name, encodeURIComponent(value));
                        }
                    }
                }
            }
            if (assCheckbox.length > 0) {
                for (var i = 0; i < assCheckbox.length; i++) {
                    var objCheckbox = document.getElementsByName(assCheckbox[i]);
                    if (objCheckbox) {
                        if (objCheckbox.length > 1) {
                            var tmpIdx = 0;
                            var curLen = postData.length;
                            postData[curLen] = new Array();
                            for (var j = 0; j < objCheckbox.length; j++) {
                                if (objCheckbox[j].checked) {
                                    var value = objCheckbox[j].value;
                                    value = value.replace(/"/g, "&quot;");
                                    postData[curLen][j] = new Array(assCheckbox[i], encodeURIComponent(value));
                                    tmpIdx++;
                                }
                            }
                        } else {
                            if (objCheckbox[0].checked) {
                                var value = objCheckbox[0].value;
                                value = value.replace(/"/g, "&quot;");
                                postData[postData.length] = new Array(assCheckbox[i], encodeURIComponent(value));
                            }
                        }
                    }
                }
            }
        }
        return postData;
    }
}
function jax_iresponse() {
    jax.processIResponse();
}
var jax = new Jax();