// my lil soap

var soapStatusOK = "ok";
var soapStatusError = "error";

var XEPErrorCodeNeedAuth = "needauth";

var defaultSOAPurl = "/elama_api/XEP/";

var defaultXEPVersion = "1.10";

var XEPCreateImage = "CreateImage";
var XEPUpdateImage = "UpdateImage";
var XEPGetImagesList = "GetImagesList";
var XEPGetImage = "GetImage";
var XEPGetAccountsList = "GetAccountsList";
var XEPGetCampaignsList = "GetCampaignsList";
var XEPRunCampaign = "RunCampaign";
var XEPGetRegions = "GetRegions";
var XEPGetSimilar = "GetSimilar";
var XEPGetAssociated = "GetAssociated";
var XEPRegisterUser = "Register";

function GetCommandXML(sCommand, arrParams)
{
    //<?xml version="1.0" encoding="UTF-8"?> <root><param name="command">SaveImage</param><param name="name"><![CDATA[имя образа]]></param><param name="xml"><![CDATA[фыв]]></param></root>
    //<?xml version="1.0" encoding="UTF-8"?> <root status="ok"><field name="533">имя образа</field></root>
    var ret = '<?xml version="1.0" encoding="UTF-8"?>';
    
    ret += '<root version="' + defaultXEPVersion + '"><param name="command">' + sCommand + '</param>\r\n';

    for (x in arrParams)
    {
        var paramName = x;
        var paramValue = arrParams[x];
        ret += '<param name="' + paramName + '"><![CDATA[' + paramValue + ']]></param>';
    }
    
    ret += '</root>';
    
    return ret;
}

function BeginSendCommand(fCallbackOK, fCallbackError, cmdXML, soapUrl)
{
    alert('Вызвана старая версия BeginSendCommand (' + fCallbackOK + ', ' + fCallbackError + ', ' + cmdXML + ', ' + soapUrl + ')');
    return;

    if (soapUrl == null)
    {
        soapUrl = defaultSOAPurl;
    }
    setStatus("Отправляем запрос", true);
    var postData = cmdXML;
    $.ajax({
            type: "POST",
            url: soapUrl,
            data: postData,
            success: function(xml, responseText)
            {
                fCallbackOK(xml);
            },
            error: function(obj, msg, exc)
            {
                fCallbackError(obj, msg);
            },
            complete: function(obj, msg)
            {
            }
        });
}

function GetPacketInfo(xml)
{
    var retArray = new Object();
    var rootNode = $('root', xml);

    retArray["status"] = rootNode.attr('status');
    retArray["text"] = rootNode.attr('text');
    return retArray;
}

function GetPacketFields(xml)
{
    var retArray = new Object();
    
    $('field', xml).each (function (index, el)
                            {
                                el = $(el);
                                var elId = el.attr('name');
                                var elValue = el.text();
                                retArray["" + elId] = elValue;
                            });
    
    return retArray;
}

function objGetXEPRequest()
{
    var inst = new Object();
    
    inst.Parts = new Array();
    
    
    inst.AddPart = function (sCommandName, aParams, bCDATAObligative)
    {
        var part = objGetXEPRequestPart(sCommandName);
        part.AddParams(aParams, bCDATAObligative);
        inst.Parts[inst.Parts.length] = part;
        return part;
    }
    
    inst.GetOuterXML = function()
    {
        var sXML = '<?xml version="1.0" encoding="UTF-8"?>';
        
        sXML += '<root version="' + defaultXEPVersion + '">';
        
        sXML += '<header />'; // Резерв
        
        
        for (partIndex in inst.Parts)
        {
            var part = inst.Parts[partIndex];
            sXML += part.GetOuterXML();
        }
        
        sXML += '</root>';
        
        return sXML;
    }
    
    inst.Perform = function (fCallbackOK, fCallbackError, soapUrl) // STUB добавить ByPassParams
    {
        if (soapUrl == null)
        {
            soapUrl = defaultSOAPurl;
        }

        var postData = inst.GetOuterXML();
        
        setStatus("Отправляем запрос", true);
        if ((fDebug == true) && (fDebugXEP == true))
        {
            alert("Data length: " + postData.length + "\r\n\r\n" + postData);
        }
        $.ajax({
                type: "POST",
                url: soapUrl,
                data: postData,
                success: function(xml, responseText)
                {
                    if ((fDebug== true) && (fDebugXEP == true))
                    {
                        alert("** XEP debug info **\r\n\r\n'" + responseText + "'\r\n***//***\r\n" + xml);
                    }
                    var xepResponse = objGetXEPResponse(xml);
                    fCallbackOK(xepResponse);
                },
                error: function(obj, msg, exc)
                {
                    if ((fDebug== true) && (fDebugXEP == true))
                    {
                        alert("** XEP debug info **\r\n\r\nXEP error: " + msg + "\r\n" + "responseText: " + obj.responseText + "\r\nresponseXML: " + obj.responseXML);
                    }
                    fCallbackError(obj, msg);
                },
                complete: function(obj, msg)
                {
                }
            });
    }
    
    inst.UpdateAllPartsParam = function (arrParamNameValue)
    {
        var paramName = null;
        var paramValue = null;
        for (y in arrParamNameValue)
        {
            paramName = y;
            paramValue = arrParamNameValue[y];
        }
        
        for (x in inst.Parts)
        {
            var part = inst.Parts[x];
            part.UpdateParam(paramName, paramValue);
        }
    }
    
    return inst;
}
function objGetXEPRequestPart(sCommandName)
{
    var inst = new Object();
    
    inst.CommandName = sCommandName;
    inst.Params = new Object();
    
    
    inst.AddParam = function (sParamName, sParamValue, bCDATAObligative)
    {
        bCDATAObligative = true; // STUBSTUB
        sParamValue = sParamValue.replace(new RegExp("\]\]>", "gi"), "]]]]><![CDATA[>");
        
        if ((bCDATAObligative == true)) /*         if ((bCDATAObligative == true)) // */
        {
            sParamValue = "<![CDATA[" + sParamValue + "]]>";
        }
        inst.Params[""+sParamName] = sParamValue;
    }
    inst.AddParams = function (aParams, bCDATAObligative)
    {
        for (paramName in aParams)
        {
            var paramValue = aParams[paramName];
            inst.AddParam(paramName, paramValue+"", bCDATAObligative);
        }
    }
    
    inst.GetOuterXML = function()
    {
        var sXML =  '<part command="' + inst.CommandName + '">';
        for (paramName in inst.Params)
        {
            var paramValue = inst.Params[paramName];
            sXML += '<param name="' + paramName + '">' + paramValue + '</param>';
        }
        sXML += '</part>';
        return sXML;
    }
    
    inst.UpdateParam = function (paramName, paramNewValue)
    {
        inst.Params[paramName] = paramNewValue;
    }
    
    return inst;
}

function objGetXEPResponse(jqXML)
{
    var inst = new Object();
    
    //STUB изврат :) 
    var headerExists = false;
    if ($('header'))
    {
        headerExists = true;
    }
    if (headerExists == false)
    {
        setStatus("XEP Warning: в пакете нет хедера", false, true);
    }
    
    inst.StatusMessage = "";
    
    if ($('root', jqXML).attr('status') == soapStatusOK)
    {
        inst.Status = soapStatusOK;
    }
    else
    {
        inst.Status = soapStatusError;
        inst.StatusMessage = $('root', jqXML).attr('text');
    }
    
    inst.Parts = new Array();
    inst.TheOnlyPart = null; // Первый парт
    
    $('part', jqXML).each (function (index, el)
                           {
                                el = $(el);
                                var part = objGetXEPResponsePart(el);
                                if (part!= null)
                                {
                                    inst.Parts[inst.Parts.length] = part;
                                    if (inst.TheOnlyPart == null)
                                    {
                                        inst.TheOnlyPart = part;
                                    }
                                }
                                else
                                {
                                    setStatus("XEP Warning: не удалось распарсить один из партов", false, true);
                                }
                           });
    
    
    return inst;
}

function objGetXEPResponsePart(jqXML)
{
    var inst = new Object();
    
    inst.Results = new Array();
    inst.TheOnlyResult = null;
    
    inst.Status = soapStatusOK;
    inst.StatusMessage = "";
    inst.StatusCode = "";
    
    if (jqXML.attr('status') != soapStatusOK)
    {
        inst.Status = soapStatusError;
        inst.StatusMessage = jqXML.attr('text');
        inst.StatusCode = jqXML.attr('code');
    }
    
    $('result', jqXML).each (function (index, el)
                             {
                                el = $(el);
                                var result = new Object();
                                $('field', el).each(function(index2, el2)
                                                    {
                                                        el2 = $(el2);
                                                        var fieldName = el2.attr('name');
                                                        var fieldValue = el2.text();
                                                        result[""+fieldName] = fieldValue;
                                                    });
                                inst.Results[inst.Results.length] = result;
                                if (inst.TheOnlyResult == null)
                                {
                                    inst.TheOnlyResult = result;
                                }
                             });
    return inst;
}