﻿/*
*************************************************
FileName	:	Ajax.js
Ver			:	4.2.2
Auther		:	Rick Li
Create Date	:	2007-5-31
*************************************************
================  For Example  ======================

Olny Post:
Text:
var ajax = new Ajax("/Ajax.aspx",'Post');
ajax.AddItem("key","value");
ajax.over(getResult);
ajax.Send();
function getResult()
{
FDMFrame.Info('提示信息',ajax.getResult());
FDMFrame.Info('提示信息',ajax.getStatus());
}
Xml:
var ajax = new Ajax("Ajax.aspx",'Post');
ajax.AddItem("key","value");
ajax.over(getResult);
ajax.Xml();
function getResult()
{
var xml = ajax.getResult();
}

Post & Get
Text:
var ajax = new Ajax("Ajax.aspx",'Post');
ajax.AddItem("get1","get1value");
ajax.AddItem("get2","get2value");
ajax.over(getResult);
var postdata = "this is post data"
ajax.send(postdata);
function getResult()
{
var result = ajax.getResult();
}
		
Xml:	
var ajax = new Ajax("Ajax.aspx",'Post');
ajax.AddItem("get1","get1value");
ajax.AddItem("get2","get2value");
ajax.over(getResult);
var postdata = "this is post data"
ajax.xml(postdata);
function getResult()
{
var xml = ajax.getResult();
}
	
DataSet,DataTable:
var ajax = new Ajax("/Ajax.aspx",'Post');
ajax.AddItem("key","value");
ajax.over(getResult);
ajax.Xml();
function getResult()
{
var Data = ajax.getData();
if(ajax.DataType=="DataSet")
FDMFrame.Info('提示信息',"DataSet");
else if(ajax.DataType=="DataTable")
FDMFrame.Info('提示信息',"DataTable");
else
FDMFrame.Info('提示信息',"Null");
}
QueryString:
var ajax = new Ajax("Ajax.aspx",'Post');
var Param1 = ajax.QueryString("Param1");
var Param2 = ajax.QueryString("Param2");
	
Clear All Item:
var ajax = new Ajax("Ajax.aspx",'Post');
var Param1 = ajax.QueryString("Param1");
var Param2 = ajax.QueryString("Param2");
ajax.clear();	
=================================================
*/

var IE = navigator.appName == "Microsoft Internet Explorer";
var NS = navigator.appName == "Netscape";
var Opera = navigator.appName == "Opera";
var ie = IE;
var ns = NS;
var ff = ns;
var FF = ns;
var IsIE = ie;
var IsNs = ns;
var isSa = false;
if (NS && navigator.appVersion.toLowerCase().indexOf("safari") > 0) isSa = true;
var ie7 = IE && navigator.appVersion.toLowerCase().indexOf("ie 7") > 0;
var ie6 = IE && navigator.appVersion.toLowerCase().indexOf("ie 6") > 0;
var Sa = isSa;
var sa = Sa;
function Ajax(URL, PostMethod)
{
    var method = PostMethod.toLowerCase();
    var ajaxMethod = null;
    var _result = null;
    var _data = null;
    var _txt = null;
    var _xml = null;
    var status = null;
    var xmlObjectData = false;
    var dataTableData = false;
    var dataSetData = false;

    this.getText = function getText()
    {
        return _txt;
    }
    this.getData = function getData()
    {
        try
        {
            _data = Xml2DataSet(_result);
            if (_data) return _data;
        }
        catch (e) { }
        try
        {
            if (_data == null) _data = Xml2DataTable(_result);
            if (_data) return _data;
        }
        catch (e) { }
        return null;
    }
    this.getResult = function()
    {
        return _result;
    }
    this.getStatus = function()
    {
        return status;
    }
    this.getXml = function()
    {
        _xml = Xml2Object(_result);
        return _xml;
    }
    var ajaxHTTPRequest = null;
    if (window.XMLHttpRequest)
    {
        ajaxHTTPRequest = new XMLHttpRequest();
        if (ajaxHTTPRequest.overrideMimeType)
        {
            ajaxHTTPRequest.overrideMimeType("text/xml");
        }
    }
    else if (window.ActiveXObject)
    {
        try
        {
            ajaxHTTPRequest = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            try
            {
                ajaxHTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) { }
        }
        if (!ajaxHTTPRequest)
        {
            return false;
        }
    }
    this.clear = function() { this.Item = {} }
    this.Clear = function() { this.Item = {} }
    var item = new Array();
    var value = new Array();
    this.Item = {};
    this.AddItem = function(item, value)
    {
        this.Item[item] = value;
    }
    this.removeItem = function(item)
    {
        if (this.Item[item]) this.Item[item] = null;
    }
    this.Add = this.AddItem;
    this.addItem = this.AddItem;
    this.additem = this.AddItem;
    this.add = this.AddItem;
    var url = URL;
    this.send = function Send(_postdata)
    {
        _result = null;
        _data = null;
        _txt = null;
        status = null;
        var post = null;
        for (var i in this.Item)
        {
            if (!this.Item[i.toString()] == null) continue;
            if (!post)
            {
                post = i.toString() + "=" + escape(this.Item[i.toString()]);
            }
            else
            {
                post += "&" + i.toString() + "=" + escape(this.Item[i.toString()]);
            }
        }
        try
        {
            if (method == "post")
            {
                if (_postdata)
                {
                    if (post.length > 0) url = url.charAt(url.length - 1) == "?" ? url : url.indexOf("?") > 0 ? url + "&" : url + "?";
                    //FDMFrame.Info('提示信息',url);
                    ajaxHTTPRequest.open("POST", url + post, true);
                }
                else
                {
                    ajaxHTTPRequest.open("POST", url, true);
                    ajaxHTTPRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                }
            }
            else
            {
                ajaxHTTPRequest.open("get", url, true);
                ajaxHTTPRequest.setRequestHeader("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
                //ajaxHTTPRequest.setRequestHeader("Cache-Control", "no-cache"); 
            }
            ajaxHTTPRequest.onreadystatechange = function()
            {
                if (ajaxHTTPRequest.readyState == 4)
                {
                    if (ajaxHTTPRequest.status)
                    {
                        status = ajaxHTTPRequest.status;
                        if (ajaxHTTPRequest.status == 200)
                        {
                            _result = ajaxHTTPRequest.responseText;
                        }
                        _txt = ajaxHTTPRequest.responseText;
                        if (ajaxMethod) ajaxMethod();
                    }
                }
            }
            if (_postdata)
                ajaxHTTPRequest.send(_postdata);
            else
                ajaxHTTPRequest.send(post);
        }
        catch (e)
        {
            //FDMFrame.Info('提示信息',e);
            //FDMFrame.Info('提示信息',e.description);
            //return null;
        }
    }
    this.Send = this.send;
    this.xml = function xml(_postdata)
    {
        _result = null;
        _data = null;
        _txt = null;
        status = null;
        var post = null;
        for (var i in this.Item)
        {
            if (!this.Item[i.toString()] == null) continue;
            if (!post)
            {
                post = i.toString() + "=" + escape(this.Item[i.toString()]);
            }
            else
            {
                post += "&" + i.toString() + "=" + escape(this.Item[i.toString()]);
            }
        }
        try
        {
            if (method == "post")
            {
                if (_postdata)
                {
                    if (post.length > 0) url = url.charAt(url.length - 1) == "?" ? url : url.indexOf("?") > 0 ? url + "&" : url + "?";
                    ajaxHTTPRequest.open("POST", url + post, true);
                }
                else
                {
                    ajaxHTTPRequest.open("POST", url, true);
                    ajaxHTTPRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                }
            }
            else
            {
                ajaxHTTPRequest.open("get", url, true);
                ajaxHTTPRequest.setRequestHeader("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
                //ajaxHTTPRequest.setRequestHeader("Cache-Control", "no-cache");
            }
            ajaxHTTPRequest.onreadystatechange = function()
            {
                if (ajaxHTTPRequest.readyState == 4)
                {
                    if (ajaxHTTPRequest.status)
                    {
                        status = ajaxHTTPRequest.status;
                        if (ajaxHTTPRequest.status == 200)
                        {
                            _result = ajaxHTTPRequest.responseXML;
                            if (_result.childNodes.length == 0)
                            {
                                _txt = ajaxHTTPRequest.responseText;
                                try
                                {
                                    _result = _txt.toXml();
                                }
                                catch (e)
                                { _result = null; }
                            }
                        }
                        else
                        {
                            _txt = ajaxHTTPRequest.responseText;
                        }
                        if (ajaxMethod) ajaxMethod();
                    }
                }
            }
            if (_postdata)
            {
                ajaxHTTPRequest.send(_postdata);
            }
            else
                ajaxHTTPRequest.send(post);
        }
        catch (e)
        {
            return null;
        }
    }
    this.XML = this.xml;
    this.Xml = this.xml;
    this.over = function Over(EvtMethod)
    {
        ajaxMethod = EvtMethod;
    }
    this.SetOverLoad = this.over;
    this.FinishTo = this.over;
    this.Finish = this.over;
    this.finish = this.over;
    this.OverTo = this.over;
    this.Over = this.over;
    this.QueryString = function(key)
    {
        var url = window.location.search;
        if (url.trim().length > 0 && url.indexOf("?") == 0) url = url.substring(1, url.length);
        var _opt = url.split("&");
        var _para = new Array();
        var _value = new Array();
        for (var i = 0; i < _opt.length; i++)
        {
            if (i > 0 && _opt[i].indexOf("amp;") == 0) _opt[i] = _opt[i].subString(4, _opt[i].length - 4);
            _para[i] = _opt[i].substring(0, _opt[i].indexOf("="));
            _value[i] = _opt[i].substring(_opt[i].indexOf("=") + 1, _opt[i].length);
        }
        var Opt = new Array(_para, _value);
        for (var i = 0; i < Opt[0].length; i++)
        {
            if (Opt[0][i].toLowerCase() == key.toLowerCase()) return Opt[1][i];
        }
        return null;
    }
    this.getParamValue = function getParamValue(url, ParamName)
    {
        url = url.substring(url.indexOf("?") + 1, url.length);
        var _opt = url.split("&");
        var _para = new Array();
        var _value = new Array();
        for (var i = 0; i < _opt.length; i++)
        {
            if (i > 0 && _opt[i].indexOf("amp;") == 0) _opt[i] = _opt[i].subString(4, _opt[i].length - 4);
            _para[i] = _opt[i].substring(0, _opt[i].indexOf("="));
            _value[i] = _opt[i].substring(_opt[i].indexOf("=") + 1, _opt[i].length);
        }
        var Opt = new Array(_para, _value);
        for (var i = 0; i < Opt[0].length; i++)
        {
            if (Opt[0][i].toLowerCase() == ParamName.toLowerCase()) return Opt[1][i];
        }
        return null;
    }
    this.getParam = function getParam(url)
    {
        url = url.substring(url.indexOf("?") + 1, url.length);
        var _opt = url.split("&");
        var _para = new Array();
        var _value = new Array();
        for (var i = 0; i < _opt.length; i++)
        {
            if (i > 0 && _opt[i].indexOf("amp;") == 0) _opt[i] = _opt[i].subString(4, _opt[i].length - 4);
            _para[i] = _opt[i].substring(0, _opt[i].indexOf("="));
            _value[i] = _opt[i].substring(_opt[i].indexOf("=") + 1, _opt[i].length);
        }
        var __result = new Array(_para, _value);
        return __result;
    }

}
function DataSet()
{
    var tables_ = new Array();
    this.Tables = tables_;
    this.AddTable = function DS_AddTable(Dt)
    {
        tables_[tables_.length] = Dt;
    }
}
function DataTable()
{
    this.RecordCount = 0;
    this.PageSize = 20;
    this.Page = 1;
    var rows_ = new Array();
    this.Rows = rows_;
    this.AddRow = function Ds_AddRow(DataRow_)
    {
        rows_[rows_.length] = DataRow_;
    }
    var cols_ = new Array();
    this.Cols = cols_;
    this.AddCol = function Ds_AddCol(ColName)
    {
        cols_[cols_.length] = ColName;
    }
    this.AddData = function Ds_AddData(DataTable_)
    {
        for (var i = 0; i < DataTable_.Rows.length; i++)
        {
            AddRow(DataTable_.Rows[i]);
        }
    }
}
function DataRow(colsNameList)
{
    var value_ = new Array();
    this.Values = value_;
    var cols_ = new Array();
    this.setValue = function Ds_setValue(ColName, Values)
    {
        try
        {
            for (var i = 0; i < colsNameList.length; i++)
            {
                if (ColName == colsNameList[i])
                {
                    this[ColName] = Values;
                    value_[i] = Values;
                }
            }
        }
        catch (e)
        {
            return null;
        }
    }
    this.getValue = function Ds_getValue(ColName)
    {
        try
        {
            for (var i = 0; i < colsNameList.length; i++)
            {
                if (ColName == colsNameList[i]) return value_[i];
            }
        }
        catch (e)
        {
            return null;
        }
    }
    this.value = this.getValue;
}
function Xml2Object(XmlDoc)
{
    var result = {};
    var getChild = function(node, obj)
    {
        var ratt = node.attributes;
        if (ratt)
        {
            for (var i = 0; i < ratt.length; i++)
            {
                obj[ratt[i].name] = ratt[i].value;
            }
        }
        if (node.childNodes.length > 0)
        {
            if (node.childNodes.length == 1 && node.childNodes[0].nodeType == 3)
            {
                if (obj.length == undefined)
                    obj["innerText"] = node.text ? node.text : node.textContent ? node.textContent : "";
                else
                {
                    obj[obj.length] = {};
                    obj[obj.length - 1]["innerText"] = node.text ? node.text : node.textContent ? node.textContent : "";
                }
            }
            else
            {
                for (var i = 0; i < node.childNodes.length; i++)
                {
                    if (node.childNodes[i].nodeType != 1) continue;
                    if (!obj[node.childNodes[i].nodeName])
                    {
                        if (GetNode(node, node.childNodes[i].nodeName).length > 1)
                        {
                            obj[node.childNodes[i].nodeName] = new Array();
                        }
                        else
                        {
                            obj[node.childNodes[i].nodeName] = {};
                            obj[node.childNodes[i].nodeName][0] = obj[node.childNodes[i].nodeName];

                        }
                        if (obj[node.childNodes[i].nodeName].length != undefined)
                        {
                            obj[node.childNodes[i].nodeName][0] = {};
                            getChild(node.childNodes[i], obj[node.childNodes[i].nodeName][0]);
                        }
                        else
                            getChild(node.childNodes[i], obj[node.childNodes[i].nodeName]);

                    }
                    else if (obj[node.childNodes[i].nodeName].length != undefined)
                    {
                        obj[node.childNodes[i].nodeName][obj[node.childNodes[i].nodeName].length] = {};
                        getChild(node.childNodes[i], obj[node.childNodes[i].nodeName][obj[node.childNodes[i].nodeName].length - 1]);
                    }

                }
            }
        }
    }
    getChild(XmlDoc, result);
    return result;
}
function Xml2DataTable(XmlDoc)
{
    var Xml = XmlDoc;
    var Tables = GetNode(Xml, "Table");
    if (Tables == null) return null;
    var dt = new DataTable();
    if (Tables[0].getAttribute("PageSize"))
        dt.PageSize = Tables[0].getAttribute("PageSize").parseInt();
    if (Tables[0].getAttribute("Page"))
        dt.Page = Tables[0].getAttribute("Page").parseInt();
    if (Tables[0].getAttribute("RecordCount"))
        dt.RecordCount = Tables[0].getAttribute("RecordCount").parseInt();
    for (var i = 0; i < Tables[0].attributes.length; i++)
    {
        var attr = Tables[0].attributes[0].name.toLower();
        if (attr.Trim() != "pagesize" && attr.Trim() != "page" && attr.Trim() != "recordcount")
        {
            try
            {
                dt[Tables[0].attributes[i].name] = Tables[0].getAttribute(Tables[0].attributes[i].name).parseInt();
            }
            catch (e)
            {
                dt[Tables[0].attributes[i].name] = Tables[0].getAttribute(Tables[0].attributes[i].name)
            }
        }
    }
    var head = GetNode(Tables[0], "ColName");
    if (head == null) return;
    var ColName = GetNode(head[0], "Value");
    if (ColName == null) return null;
    for (var j = 0; j < ColName.length; j++)
    {
        if (IE)
            dt.AddCol(ColName[j].text);
        else
            dt.AddCol(ColName[j].textContent);

    }
    var Row = GetNode(Tables[0], "Row");
    if (Row == null) return dt;
    for (var j = 0; j < Row.length; j++)
    {
        var dr = new DataRow(dt.Cols);
        var Values = GetNode(Row[j], "Value");
        for (var k = 0; k < Values.length; k++)
        {
            if (IE)
            {
                dr[k] = Values[k].text;
                dr[dt.Cols[k]] = Values[k].text;
                dr.Values[k] = Values[k].text;
            }
            else
            {
                dr[k] = Values[k].textContent;
                dr[dt.Cols[k]] = Values[k].textContent;
                dr.Values[k] = Values[k].textContent;
            }
        }
        dt.AddRow(dr);
    }
    return dt;
}
function Xml2DataSet(XmlDoc)
{
    if (!XmlDoc) return null;
    var Xml = XmlDoc;
    var Ds = GetNode(Xml, "DataSet");
    if (Ds == null) return null;
    var Tables = GetNode(Ds[0], "Table");
    if (Tables == null) return null;
    var ds = new DataSet();
    for (var i = 0; i < Tables.length; i++)
    {
        var dt = new DataTable();
        var head = GetNode(Tables[i], "ColName");
        var ColName = GetNode(head[0], "Value");
        if (ColName != null)
        {
            for (var j = 0; j < ColName.length; j++)
            {
                if (IE)
                    dt.AddCol(ColName[j].text);
                else
                    dt.AddCol(ColName[j].textContent);
            }
        }
        var Row = GetNode(Tables[i], "Row");
        if (Row != null)
        {
            for (var j = 0; j < Row.length; j++)
            {
                var dr = new DataRow(dt.Cols);
                var Values = GetNode(Row[j], "Value");
                if (Values)
                    for (var k = 0; k < Values.length; k++)
                {
                    if (IE)
                    {
                        dr.Values[k] = Values[k].text;
                        dr[ColName[k]] = Values[k].text;

                    }
                    else
                    {
                        dr.Values[k] = Values[k].textContent;
                        dr[ColName[k]] = Values[k].text;
                    }
                }
                dt.AddRow(dr);
            }
        }
        ds.AddTable(dt);
    }
    return ds;
}
function GetNode(XML, TagName)
{
    var ChildNodeX = new Array();
    try
    {
        for (var G_i = 0; G_i < XML.childNodes.length; G_i++)
        {
            if (XML.childNodes[G_i].nodeType == 1)
            {
                if (XML.childNodes[G_i].nodeName == TagName)
                {
                    ChildNodeX[ChildNodeX.length] = XML.childNodes[G_i];
                }
            }
        }
    }
    catch (e) { }
    if (ChildNodeX.length == 0)
        return null;
    else
        return ChildNodeX;
}
function getXml(URL)
{
    try
    {
        if (window.ActiveXObject)
            var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
        else if (document.implementation && document.implementation.createDocument)
            var xmldoc = document.implementation.createDocument("", "", null);
        xmldoc.async = false;
        xmldoc.preserveWhiteSpace = true;
        xmldoc.load(URL);
        return xmldoc;
    }
    catch (e) { return null; }
}
//等待提示信息
//var watting = "<img src='/images/loading.gif' style='vertical-align:middle'> 操作中，请稍候……";
//显示等待提示信息
function showWattInfo(id, infoStr, isShowBorder, z)
{
    if (!infoStr) infoStr = '操作中，请稍候……';
    var watting = "<img src='/images/loading.gif' style='vertical-align:middle'> " + infoStr;
    var showObj = (typeof (id) == 'object') ? id : document.getElementById(id);
    if (showObj)
    {
        showObj.style.display = '';
        if (isShowBorder)
        {
            var _div = document.createElement('div');
            if (z) _div.style.zIndex = z;
            _div.style.width = '200px';
            _div.style.backgroundColor = '#ffffff';
            _div.style.textAlign = 'center';
            _div.style.border = '1px solid #999999';
            _div.style.padding = '10px';
            _div.style.position = 'relative';
            _div.innerHTML = watting;
            showObj.appendChild(_div);
        }
        else
        {
            showObj.innerHTML = watting;
        }
    }
}
//关闭等待提示信息
function closeWattInfo(id)
{
    var showObj = (typeof (id) == 'object') ? id : document.getElementById(id);
    if (showObj)
    {
        showObj.style.display = 'none';
        showObj.innerHTML = '';
    }
}
//用于处理 ajax 异常信息的通用方法.
function ajaxErrorHandler(XMLHttpRequest, textStatus, msgContainer)
{
    var msg = "读取数据时发生异常. <a href='javascript:location.reload(true);' style=\"color:red;\">刷新页面</a>";
    if (XMLHttpRequest != null)
    {
        switch (XMLHttpRequest.status)
        {
            case 404:
                msg = "无法访问服务器";
                break;
        }
    }
    try { msgContainer.html(msg); } catch (e) { alert(msg); }
}

