/*START magento xml rpc plugin*/

window.jQuery = window.jQuery || {};


jQuery.magentoRpc = function(url, user, apikey, dataType, onLoadCallback, version) {
return new (
    function(url, user, apikey, dataType, onLoadCallback, version)
    {
        version = version || "1.0";
        dataType = dataType || "xml";
        this.serviceurl = url;
        this.webuser = user;
        this.publickey = apikey;
       

	if(dataType != "json" && dataType != "xml") {
		new Error("IllegalArgument: Unsupported data type");
        }

        var _self = this;

        //takes value and wraps it with appropriate RPC xml tags
        var serializeToXml = function(data) {
            switch (typeof data) {
                case 'boolean':
                    return '<boolean>'+ ((data) ? '1' : '0') +'</boolean>';
                case 'number':
                    var parsed = parseInt(data);
                    if(parsed == data) {
                        return '<int>'+ data +'</int>';
                    }
                    return '<double>'+ data +'</double>';
                case 'string':
                    return '<string>'+ data +'</string>';
                case 'object':
                    if(data instanceof Date) {
                        return '<dateTime.iso8601>'+ data.getFullYear() + data.getMonth() + data.getDate() +'T'+ data.getHours() +':'+ data.getMinutes() +':'+ data.getSeconds() +'</dateTime.iso8601>';
                    } else if(data instanceof Array) {
                        var ret = '<array><data>'+"\n";
                        for (var i=0; i < data.length; i++) {
                            ret += '  <value>'+ serializeToXml(data[i]) +"</value>\n";
                        }
                        ret += '</data></array>';
                        return ret;
                    } else {
                        var ret = '<struct>'+"\n";
                        jQuery.each(data, function(key, value) {
                            ret += "  <member><name>"+ key +"</name><value>";
                            ret += serializeToXml(value) +"</value></member>\n";
                        });
                        ret += '</struct>';
                        return ret;
                    }
              }
	 }

         //creates xml request to RPC webservice
        var xmlRpc = function(method, params) {
            var ret = '<?xml version="'+version+'"?><methodCall><methodName>'+method+'</methodName><params>';
            //if method is call then
            //first param is session key
            //second param is actual method in webservice
            //third param is serialized string of parameters for method
            //encodeURIComponent and decodeURIComponent used to encode and decode parameters
            if(method != "call")
            {

               for(var i=0; i<params.length; i++) {
                    ret += "<param><value>"+serializeToXml(params[i])+"</value></param>";
               }        
            }
            else
            {
                ret += "<param><value>"+serializeToXml(params[0])+"</value></param>";
                ret += "<param><value>"+serializeToXml(params[1])+"</value></param>";
                if(params.length == 3)
                {
                    var webserviceMethodParamsArray = new Array();
                    var deserializeHelperArray = params[2].split("&");

                    /*
                    if(deserializeHelperArray.length == 1)
                    {
                        ret += "<param><value>"+serializeToXml(decodeURIComponent(deserializeHelperArray[0]))+"</value></param>";
                    }
                    else
                    {*/
                        for(var a = 0; a < deserializeHelperArray.length; a++)
                        {
                            //decodeURIComponent()
                            webserviceMethodParamsArray[a] = deserializeHelperArray[a];
                        }
                        //here is where jquery serialized params become javascript array object
                        ret += "<param><value>"+serializeToXml(webserviceMethodParamsArray)+"</value></param>";

                    //}
                }
            }

            ret += "</params></methodCall>";
            return ret;
        }

        //takes RPC xml parameter and returns clean value
        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;
                }
            }
        }

        //takes RPC response and parses it
        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'
        };

        //local function to make a call to XML RPC webservice
        var _rpc = function(method, arguments, callback) {
            
            var params = arguments.split("=");

            //for (var i=2; i<arguments.length; i++) {
            //        params.push(arguments[i]);
            //}
             
            
            var data;
            if(dataType == 'json') {
                    data = {"version":version, "method":method, "params":params};
            } else {
                    data = xmlRpc(method, params);
            }

            jQuery.ajax({
                    "url": url,
                    "dataType": dataType,
                    "type": "POST",
                    "data": data,
                    "success": function(inp) {
                            
                            var json = inp;
                            if(dataType == "xml") {
                                    json = parseXmlResponse(inp);
                            }
                            
                            callback(json);
                    },
                    "processData": false,
                    "contentType": rpc_contents[dataType]
            });
            
        };

        //use this method to make a call to magento web services
        this.request = function(method, params, onRequestCallBack){

           //open method session
          _rpc("login", this.webuser + "=" + this.publickey, function(session){

                var call_params = session.result + "=" + method;
                if(params != "")
                {
                        call_params = call_params + "=" + params;
                }
                
                //execute method
                _rpc("call", call_params, function(data){
                    
                    //execute mehod callback
                    onRequestCallBack(data);

                    //close method session
                    _rpc("endSession", session.result);

                    
                });
           });
        }

        // console.log('Load was performed.');
        if(onLoadCallback) {
                onLoadCallback(_self);
        }
    }
)
(url, user, apikey, dataType, onLoadCallback, version);
};


/* END magento xml rpc plugin*/


