window.jQuery = window.jQuery || {};
window.jQuery.fn = window.jQuery.fn || {};
jQuery.fn.rpc = function(url, dataType, onLoadCallback, version) {
version = version || "1.0";
dataType = dataType || "json";
if(dataType != "json" && dataType != "xml") {
new Error("IllegalArgument: Unsupported data type");
}
var _self = this;
var serializeToXml = function(data) {
switch (typeof data) {
case 'boolean':
return ''+ ((data) ? '1' : '0') +'';
case 'number':
var parsed = parseInt(data);
if(parsed == data) {
return ''+ data +'';
}
return ''+ data +'';
case 'string':
return ''+ data +'';
case 'object':
if(data instanceof Date) {
return ''+ data.getFullYear() + data.getMonth() + data.getDate() +'T'+ data.getHours() +':'+ data.getMinutes() +':'+ data.getSeconds() +'';
} else if(data instanceof Array) {
var ret = ''+"\n";
for (var i=0; i < data.length; i++) {
ret += ' '+ serializeToXml(data[i]) +"\n";
}
ret += '';
return ret;
} else {
var ret = ''+"\n";
jQuery.each(data, function(key, value) {
ret += " "+ key +"";
ret += serializeToXml(value) +"\n";
});
ret += '';
return ret;
}
}
}
var xmlRpc = function(method, params) {
var ret = ''+method+'';
for(var i=0; i"+serializeToXml(params[i])+"";
}
ret += "";
return ret;
}
var parseXmlValue = function(node) {
childs = jQuery(node).children();
for(var i=0; i < childs.length; i++) {
switch(childs[i].tagName) {
case 'boolean':
return (jQuery(childs[i]).text() == 1);
case 'int':
return parseInt(jQuery(childs[i]).text());
case 'double':
return parseFloat(jQuery(childs[i]).text());
case "string":
return jQuery(childs[i]).text();
case "array":
var ret = [];
jQuery("> data > value", childs[i]).each(
function() {
ret.push(parseXmlValue(this));
}
);
return ret;
case "struct":
var ret = {};
jQuery("> member", childs[i]).each(
function() {
ret[jQuery( "> name", this).text()] = parseXmlValue(jQuery("value", this));
}
);
return ret;
case "dateTime.iso8601":
/* TODO: fill me :( */
return NULL;
}
}
}
var parseXmlResponse = function(data) {
var ret = {};
ret.version = version;
jQuery("methodResponse params param > value", data).each(
function(index) {
ret.result = parseXmlValue(this);
}
);
jQuery("methodResponse fault > value", data).each(
function(index) {
ret.error = parseXmlValue(this);
}
);
return ret;
}
var rpc_contents = {
'xml':'text/xml'
,'json':'application/json'
};
var _rpc = function(method, callback) {
var params = [];
for (var i=2; i