﻿
//谷木人XmlAPI库,用于Gmr标准通信格式
//GmrXmlApi.js,
//版权所有谷木人科技(北京)有限公司,www.gumuren.com
//版本1.0
//创建时间2008.12.06
//修改时间2008.12.06
//修改人

/// <reference path="GmrJsLib.js" />

Gmr.XML.API = new Object();
Gmr.XML.API.ClientRequest = function()
{
    /// <summary>客户端XML请求类</summary>
    var appId = "gmr";
    var type = 1;
    var action = "";
    var serverAddress = "api.aspx"; //  "../Api/XmlApi.aspx";
    var paramValueEncode = false;
    var myAjax = new GmrAjax();
    var isAsync = true; //是否异步模式
    var strXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><GmrMessage>" +
              "<AppId>" + appId + "</AppId>" +
              "<Type>" + type + "</Type>" +
              "<Action>0</Action>" +
              "<Data></Data></GmrMessage>";
    var xmlDoc = Gmr.XML.LoadXmlString(strXml);

    //var paramsNode = xmlDoc.getElementsByTagName("GmrMessage/Data")[0];




    var receiveFuntion = function(stateCode, message)
    {
        //附加服务端返回请求对象

    }
    this.SetIsAsync = function(isValue)
    {
    //设置是否异步模式
        isAsync = isValue;
    }
    this.SetIsAutoEncodeValue = function(isAuto)
    {
        /// <summary>设置是否自动对值进行编码，默认不进行二次编码</summary>

        paramValueEncode = isAuto;
    }
    this.SetParamValue = function(paramName, paramValue, isEncode)
    {
        /// <summary>设置符合指定参数名的第一个参数值,如果不存在参数,则添加</summary>
        /// <param name="paramName">要设置的参数名称</param>
        /// <param name="paramValue">要设置的参数值</param>
        /// <param name="isEncode">是否对值进行二次编码,优先于SetIsAutoEncodeValue</param>
        var paramsNode = xmlDoc.selectNodes("/GmrMessage/Data")[0];
        if (isEncode == null)
        {
            if (paramValueEncode)
            {
                paramValue = HtmlEncode(paramValue);
            }
        }
        else if (isEncode == true)
        {
            paramValue = HtmlEncode(paramValue);
        }
        var xpath = paramName;
        var nodes = paramsNode.selectNodes(xpath);
        if (nodes.length > 0)
        {
            if (nodes[0].firstChild != null)
            {
                nodes[0].firstChild.nodeValue = paramValue;
            }
            else
            {
                var tNode = xmlDoc.createTextNode(paramValue);
                nodes[0].appendChild(tNode);
            }
        }
        else
        {
            var eNode = xmlDoc.createElement(paramName);
            var tNode = xmlDoc.createTextNode(paramValue);
            eNode.appendChild(tNode);
            paramsNode.appendChild(eNode);
        }
    }
    this.SetParamValues = function()
    {
        /// <summary>设置符合指定系列参数名的第一个参数值</summary>
        for (var i = 0; i < arguments.length; i = i + 2)
        {
            this.SetParamValue(arguments[i], arguments[i + 1]);
        }
    }
    this.SetAction = function(action)
    {
        /// <summary>设置请求的方法标识</summary>
        /// <param name="action">Action值</param>
        var node = xmlDoc.selectNodes("/GmrMessage/Action")[0].firstChild;
        node.nodeValue = action;
    }
    this.SetAppId = function(appId)
    {
        /// <summary>设置程序标识</summary>
        /// <param name="appId">要设置的AppId值</param>
        var node = xmlDoc.selectNodes("/GmrMessage/AppId")[0].firstChild;
        node.nodeValue = appId;
    }
    this.SetRequestUrl = function(url)
    {
        /// <summary>设置请求地址</summary>
        if (url != null)
        {
            serverAddress = url;
        }
    }
    this.SetReceiveFunction = function(proccessFunction)
    {
        /// <summary>设置返回成功后的处理函数,API对象会向该函数传入状态码和状态消息两个参数,即形如function(stateCode,message)</summary>

        if (proccessFunction != null)
        {
            receiveFuntion = proccessFunction;
        }
    }
    /************与服务端交互***************/
    this.SendXmlRequest = function()
    {
        /// <summary>发送出请求</summary>

        myAjax.SetReadyFunction(this.receiveResponse);
        myAjax.Open(Gmr.Pub.UrlReplaceParamValue("irand", parseInt(Math.random() * 100), serverAddress));
        myAjax.SendXml(xmlDoc.xml); 
    }
    this.receiveResponse = function()
    {
        ///<summary>接处理返回的信息</summary>


        //SetClipboardText(myAjax.GetResponseText());
        //alert(myAjax.GetResponseText());
        var response = new Gmr.XML.API.ServerResponse(myAjax.GetResponseText());
        //alert(GetStateCode());

        if (response == null)
        {
            //alert("加载数据时发生错误!");
            return;
        }
        else
        {
            receiveFuntion(response.GetStateCode(), response.GetMessage(), response);
        }
    }

    /************与服务端交互***************/


}
Gmr.XML.API.ServerResponse = function(responseText)
{
    /// <summary>处理服务器返回数据的对象</summary>
    /// <param name="responseText">服务器端响应文本</param>
    var loadError = false;
    var responseXmlDoc = Gmr.XML.LoadXmlString(responseText);
    if (responseXmlDoc == null)
    {
        loadError = true;
    }
    
    this.GetStateCode = function GetStateCode()
    {
        ///<summary>获取服务器响应XML消息状态代号</summary>
        try
        {
            if (loadError)
            {
                return -1;
            }
            var code = parseInt(responseXmlDoc.selectSingleNode("/GmrMessage/StateCode").firstChild.nodeValue);
            return code;
        }
        catch (e)
        {
            return null;
        }
    }

    this.GetMessage = function GetMessage()
    {
        ///<summary>获取服务器响应XML消息文本</summary>
        try
        {
            var mes = responseXmlDoc.selectSingleNode("/GmrMessage/Message").firstChild.nodeValue;
            return mes;
        }
        catch (e)
        {
            return null;
        }
    }
    this.GetParamValue = function(paramName, isDecode)
    {
        /// <summary>获取服务器返回的参数值</summary>
        /// <param name="paramName">参数名</param>        
        /// <param name="isDecode">是否对值进行解码,默认不解码</param>


        try
        {
            var v = responseXmlDoc.selectSingleNode("/GmrMessage/Data/" + paramName).firstChild.nodeValue;
            if (isDecode)
            {
                v = HtmlDecode(v);
            }
            return v;
        }
        catch (e) { return null; }
    }
    this.GetValue = function(paramName)
    {
        /// <summary>获取服务器返回信息中的第一个匹配参数节点</summary>
        /// <param name="paramName">参数名</param>  

        try
        {
            return responseXmlDoc.selectSingleNode("GmrMessage/Data/" + paramName);
        }
        catch (e)
        {
            return null;
        }
    }
    this.GetValues = function(paramName)
    {
        /// <summary>获取服务器返回信息中的所有匹配参数节点</summary>
        /// <param name="paramName">参数名</param>  

        try
        {
            return responseXmlDoc.selectNodes("GmrMessage/Data/" + paramName);
        }
        catch (e)
        {
            return null;
        }
    }
    this.GetResponseDom = function()
    {
        /// <summary>获取服务器响应的Dom对象</summary>

        return responseXmlDoc;
    }
}





