$.provide('shopMf.services').Request=function(serviceName,params,onSuccessCallback,onErrorCallback,onCompleteCallback)
{this._services=[];if(arguments.length)
{this.add(serviceName,params,onSuccessCallback,onErrorCallback,onCompleteCallback);this.send();}};shopMf.services.Request.prototype.add=function(serviceName,params,onSuccessCallback,onErrorCallback,onCompleteCallback)
{this._services.push({serviceName:serviceName,params:params,onSuccessCallback:onSuccessCallback,onErrorCallback:onErrorCallback,onCompleteCallback:onCompleteCallback});};shopMf.services.Request.prototype.addSharedSuccessCallback=function(callback)
{this._services.push({onSuccessCallback:callback});};shopMf.services.Request.prototype.addSharedErrorCallback=function(callback)
{this._services.push({onErrorCallback:callback});};shopMf.services.Request.prototype.addSharedCompleteCallback=function(callback)
{this._services.push({onCompleteCallback:callback});};shopMf.services.Request.prototype.send=function()
{$.ajax({type:'POST',url:'/services.php?_requestType=multipleXml&_responseType=multipleXml&_encoding=utf-8',data:this._getServicesRequestData(),contentType:'text/xml',dataType:'xml',processData:false,timeout:30000,cache:false,context:this,success:function(responseXml)
{var servicesResponses=this._convertServicesResponsesFromXml(responseXml);var indexedResponses=this._convertServicesResponsesToIndexedArray(servicesResponses);var assocResponses=this._convertServicesResponsesToAssocArray(servicesResponses);var serviceNum=0;for(var key in this._services)
{var service=this._services[key];var successCallback=service.onSuccessCallback;var completeCallback=service.onCompleteCallback;if(successCallback)
{if(service.serviceName)
{successCallback(indexedResponses[serviceNum]);serviceNum++;}
else
successCallback(assocResponses);}
if(completeCallback)
{if(service.serviceName)
completeCallback();else
completeCallback();}}},error:function(jqXHR,textStatus)
{for(var key in this._services)
{var service=this._services[key];var errorCallback=service.onErrorCallback;var completeCallback=service.onCompleteCallback;this._applyPostHandlers(service.serviceName,textStatus,false);if(errorCallback)
{if(service.serviceName)
errorCallback(textStatus);else
errorCallback(textStatus);}
if(completeCallback)
{if(service.serviceName)
completeCallback();else
completeCallback();}}}});};shopMf.services.Request.prototype._getServicesRequestData=function()
{var xml='';xml+='<?xml version="1.0" encoding="utf-8"?>'+"\r\n";xml+='<services>'+"\r\n";for(var key in this._services)
{var service=this._services[key];if(service.serviceName)
{xml+='<service>'+"\r\n";xml+='<name>'+this._escapeXml(service.serviceName)+'</name>'+"\r\n";xml+='<params>'+"\r\n";xml+=this._getParamsAsXml(this._applyPreHandlers(service.serviceName,service.params));xml+='</params>'+"\r\n";xml+='</service>'+"\r\n";}}
xml+='</services>'+"\r\n";return xml;};shopMf.services.Request.prototype._getParamsAsXml=function(params)
{var xml='';for(var name in params)
{var value=params[name];if(typeof(value)=='object')
{xml+='<array name="'+this._escapeXml(name)+'">'+"\r\n";xml+=this._getParamsAsXml(value);xml+='</array>'+"\r\n";}
else if(value!=null)
xml+='<string name="'+this._escapeXml(name)+'" value="'+this._escapeXml(value)+'" />'+"\r\n";}
return xml;};shopMf.services.Request.prototype._escapeXml=function(string)
{return String(string).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;");};shopMf.services.Request.prototype._convertServicesResponsesFromXml=function(responseXml)
{var result=[];var servicesNodes=responseXml.documentElement.getElementsByTagName('service');for(var i=0;i<servicesNodes.length;i++)
{var serviceNode=servicesNodes[i];var serviceName=serviceNode.getElementsByTagName('name')[0].firstChild.nodeValue;var responseNode=serviceNode.getElementsByTagName('response')[0];var responseFormat=responseNode.getAttribute('format');var response=responseNode.firstChild.nodeValue;response=this._convertResponse(response,responseFormat);response=this._applyPostHandlers(serviceName,response,true);result.push({serviceName:serviceName,response:response});}
return result;};shopMf.services.Request.prototype._convertResponse=function(text,format)
{if(format=='text')
return String(text);else if(format=='html')
return String(text);else if(format=='xml')
return $.parseXML(text);else if(format=='json')
return $.parseJSON(text);else
return undefined;};shopMf.services.Request.prototype._convertServicesResponsesToIndexedArray=function(servicesResponses)
{var result=[];for(var key in servicesResponses)
{result.push(servicesResponses[key].response);}
return result;};shopMf.services.Request.prototype._convertServicesResponsesToAssocArray=function(servicesResponses)
{var result={};for(var key in servicesResponses)
{var serviceResponse=servicesResponses[key];if(!servicesResponses[serviceResponse.serviceName])
servicesResponses[serviceResponse.serviceName]=[];servicesResponses[serviceResponse.serviceName].push(serviceResponse.response);}
return result;};shopMf.services.Request.prototype._applyPreHandlers=function(serviceName,params)
{var preHandler=this._getHandlersList(shopMf.services.preHandlers)[serviceName];if(preHandler)
{var newParams=preHandler($.extend(true,{},params));if(newParams!=null)
return $.extend(true,{},newParams);}
return params;};shopMf.services.Request.prototype._applyPostHandlers=function(serviceName,response,isSuccess)
{var postHandler=this._getHandlersList(shopMf.services.postHandlers)[serviceName];if(postHandler)
{var newResponse=postHandler(response,isSuccess);if(newResponse!=null)
return newResponse;}
return response;};shopMf.services.Request.prototype._getHandlersList=function(handlers,namePrefix)
{namePrefix=(namePrefix||'');var handlersList={};for(var key in handlers)
{var handler=handlers[key];if(typeof(handler)=='object')
$.extend(handlersList,this._getHandlersList(handler,namePrefix+key+'.'));else
handlersList[namePrefix+key]=handler;}
return handlersList;};

