﻿// JScript 文件
/* <![CDATA[ */

function createHttpRequest()
{
    var xRequest = null;
    if(window.XMLHttpRequest != null)
    {
        xRequest = new XMLHttpRequest(); // For good internet navigator, such as Firefox, Opera etc.
        //alert("XMLHttpRequest created");
    }
    else if(typeof (ActiveXObject) != "undefined")
    {
        xRequest = new ActiveXObject("Microsoft.XMLHTTP"); // For Microsoft junk IE
    }
    
    return xRequest;
}

function createXmlDoc()
{
    if(window.ActiveXObject)
    {
        // create IE DOM
        var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"];
        for(var i = 0; i < arrSignatures.length; ++i)
        {
            try
            {
                var oXmlDom = new ActiveXObject(arrSignatures[i]);
                return oXmlDom;
            }
            catch(oErr){}
        }
        
        throw new Error("MSXML is not installed on your system.");
    }
    else if(document.implementation && document.implementation.createDocument)
    {
        // create Mozilla DOM
        var oXmlDom = document.implementation.createDocument("", "", null);
        //alert("oXmlDom created.");
        
        // add "xml" attribute to Mozilla DOM
//        if(!g_MozillaXml)
//        {
//            Node.prototype._defineGetter_("xml", function()
//            {
//                var oSerializer = new XMLSerializer();
//                return oSerializer.serializeToString(this, "text/xml");
//            });
//            g_MozillaXml = true;
//        }
        return oXmlDom;
    }
    else
    {
        throw new Error("Your browser doesn't support an XML DOM object.");
    }
}

function getXml(xDoc)
{
    if(window.ActiveXObject)
    {
        return xDoc.xml;
    }
    else
    {
        var oSerializer = new XMLSerializer();
        return oSerializer.serializeToString(xDoc, "text/xml");
    }
}

//        if(!g_MozillaXml)
//        {
//            Node.prototype._defineGetter_("xml", function()
//            {
//                var oSerializer = new XMLSerializer();
//                return oSerializer.serializeToString(this, "text/xml");
//            });
//            g_MozillaXml = true;
//        }

// 定义类 AjaxRequest
function AjaxRequest(method)
{
    this.httpMethod = method;
    this.txtSend = null;
    this.xmlSend = null;
    this.xmlResult = null;
    this.httpResult = null;
    this.url = null;
    this.destCtrl = null; // 目标控件,帮助回调函数
    this.req = createHttpRequest();
    this.OnReadyCallback = null;
    //alert("AjaxRequest created.");
}

AjaxRequest.prototype.READY_STATE_COMPLETE = 4;

AjaxRequest.prototype._callback_ = function()
{
    var ajax = this;
    if(ajax.req.readyState == ajax.READY_STATE_COMPLETE)
    {
        // 保存HTTP响应码, 回调函数可以根据这个属性作错误处理
        this.httpResult = this.req.status;
        
        // 把返回的字符串载入为一个XML DOM 对象
        if(this.xmlResult == null)
        {
            this.xmlResult = createXmlDoc();
            try
            {
                if(this.xmlResult == null) {}
                else
                {
                    if(window.ActiveXObject)
                    {
                        this.xmlResult.loadXML(this.req.responseText);
                    }
                    else
                    {
                        var oParser = new DOMParser();
                        this.xmlResult = oParser.parseFromString(this.req.responseText, "text/xml");
                    }
                }
            }
            catch (oErr)
            {
                this.xmlResult = null;
            }
        }
        
        // 回调函数
        if(null != ajax.OnReadyCallback) ajax.OnReadyCallback(ajax);
    }
}

AjaxRequest.prototype.sendText = function(url, txtParam, OnReadyCallback)
{
    this.txtSend = txtParam;
    this.url = url;
    this.OnReadyCallback = OnReadyCallback;

    var loader = this;
    this.req.onreadystatechange = function () { loader._callback_.call(loader); }
    this.req.open(this.httpMethod, url, true);
    this.req.setRequestHeader("Content-Type", "text/xml");
    this.req.setRequestHeader("If-Modified-Since","0");   // 防止因为IE的缓冲出现问题 

    this.req.send(txtParam);
}

AjaxRequest.prototype.sendXml = function(url, xmlParam, OnReadyCallback)
{
    this.xmlSend = xmlParam;
    this.url = url;
    this.OnReadyCallback = OnReadyCallback;

    var loader = this;
    this.req.onreadystatechange = function () { loader._callback_.call(loader); }
    this.req.open(this.httpMethod, url, true);
    this.req.setRequestHeader("Content-Type", "text/xml");
    this.req.setRequestHeader("If-Modified-Since","0");   // 防止因为IE的缓冲出现问题 

    if(xmlParam == null)
    {
        this.req.send
    }
    else
    {
        this.req.send(getXml(xmlParam));
    }
}


// X-electronic 通用接口
/* 本站实用的XML格式如下
 * 
 * 请求的格式:
 * 
 * <ROOT>
 *      <COMMAND>"command name"</COMMAND>
 *      <PARAM>
 *          <"PARM NAME">"param value"</"PARAM NAME">
 *      </PARAM>
 * </ROOT>
 * 
 * 回应的格式
 * 
 * <ROOT>
 *      <ERRORCODE>"code"</ERRORCODE>
 *      <ERRORMSG>"error message"</ERRORMSG>
 *      <RESULT>
 *          <... >
 *      </RESULT>
 * </ROOT>
 * */
 
function XEXML_CreateCommand(commandName)
{
    var xmlDoc = createXmlDoc();
    
    // create root
    var xRoot = xmlDoc.createElement("ROOT");
    xmlDoc.appendChild(xRoot);
    
    // create command node
    var xCommand = xmlDoc.createElement("COMMAND");
    var xCommandName = xmlDoc.createTextNode(commandName);
    xCommand.appendChild(xCommandName);
    xRoot.appendChild(xCommand);
    
    // create param node
    var xParam = xmlDoc.createElement("PARAM");
    xRoot.appendChild(xParam);
    
    return xmlDoc;
}

function XEXML_AddParam(xmlDoc, paramName, paramValue)
{
    var xParamArr = xmlDoc.getElementsByTagName("PARAM");
    var xParam = xParamArr[0];
    
    var xNewParam = xmlDoc.createElement(paramName);
    var xNewParamValue = xmlDoc.createTextNode(paramValue);
    xNewParam.appendChild(xNewParamValue);
    
    xParam.appendChild(xNewParam);
}

// 获取返回结果 XE_GET 系列的函数 要捕捉异常, 因为服务器返回的结果往往不是想象中的结果
function XEXML_GetErrorCode(xmlResult)
{
    try
    {
        var xErrorCodes = xmlResult.getElementsByTagName("ERRORCODE");
        var xErrorCode = xErrorCodes[0];
        
        // <ERRORCODE>0</ERRORCODE> "0" 作为节点 <ERRORCODE> 的第一个子节点.
        return xErrorCode.firstChild.nodeValue;
    }
    catch(oErr)
    {
        return 1;  // 表示错误
    }
}

function XEXML_GetErrorMessage(xmlResult)
{
    try
    {
        var xErrorMsgs = xmlResult.getElementsByTagName("ERRORMSG");
        var xErrorMsg = xErrorMsgs[0];
        
        // <ERRORCODE>0</ERRORCODE> "0" 作为节点 <ERRORCODE> 的第一个子节点.
        return xErrorMsg.firstChild.nodeValue;
    }
    catch(oErr)
    {
        return oErr;  // 表示错误
    }
}

function XEXML_GetResult(xmlResult, resultName)
{
    try
    {
        var xResultss = xmlResult.getElementsByTagName("RESULTS");
        var xResults = xResultss[0];
        
        var xResultNames = xResults.getElementsByTagName(resultName);
        if(null == xResultNames) return "";
        
        var xResultName = xResultNames[0];
        return xResultName.firstChild.nodeValue;
    }
    catch(oErr)
    {
        return "";  // 表示错误
    }
}

function removeAllChild(ctrl)
{
    while(ctrl.hasChildNodes())
    {
        ctrl.removeChild(ctrl.firstChild);
    }
}

//        removeAllChild(ctrl);
//        var img = document.createElement("img");
//        img.setAttribute("src", "images/ajax_status_loading.gif");
//        img.setAttribute("alt", "...");
//        ctrl.appendChild(img);

function setAjaxStatus(ctrl, status)
{
    if(status == "loading")
    {
        ctrl.innerHTML = "<img src=\"Images/ajax_status_loading.gif\" alt=\"..\" title=\"processing\" />";
        return;
    }
    
    if(status == "ok")
    {
        ctrl.innerHTML = "<a href=\"mycart.aspx\"><img src=\"Images/ajax_status_ok.gif\" alt=\"ok\" title=\"ok\" /></a>";
        return;
    }
    
    if(status == "failed")
    {
        ctrl.innerHTML = "<a href=\"signin.aspx\"><img src=\"Images/ajax_status_failed.gif\" title=\"failed, sign in and try again please.\" alt=\"failed\" /></a>";
        return;
    }
    
    if(status == "httperror")
    {
        ctrl.innerHTML = "<img src=\"Images/ajax_status_http.gif\" alt=\"http error\" title=\"Http connection error, try again later.\" />";
        return;
    }
}


// 具体的命令函数

function onAddToCart_callback(ajax)
{
    if(ajax.httpResult != "200")
    {
        setAjaxStatus(ajax.destCtrl, "httperror");
        return;
    }
    
    var errCode = XEXML_GetErrorCode(ajax.xmlResult);
    var errMsn = XEXML_GetErrorMessage(ajax.xmlResult);
    if(errCode == 0)
    {
        setAjaxStatus(ajax.destCtrl, "ok");
        return;
    }
    else
    {
        setAjaxStatus(ajax.destCtrl, "failed");
        return;
    }
}

function AddToCart(productID, destCtrl)
{
    var url = "ajax.aspx";
    var xmlParam = XEXML_CreateCommand("ADDTOCART");
    XEXML_AddParam(xmlParam, "PRODUCTID", productID);
    
    var ajax = new AjaxRequest("POST");
    ajax.destCtrl = destCtrl;
    ajax.sendXml(url, xmlParam, onAddToCart_callback);
    
    //destCtrl.innerHtml = "<img src=\"images/loading.gif\" alt=\"loading...\" />";
    setAjaxStatus(destCtrl, "loading");
}

function AddToCartFF(ev)
{
    var productID = ev.getAttribute("productid");
    //alert(productID);
    var destCtrl = ev.nextSibling;
    //alert(destCtrl.nodeName);
    AddToCart(productID, destCtrl);
}
/* ]]> */