Login   Register  
PHP Classes
elePHPant
Icontem

File: pajax-core.js

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Guilherme Blanco  >  pAjax  >  pajax-core.js  >  Download  
File: pajax-core.js
Role: Auxiliary data
Content type: text/plain
Description: Core JS Script
Class: pAjax
Do RPC calls from the browser without page reloads
Author: By
Last change: +-----------------------------------------------------------------------------+
| Version 1.5.10 - Date: 2007-01-23 14:15 |
+-----------------------------------------------------------------------------+
- Corrected setFormParam function in pajax-core.js
- Corrected class.pAjax.php method excCall to deal correctly with arrays and
non-array arguments
- Fixed bug in class.pAjaxParser.php, method getPhpType. It was throwing an
error of unsigned offset 0 in $matches variable
- Updated examples (used php short open tags) and now they use the right one
Date: 2007-01-25 16:59
Size: 10,268 bytes
 

Contents

Class file image Download
pAjax.__debugMode__ = false;

pAjax.debug = function (msg) {
    if (pAjax.__debugMode__) alert("pAjax Debug Console:\n\n" + msg);
}

pAjax.getDebugMode = function () { return pAjax.__debugMode__; }
pAjax.setDebugMode = function (bValue) { pAjax.__debugMode__ = bValue; }
pAjax.enableDebugMode = function () { pAjax.setDebugMode(true); }
pAjax.disableDebugMode = function () { pAjax.setDebugMode(false); }


function pAjax() {
    this.__request__ = null;

    if (typeof this.onInit == "function") this.onInit();
}

var _p = pAjax.prototype;


_p.prepare = function (sFuncName, sRequestType) {
    return this.__request__ = new pAjaxRequest(this, sFuncName, sRequestType);
}


_p.getRequest = function () { return this.__request__; }
_p.getReadyState = function () { return this.__request__.getReadyState(); }
_p.getResponse = function () { return this.__request__.getResponse(); }
_p.getXML = function () { return this.__request__.getXML(); }
_p.getText = function () { return this.__request__.getText(); }
_p.getError = function () { return this.__request__.getError(); }
// Backward compatibility
_p.getData = function () { return this.getResponse(); }
_p.toString = function () { return "[object pAjax]"; }




pAjaxRequest.GET = String("GET");
pAjaxRequest.POST = String("POST");

pAjaxRequest.ASYNC = true;
pAjaxRequest.SYNC = false;


function pAjaxRequest(oAjax, sFuncName, sRequestType) {
    this.__ajax__ = oAjax;
    this.__params__ = [];
    this.__URI__ = document.location.href;

    pAjax.debug("XmlHttp Object s being created");

    this.__setFunctionName__(sFuncName);
    this.__xmlHttp__ = XmlHttp.create();

    var oThis = this;
    this.__onreadystatechange__ = function () { oThis.__onreadystatechange(); };

    this.setRequestType(sRequestType);
    this.setUsername(null);
    this.setPassword(null);
}

var _p = pAjaxRequest.prototype;


_p.abort = function () { if (this.__xmlHttp__) this.__xmlHttp__.abort(); }


_p.execute = function (syncType) {
    if (syncType == null) syncType = pAjaxRequest.ASYNC;

    if (typeof syncType == "string")
        syncType = (syncType.toUpperCase() == "SYNC") ? pAjaxRequest.SYNC : pAjaxRequest.ASYNC;

    this.__exec__(syncType);
}


_p.async = function () { this.__exec__(pAjaxRequest.ASYNC); }
_p.sync = function () { this.__exec__(pAjaxRequest.SYNC); }


_p.__exec__ = function (bSync) {
    delete this.__cachedResponse__;

    if (typeof this.__ajax__.onCreate == "function") this.__ajax__.onCreate();

    var xmlDoc = this.__compileXML__();
    var uri = this.__compileURI__();
    var data = (this.__requestType__ == pAjaxRequest.POST) ? xmlDoc.xml : "null";

    this.abort();
    this.__xmlHttp__.open(this.__requestType__, String(uri), bSync, this.__username__, this.__password__);

    // Using Sync calls, Mozilla does not fire onreadystatechange event, but fires onload
    // Also, IE fires onreadystatechange and does not have onload event defined
    if (bSync) this.__xmlHttp__.onreadystatechange = this.__onreadystatechange__;
    else if (typeof this.__xmlHttp__.onload == "undefined") {
        var oThis = this;

        this.__xmlHttp__.onreadystatechange = function () {
            if (oThis.getReadyState() == 4) oThis.__onreadystatechange__();
        };
    } else this.__xmlHttp__.onload = this.__onreadystatechange__;

    pAjax.debug("FUNCTION: " + this.__funcName__ + "\n\nMODE: " + (bSync ? "Asynchronous" : "Synchronous") + "\n\nURI: " + uri + "\n\nPOST:\n" + data);

    // Addon to prevent weird Apache behaviour (encode is necessary to work in Mozilla)
    if (this.__requestType__ == pAjaxRequest.POST)
        this.__xmlHttp__.setRequestHeader("Post-Data", pAjaxParser.encodeURI(data));

    this.__xmlHttp__.send(xmlDoc);
}


_p.__compileXML__ = function () {
    var xmlDoc;

    if (this.__requestType__ == pAjaxRequest.POST) {
        xmlDoc = XmlDocument.create();
        xmlDoc.appendChild(xmlDoc.createElement("pAjaxCall"));

        var methodCall = xmlDoc.documentElement;

        var methodName = xmlDoc.createElement("pAjaxMethod");
        methodName.appendChild(xmlDoc.createTextNode(this.__funcName__));
        methodCall.appendChild(methodName);

        var methodParams = xmlDoc.createElement("pAjaxParams");
        methodCall.appendChild(methodParams);

        for (var item in this.__params__) {
        	if (typeof this.__params__[item] != "function")
		    	methodParams.appendChild(pAjaxParser.jsToXmlValueNode(item, this.__params__[item], xmlDoc));
        }

        return xmlDoc;
    }

    return null;
}


_p.__compileURI__ = function () {
    var uri = this.__URI__;

    if (this.__requestType__ == pAjaxRequest.GET) {
        var params = (function (itens) {
            var aStrItens = [];

            for (var p in itens) {
				if (typeof p[itens] != "function")
					aStrItens.push(pAjaxParser.jsToUrlString(p, itens[p]));
			}

            return aStrItens.join("");
        })(this.__params__);

        uri += ((this.__URI__.indexOf("?") == -1) ? "?" : "&") + "function=" + this.__funcName__;
        uri += params + "&rnd=" + (new Date()).getTime();
    }

    return uri;
}


_p.__onreadystatechange = function () {
    if (typeof this.__ajax__.onChange == "function") this.__ajax__.onChange();

	//alert("Status: " + this.__xmlHttp__.status);
    if (this.__xmlHttp__.readyState == 4 && this.__xmlHttp__.status == 200) {
        this.__cachedResponse__ = this.__xmlHttp__.responseXML;

        if (!this.errorOccurred() && this.__cachedResponse__.xml == "")
            throw new Error("Unknown RPC Error\n\n\n" + this.getText());


        if (this.getError() != null && typeof this.__ajax__.onError == "function")
        	this.__ajax__.onError();
        else {
			pAjax.debug("Recieved:\n\n" + this.__cachedResponse__.xml);

			if (typeof this.__ajax__.onLoad == "function") this.__ajax__.onLoad();
		}

        this.__dispose__();
    }
}


_p.__dispose__ = function () {
    delete this.__xmlHttp__.onreadystatechange;
    this.__xmlHttp__ = null;
}


_p.__setFunctionName__ = function (sFuncName) { this.__funcName__ = sFuncName; }


_p.setFormParam = function (oFormName) {
	if (typeof oFormName == "string") {
		oFormName = document.forms[oFormName] || document.getElementById(oFormName);
    }
    
    var sFormName = oFormName.name || oFormName.id;
    var c_params = new Object();

	for (var i = 0; i < oFormName.elements.length; i++) {
		var el = oFormName.elements[i];

		if (el.type && el.type != undefined) {
			switch (el.type) {
				case "text": case "password": case "hidden":
				case "textarea": case "button": case "submit":
                    c_params[el.name] = el.value;
					//this.setParam(el.name, el.value);
					break;

				case "select-one":
					if (el.selectedIndex >= 0) {
						c_params[el.name] = el.options[el.selectedIndex].value;
                        //this.setParam(el.name, el.options[el.selectedIndex].value);
					}

					break;
					
				case "select-multiple":
					var a = [];
					
					for (var j = 0; j < el.options.length; j++) {
						if (el.options[j].selected) {
							a.push(el.options[j].value);
						}
					}
                    paramName = el.name.replace("[", "");
                    paramName = paramName.replace("]", "");
                    c_params[paramName] = a;
					//this.setParam(el.name, a);
					break;
					
				case "checkbox": case "radio":
					if (el.checked || el.selected) {
                        c_params[el.name] = el.value
						//this.setParam(el.name, el.value);
					}

					break;
					
				default:
					// Does nothing
					break;
			}
		}
	}

    this.setParam(sFormName, c_params);
}


_p.getError = function () {
	if (this.errorOccurred() && this.__xmlHttp__.responseXML != null) {
		return this.__xmlHttp__.responseXML.parseError;
	} else if (this.errorOccurred()) {
		return this.__xmlHttp__.responseText;
	}
	
	return null;
}


_p.errorOccurred = function () { 
	if (!(typeof this.__xmlHttp__.responseXML == "object" && this.__xmlHttp__.responseXML != null)) {
		return true;
	}
	
	return (this.__xmlHttp__.responseXML.parseError && this.__xmlHttp__.responseXML.parseError.errorCode != 0);
}


_p.setParam = function (sParamName, sParamValue) {
   if (sParamValue == null) delete this.__params__[sParamName];
   else this.__params__[sParamName] = sParamValue;
}

_p.getParam = function (sParamName) { return this.__params__[sParamName]; }
_p.delParam = function (sParamName) { this.setParam(sParamName); }
_p.getResponse = function () { return pAjaxParser.parseXmlResponse(this.__cachedResponse__); }
_p.getXML = function () { return this.__cachedResponse__.documentElement.childNodes[0].xml; }
_p.getText = function () { return this.__xmlHttp__.responseText; }
_p.getReadyState = function () { return this.__xmlHttp__.readyState; }
_p.getXmlHttp = function () { return this.__xmlHttp__; }
_p.getLoaded = function () { return this.getReadyState() == 4; }
_p.getLoading = function () { return this.getReadyState() < 4; }
_p.setRequestType = function (sRequestType) { this.__requestType__ = String(sRequestType) || pAjaxRequest.GET; }
_p.getRequestType = function () { return this.__requestType__; }
_p.setURI = function (sURI) { this.__URI__ = sURI; }
_p.getURI = function () { return this.__URI__; }
_p.setUsername = function (sUsername) { this.__username__ = sUsername; }
_p.setPassword = function (sPassword) { this.__password__ = sPassword; }
_p.toString = function () { return "[object pAjaxRequest]"; }




function pAjaxCall(uri, method, callback) {
    var ajax = new pAjax();
    var req = ajax.prepare(method, pAjaxRequest.GET);

    if (uri != null) req.setURI(uri);
    
    if (arguments.length > 3) {
        var a = [];

        for (var i = 3; i < arguments.length; i++)
            a.push(arguments[i]);

        req.setParam("param", ((a.length == 1) ? a.pop() : a));
    }

    ajax.onLoad = function () { callback.call(this, this.getResponse()); }
    req.async();
}