Login   Register  
PHP Classes
elePHPant
Icontem

File: pajax-parser.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-parser.js  >  Download  
File: pajax-parser.js
Role: Auxiliary data
Content type: text/plain
Description: pAjax JS Parser
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 17:00
Size: 8,268 bytes
 

Contents

Class file image Download
pAjaxParser.getJsType = function (v) {
    switch (typeof v) {
        case "object":
            if (v == null || v == undefined)
                throw new Error("Could not set null value as RPC param");
            else if (v.constructor == Date) 
                return "dateTime";
            else if (v.constructor == Array) 
                return "array";
            else return "struct";

        case "string":
            if (v.substr(0, 1) != "0" && parseFloat(v) == v) 
                return "number";
            else if (v.length > 100 || (v.indexOf("<") >= 0 || v.indexOf(">") >= 0))
                return "text";

            return "string";

        default: 
            return typeof v;
    }
}


pAjaxParser.jsDateToIso8601 = function (d) {
    function preZero(n) { return (n > 9) ? String(n) : "0" + n; };

    return d.getFullYear() + preZero(d.getMonth() + 1) + preZero(d.getDate()) + "T" + preZero(d.getHours()) + ":" + preZero(d.getMinutes()) + ":" + preZero(d.getSeconds());
}


pAjaxParser.iso8601ToJsDate = function (s) {
    var d = new Date;

    d.setFullYear(s.substring(0, 4), s.substring(4, 6) - 1, s.substring(6, 8));
    d.setHours(s.substring(9, 11), s.substring(12, 14), s.substring(15, 17), 0);

    return d;
}


pAjaxParser.jsToXmlNode = function (v, xmlDoc) {
    switch (pAjaxParser.getJsType(v)) {
        case "number":
        case "string": 
            return xmlDoc.createTextNode(v);

        case "text": 
            return xmlDoc.createCDATASection(v);

        case "boolean":
            return xmlDoc.createTextNode(v ? "true" : "false");

        case "dateTime": 
            return xmlDoc.createTextNode(pAjaxParser.jsDateToIso8601(v));

        case "array":
            var el = xmlDoc.createElement("data");

            for (var i = 0; i < v.length; i++)
                el.appendChild(pAjaxParser.jsToXmlValueNode("pAjaxItem-" + i, v[i], xmlDoc));

            return el;

        case "struct":
            var el = xmlDoc.createElement("data");

            for (var p in v) {
            	if (typeof v[p] != "function")
				    el.appendChild(pAjaxParser.jsToXmlValueNode(p, v[p], xmlDoc));
            }

            return el;
    }

    throw new Error("Unknown JavaScript Type");
}


pAjaxParser.jsToXmlValueNode = function (n, v, xmlDoc) {
    n = n.replace("[", "__91__");
    n = n.replace("]", "__93__");

	var el = xmlDoc.createElement(n);
    var o = pAjaxParser.jsToXmlNode(v, xmlDoc);

	el.setAttribute("type", pAjaxParser.getJsType(v));

    if (o.nodeName == "data" && !o.getAttribute("type")) {
       	while (o.hasChildNodes())
			el.appendChild(o.firstChild);
	} else el.appendChild(o);
	
    return el;
}


pAjaxParser.jsToUrlString = function (n, v) {
    var str = "";

    switch (pAjaxParser.getJsType(v)) {
        case "string":
        case "text":
            str += "&" + n + "=" + pAjaxParser.encodeURI(v);
            break;

        case "number":
            str += "&" + n + "=" + v;
            break;

        case "boolean":
            str += "&" + n + "=" + (v ? "true" : "false");
            break;

        case "dateTime":
            str += "&" + n + "=" + pAjaxParser.encodeURI(pAjaxParser.jsDateToIso8601(v));
            break;

        case "array":
            for (var i = 0; i < v.length; i++)
                str += pAjaxParser.jsToUrlString(n + "[" + i + "]", v[i]);
            break;

        case "struct":
            for (var p in v)
                str += pAjaxParser.jsToUrlString(n + "[" + p + "]", v[p]);
            break;
    }

    return str;
}


// Correctly handle URI encoding, preventing bug of browsers to convert special chars (ie: ü as ü)
pAjaxParser.encodeURI = function (str) {
    var newStr = ""; var dec;
    var itens = "0123456789ABCDEF";

    for (var i = 0; i < str.length; i++) {
        dec = (str.charAt(i)).charCodeAt(0);

        // 0-9 (48-57), A-Z (65-90), a-z (97-122)
        if (!(dec >= 48 && dec <= 57) && !(dec >= 65 && dec <= 90) && !(dec >= 97 && dec <= 122))
            newStr += "%" + String(itens.charAt((dec - (dec % 16)) / 16) + itens.charAt(dec % 16));
        else newStr += str.charAt(i);
    }

    return newStr;
}


// Handle URI decoding
pAjaxParser.decodeURI = function (str) {
    var newStr = ""; var hex;
    var itens = "0123456789ABCDEF";

    for (var i = 0; i < str.length; i++) {
        if (str.charAt(i) == "%") {
            hex = String(str.charAt(i + 1) + str.charAt(i + 2));
            newStr += String.fromCharCode(parseInt(hex, 16));
            i = i + 2;
        } else {
            newStr += str.charAt(i);

            if (str.charAt(i) == "%" && str.charAt(i + 1) == "%") i++;
        }
    }

    return newStr;
}


pAjaxParser.parseXmlResponse = function (xml) {
    if (xml.parseError && xml.parseError.reason != "") {
        var error = xml.parseError;

        alert("Detailed Description of XML Parse Error:\n\nError Code: " + error.errorCode +
          "\nFile Pos: " + error.filePos + "\nLine: " + error.line +
          "\nLine Pos: " + error.linePos + "\nURL: " + error.url +
          "\nSRC Text: " + error.srcText + "\nReason: " + error.reason);

        throw new Error("XML Parse Error\n\nReason: " + xml.parseError.reason);
    } else if (xml && xml.documentElement != null) {
        var root = xml.documentElement;

        if (root.tagName == "pAjaxError") {
            var e = new Error(pAjaxParser.__getFirstChildElement__(root).text);
            pAjaxParser.__setError__(e);
        }

        return pAjaxParser.xmlRootNodeToJs(root);
    }

    throw new Error("Invalid XML document returned from RPC server");
}


pAjaxParser.xmlNodeToJs = function (oNode) {
    if (oNode.nodeType == 3)
        return oNode.data;

    switch (oNode.getAttribute("type")) {
        case "string":
            return oNode.text;

        case "text":
            return oNode.firstChild.text;

        case "dateTime":
            return pAjaxParser.iso8601ToJsDate(oNode.text);

        case "boolean":
            return (oNode.text == "true") ? 1 : 0;

        case "number":
            return Number(oNode.text);

        case "array":
            var nodeList = oNode.childNodes;
            var res = [];

            for (var i = 0; i < nodeList.length; i++) {
                if (nodeList[i].nodeType == 1)
                    res.push(pAjaxParser.xmlNodeToJs(nodeList[i]));
            }

            return res;

        case "struct":
            var members = oNode.childNodes;
            var o = {};
            var name, value;
            var re = /pAjaxItem-([0-9]*)/i;

            for (var i = 0; i < members.length; i++) {
                if (members[i].nodeType == 1) {
                    name = (!(re.test(members[i].tagName))) ? members[i].tagName : (String(members[i].tagName)).replace(re, "$1");
                    value = pAjaxParser.xmlNodeToJs(members[i]);

                    o[name] = value;
                }
            }

            return o;
            
        default:
            return undefined;
    }
}


pAjaxParser.xmlValueNodeToJs = function (n) {
    var c = pAjaxParser.__getFirstChildElement__(n) || n.firstChild;

    if (c) return pAjaxParser.xmlNodeToJs(c);

    return "";
}


pAjaxParser.xmlRootNodeToJs = function (oNode) {
    var o = {};
    var name, value;
    for (var i = 0; i < oNode.childNodes.length; i++) {
        name = oNode.childNodes[i].tagName;
        value = pAjaxParser.xmlNodeToJs(oNode.childNodes[i]);

        o[name] = value;
    }

    return o.result;
}


pAjaxParser.__getFirstChildElement__ = function (p) {
    var c = p.firstChild;

    while (c) {
        if (c.nodeType == 1) return c;
        c = c.nextSibling;
    }

    return null;
}


pAjaxParser.__getLastChildElement__ = function (p) {
    var c = p.lastChild;

    while (c) {
        if (c.nodeType == 1) return c;
        c = c.previousSibling;
    }
    
    return null;
}


function pAjaxParser() {}