﻿//内存释放
(function()
{
    var _fns = [];
    var FreeMemory =
    {
        AddFreeFn: function(fn, obj)
        {
            _fns.push({ fn: fn, obj: obj });
        },
        Free: function()
        {
            var len = _fns.length;
            for (var i = 0; i < len; i++)
            {
                var tmp = _fns[i];
                var fn = tmp.fn;
                var obj = fn.obj;
                if (typeof (obj) == "undefined")
                {
                    obj = window;
                }

                try
                {
                    fn.call(obj);
                }
                catch (e)
                {
                }

                fn = null;
                obj = null;
                tmp = null;
                _fns[i] = null;
                delete _fns[i];
            }

            //内存垃圾收集
            setTimeout("CollectGarbage()", 1);
        }
    }

    window.attachEvent("onunload", function()
    {
        FreeMemory.Free();
    });

    window.FreeMemory = FreeMemory;
})();


var Common = new Object();
Common.defWidth = 800; //默认宽度
Common.defHeight = 450; //默认高度
Common.dlgWidth = 500;
Common.dlgHeight = 350;
Common.percentWidth = window.screen.width * 0.75;
Common.percentHeight = window.screen.height * 0.75;


FreeMemory.AddFreeFn(function()
{
    Common = null;
});

//图标类型
var ICON_TYPE =
{
    WARNING: 1, //警告
    ERROR: 2,  //错误
    INFORMATION: 3,  //信息
    QUESTION: 4,  //询问
    SUCCESSS: 5 //成功
}

/************************/
//封装的网页弹出对话框
/************************/
function ScoAlert(cfg)
{
    if (typeof (cfg) == "string")
    {
        //兼容原来的代码
        var tmpMsg = cfg;
        cfg = { msg: tmpMsg };
    }

    if (cfg.win == undefined)
    {
        //执行消息的窗口对象
        cfg.win = window.top;
    }

    if (cfg.title == undefined)
    {
        //标题
        cfg.title = "提示";
    }

    if (cfg.iconType == undefined)
    {
        //图标类型
        cfg.iconType = ICON_TYPE.WARNING;
    }
    /*
    cfg.win.alert(cfg.msg);
    
    if(cfg.fn != undefined)
    {
    if(cfg.fnObj == undefined)
    {
    //函数所在的对象
    cfg.fnObj = window;
    }
        
    cfg.fn.apply(cfg.fnObj, cfg.fnParams);
    }*/

    if (cfg.fn != undefined)
    {
        if (cfg.fnObj == undefined)
        {
            //函数所在的对象
            cfg.fnObj = window;
        }
        if (cfg.fnParams == undefined)
        {
            cfg.fnParams = [];
        }
    }
    if (cfg.ignoreArgument == undefined)
    {
        cfg.ignoreArgument = true;
    }
    cfg.buttons = top.$.MessageBox.OK;
    top.$.MessageBox.Show(cfg);
}

/************************/
//封装的网页确认对话框
/************************/
function ScoConfirm(cfg)
{
    if (cfg.win == undefined)
    {
        //执行确认提示的窗口对象
        cfg.win = window.top;
    }

    if (cfg.title == undefined)
    {
        //标题
        cfg.title = "确认提示";
    }

    if (cfg.iconType == undefined)
    {
        //图标类型
        cfg.iconType = ICON_TYPE.QUESTION;
    }
    cfg.isConfirm = true;
    cfg.ignoreArgument = false;
    cfg.buttons = top.$.MessageBox.OKCANCEL;

    /*var isConfirm = cfg.win.confirm(cfg.msg);
    
    if(cfg.fn != undefined)
    {
    if(cfg.fnObj == undefined)
    {
    //函数所在的对象
    cfg.fnObj = window;
    }
        
    if(cfg.fnParams == undefined)
    {
    cfg.fnParams = [];
    }
        
    cfg.fnParams.unshift(isConfirm);
        
    cfg.fn.apply(cfg.fnObj, cfg.fnParams);
    }*/
    if (cfg.fn != undefined)
    {
        if (cfg.fnObj == undefined)
        {
            cfg.fnObj = window;
        }
        if (cfg.fnParams == undefined)
        {
            cfg.fnParams = [];
        }
    }
    top.$.MessageBox.Show(cfg);
}

/************************/
//封装的网页输入对话框
/************************/
function ScoPrompt(cfg)
{
    if (typeof (cfg) == "string")
    {
        cfg = { msg: cfg };
    }
    if (cfg.win == undefined)
    {
        //执行确认提示的窗口对象
        cfg.win = window.top;
    }

    if (cfg.title == undefined)
    {
        //标题
        cfg.title = "请输入";
    }

    if (cfg.iconType == undefined)
    {
        //图标类型
        cfg.iconType = ICON_TYPE.INFORMATION;
    }
    cfg.ignoreArgument = false;
    cfg.isPrompt = true;
    cfg.isConfirm = true;
    cfg.buttons = top.$.MessageBox.OKCANCEL;
    if (cfg.width == undefined)
    {
        cfg.width = 400;
    }
    if (cfg.height == undefined)
    {
        cfg.height = 400;
    }

    if (cfg.fn != undefined)
    {
        if (cfg.fnObj == undefined)
        {
            cfg.fnObj = window;
        }
        if (cfg.fnParams == undefined)
        {
            cfg.fnParams = [];
        }
    }
    top.$.MessageBox.Show(cfg);
}

/************************/
//判断对象是否为空
/************************/
function isNull(o)
{
    return ((typeof (o) == 'undefined') || (o == null) || (typeof (o) == 'unknown'));
}

/************************/
//根据Id取得对象
/************************/
function $D(id)
{
    return document.getElementById(id);
}

/****************************************/
//类名：StringBuilder
//功能：字符串连接操作，提高字符串处理效率
/****************************************/
function StringBuilder()
{
    this._strArr = new Array();

    if (isNull(StringBuilder._initialized))
    {
        //添加字符串
        StringBuilder.prototype.append = function(str)
        {
            this._strArr.push(str);
        }

        //格式化添加字符串
        StringBuilder.prototype.appendFormat = function(str)
        {
            if (arguments.length > 1)
            {
                for (var i = 1; i < arguments.length; i++)
                {
                    var reEx = new RegExp("\\{" + (i - 1) + "}", "gim");
                    str = str.replace(reEx, (isNull(arguments[i]) ? "" : arguments[i].toString()));
                }
            }
            this._strArr.push(str);
        }

        //清空所有字符串
        StringBuilder.prototype.removeAll = function()
        {
            this._strArr.splice(0, this._strArr.length);
        }

        //长度
        StringBuilder.prototype.length = function()
        {
            return this._strArr.length;
        }

        //重写toString方法
        StringBuilder.prototype.toString = function()
        {
            return this._strArr.join("");
        }

        StringBuilder._initialized = true;
    }
}

/************************/
//返回转换后的布尔值
/************************/
parseBool = function(obj, defVal)
{
    if ((null == obj) || (typeof (obj) == "undefined"))
    {
        return (typeof (defVal) == "boolean") ? defVal : false;
    }
    if (typeof (obj) == "boolean")
    {
        return obj;
    }
    else
    {
        var sVal = obj.toString().toLowerCase();
        if (sVal == "false" || sVal == "true")
        {
            return (sVal == "true") ? true : false;
        }
        else
        {
            var nVal = parseInt(sVal);
            return isNaN(nVal) ? false : (nVal != 0 ? true : false);
        }
    }
}

/************************/
//打开新窗口
/************************/
function openWindow(url, target, width, height, isCenter, resizable)
{
    var left, top;
    left = 0;
    top = 0;

    if (isCenter)
    {
        left = (parseInt(window.screen.availWidth) - width) / 2;
        top = (parseInt(window.screen.availHeight) - height) / 2;
    }

    var sParam = new StringBuilder();
    sParam.appendFormat("left={0},top={1},width={2},height={3},status=1,resizable={4}", left, top, width, height, resizable ? "yes" : "no");

    try
    {
        return window.open(url, target, sParam.toString());
    }
    catch (e)
    {
        return null;
    }
}

/************************/
//打开对话框
/************************/
function openDialog(url, args, iWidth, iHeight, bModel, isCenter)
{
    var bResizable = (!isNull(bResizable) && bResizable) ? "yes" : "no";

    var sParams = "dialogWidth:" + iWidth + "px;dialogHeight:" + iHeight + "px;help:0;status:0;scroll:0;resizable:0;";

    if (typeof (isCenter) == 'undefined' || (false == isCenter))
    {
        var iLeft = getDialogLeftPosition();
        var iTop = getDialogTopPosition();
        sParams += "dialogLeft:" + iLeft + "px;dialogTop:" + iTop + "px;";
    }
    else
    {
        sParams += "center:1;";
    }

    if (bModel)
    {
        return window.showModalDialog(url, args, sParams);
    }
    else
    {
        return window.showModelessDialog(url, args, sParams);
    }
}

/************************/
//打开对话框(模拟实现)
//fnArgs{
//    fn:回调函数
//    fnWin:函数所在window,
//    fnParams:函数参数
//    }
/************************/
function openScoDialog(dialogName, url, args, iWidth, iHeight, fnArg)
{
    if (document.activeElement != null)
        document.activeElement.blur();

    if (fnArg != undefined && fnArg.win == undefined)
    {
        fnArg.fnWin = window;
    }

    if (null == url || url.length == 0)
    {
        return;
    }

    if (url.charAt(0) != '/')
    {
        var href = window.location.href;
        var querySymbolIndex = href.lastIndexOf('?'); //问号(?)所在字符
        if (querySymbolIndex > -1)
        {
            //去掉问号(?)后面的字符
            href = href.substring(0, querySymbolIndex);
        }
        href = href.substring(0, href.lastIndexOf('/') + 1);
        url = href + url;
    }

    top.ScoDialog.OpenDialog(dialogName, url, iWidth, iHeight, args, fnArg);
}

/************************/
//取得对话框左边位置
/************************/
function getDialogLeftPosition()
{
    return window.screenLeft + 1;
}

/************************/
//取得对话框顶部位置
/************************/
function getDialogTopPosition()
{
    return window.screenTop + 1;
}

function GetWinWidth(f)
{
    return window.screen.availWidth * f;
}

function GetWinHeight(f)
{
    return window.screen.availHeight * f;
}

/************************/
//去掉字符串左边的空格
/************************/
function lTrim(s)
{
    return s.replace(/^\s+/g, "");
}

/************************/
//去掉字符串右边的空格
/************************/
function rTrim(s)
{
    return s.replace(/\s+$/g, "");
}

/************************/
//去掉字符串左右两边的空格
/************************/
function trim(s)
{
    return rTrim(lTrim(s));
}

/************************/
//格式化字符串
/************************/
function stringFormat(str)
{
    if (arguments.length > 1)
    {
        for (var i = 1; i < arguments.length; i++)
        {
            var reEx = new RegExp("\\{" + (i - 1) + "}", "gim");
            str = str.replace(reEx, arguments[i].toString());
        }
    }
    return str;
}

/************************/
//生成窗口名称
/************************/
function generateWinName(name)
{
    if (name) return name.toLowerCase().replace(/[-\{\}:]/g, "");
    var d = new Date();
    return d.getTime();
}

/************************/
//从URL取指定参数的值
/************************/
function getRequestValue(url, name)
{
    var regex = new RegExp("([\\?&]" + name + ")=([^&\\s]*)(&?)", "ig");
    if (!regex.test(url))
    {
        return "";
    }

    return RegExp.$2;
}

/****************************************************/
//设置URL中指定参数的值,如果参数不存在,则添加该参数
/****************************************************/
function setRequestValue(url, name, value)
{
    if (null == value || undefined == value)
    {
        value = "";
    }

    var regex = new RegExp("([\\?&]" + name + ")=[^&\\s]*(&?)", "ig");
    if (!regex.test(url))
    {
        var index = url.indexOf("?");
        url += (index == -1) ? "?" : "&";
        url += stringFormat("{0}={1}", name, value);
    }
    else
    {
        url = url.replace(regex, "$1=" + value + "$2");
    }

    return url;
}

/************************/
//移除URL中指定的参数
/************************/
function removeRequestValue(url, name)
{
    url = decodeURI(url);
    var nPos = url.indexOf("?");
    if (nPos == -1)
    {
        return encodeURI(url);
    }
    var urlHost = url.substring(0, nPos);
    var urlParam = url.substring(nPos + 1, url.length);

    var newParamArr = new Array();
    var paramArr = urlParam.split('&');
    for (var i = 0; i < paramArr.length; i++)
    {
        var str = paramArr[i];
        var strArr = str.split('=');
        if (strArr.length > 0)
        {
            if (strArr[0].toLowerCase() == name.toLowerCase())
            {
                continue;
            }
        }
        newParamArr.push(paramArr[i]);
    }

    return (newParamArr.length > 0) ? encodeURI(urlHost + "?" + newParamArr.join('&')) : encodeURI(urlHost);
}

/************************/
//Html属性编码
/************************/
function htmlAttributeEncode(s)
{
    if (typeof (s) != "string")
    {
        return s;
    }
    s = s.replace(/&/g, "&amp;");
    return s.replace(/\"/g, "&quot;");
}

/************************/
//Html编码
/************************/
function htmlEncode(s)
{
    if (typeof (s) != "string")
    {
        return s;
    }
    s = s.replace(/&/g, "&amp;");
    s = s.replace(/</g, "&lt;");
    s = s.replace(/>/g, "&gt;");
    return s.replace(/\"/g, "&quot;");
}

/************************/
//当前时间
/************************/
function LocalDateTimeNow()
{
    var dNow = new Date();
    //dNow.setMinutes(dNow.getMinutes() + (new Date().getTimezoneOffset()) - 479); 
    return dNow;
}

/************************/
//获得错误消息数组
/************************/
function getErrorMsg(doc)
{
    var errArr = new Array();
    var nodes = doc.getElementsByTagName("error");
    var nodeLength = nodes.length;
    for (var i = 0; i < nodeLength; i++)
    {
        var node = nodes[i];
        errArr.push(node.childNodes[0].nodeValue);
    }

    return errArr.join("\n");
}

/************************/
//获得详细的错误消息
/************************/
function getDetailErrorMsg(obj, title)
{
    var errStr = new StringBuilder();
    if (undefined != title && title.length > 0)
    {
        //errStr.appendFormat("{0}<br/>", title);
        errStr.appendFormat("{0}\n", title);
    }

    var errMsg = getErrorMsg(obj);
    if (errMsg != "")
    {
        errStr.append(errMsg);
    }
    else if (isNaN(getReturnValue(obj)))
    {
        errStr.append("会话过期,请刷新后重试。");
    }

    return errStr.toString();
}

/************************/
//获得返回值
/************************/
function getReturnValue(doc)
{
    return parseInt(getSingleNodeValue(doc, "retval"));
}

/************************/
//编码字段的值
/************************/
function encodeValue(value)
{
    if (isNull(value))
    {
        return "";
    }

    value = value.toString();
    if (value.length == 0)
    {
        return "";
    }

    value = value.replace(/&/gim, "&amp;");
    value = value.replace(/</gim, "&lt;");
    value = value.replace(/>/gim, "&gt;");
    value = value.replace(/\"/gim, "&quot;");
    return value;
}

//解码字段的值
function decodeValue(value)
{
    if (isNull(value))
    {
        return "";
    }

    value = value.toString();
    if (value.length == 0)
    {
        return "";
    }

    value = value.replace(/&quot;/gim, "\"");
    value = value.replace(/&gt;/gim, ">");
    value = value.replace(/&lt;/gim, "<");
    value = value.replace(/&amp;/gim, "&");
    return value;
}

/************************/
//编码发送到服务端的数据
/************************/
function encodePostData(data)
{
    var s = new StringBuilder();
    if (typeof (data) == "object")
    {
        for (var i in data)
        {
            s.appendFormat("&{0}=", i.toString());
            var val = data[i];
            if (null == val || typeof (val) == "undefined")
            {
                val = "";
            }
            //两次编码，防止中文乱码
            s.append(encodeURIComponent(encodeURIComponent(val)));
        }
    }

    return s.toString();
}

function IsGuidEqual(id1, id2)
{
    if (isNull(id1) || isNull(id2))
    {
        return false;
    }

    id1 = id1.toLowerCase();
    id1 = id1.replace("{", "");
    id1 = id1.replace("}", "");

    id2 = id2.toLowerCase();
    id2 = id2.replace("{", "");
    id2 = id2.replace("}", "");

    if (id1 != id2)
    {
        return false;
    }

    return true;
}

function StringToDate(str)
{
    if (str == "")
    {
        return new Date();
    }

    str = str.substr(0, str.indexOf(" "));
    var ary = str.split("-");
    if (ary.length != 3)
    {
        return new Date();
    }
    else
    {
        var y = ary[0];
        var m = parseInt(ary[1].replace(/^0+/gi, '')) - 1;
        var d = parseInt(ary[2].replace(/^0+/gi, ''));
        return new Date(y, m, d);
    }
}

//日期字符串转换为日期类型
function StringDateToDate(str)
{
    if (str == "")
        return new Date();

    var ary = str.split("-");
    if (ary.length != 3)
        return new Date();
    else
        return new Date(ary[0], parseInt(ary[1], 10) - 1, ary[2]);
}

function stringToDateTime(str)
{
    if (str == "")
        return new Date();

    var date = str.substr(0, str.indexOf(" "));
    var time = str.substr(str.indexOf(" "));
    var ary1 = date.split("-");
    var ary2 = time.split(":");
    if ((ary1.length == 3) && (ary2.length == 3))
        return new Date(ary1[0], parseInt(ary1[1]) - 1, ary1[2], ary2[0], ary2[1], ary2[2]);
    else
        return new Date();
}

function getDateFromDateTime(dt)
{
    return new Date(dt.getYear(), dt.getMonth(), dt.getDate());
}

function getDateString(dt)
{
    return dt.getYear() + "-" + (parseInt(dt.getMonth()) + 1) + "-" + dt.getDate();
}

function GetCNDateDescrption(strDate)
{
    var oDt = StringToDate(strDate);
    if (null == oDt)
    {
        return "";
    }

    return oDt.getYear() + "年" + (parseInt(oDt.getMonth()) + 1) + "月" + oDt.getDate() + "日";
}

function GetCookie(sName)
{
    var aCookie = document.cookie.split("; ");
    for (var i = 0; i < aCookie.length; i++)
    {
        var aCrumb = aCookie[i].split("=");
        if (sName == aCrumb[0])
            return unescape(aCrumb[1]);
    }
    return null;
}

function SetCookie(sName, sValue, isExpired)
{
    var cookieString = sName + "=" + escape(sValue);
    if (!isExpired)
    {
        date = new Date(3000, 1, 1);
        cookieString += "; expires=" + date.toGMTString();
    }
    document.cookie = cookieString;
}

function AccessibilityClick()
{
    if (event.keyCode == 13)
    {
        event.srcElement.click();

        event.cancelBubble = true;
        return false;
    }
}

function EntityFormInfo(isNew, objectId, otc)
{
    this.isNew = isNew;
    this.objectId = objectId;
    this.otc = otc;
}

function offsetTop(o)
{
    var i = 0;
    while (o.offsetParent != null)
    {
        i += o.offsetTop - o.scrollTop;
        o = o.offsetParent;
    }
    return i + o.offsetTop - o.scrollTop;
}

function offsetLeft(o)
{
    var i = 0;
    while (o.offsetParent != null)
    {
        i += o.offsetLeft - o.scrollLeft;
        o = o.offsetParent;
    }
    return i + o.offsetLeft - o.scrollLeft;
}

/************************/
//错误处理
/************************/
function operError(status, obj)
{
    alert("error: " + status);
    return;
    if (status != -1)
    {
        alert(obj);
    }
    else
    {
        alert("Request timeout!");
    }
}


/*********************************************
判断函数
*********************************************/
function GetType(obj)
{
    return Object.prototype.toString.call(obj);
}
/*********************************************
是否是字符串
*********************************************/
function IsString(obj)
{
    return GetType(obj) == "[object String]";
}
/*********************************************
是否是数组
*********************************************/
function IsArray(obj)
{
    return GetType(obj) == "[object Array]";
}
/*********************************************
是否是函数
*********************************************/
function IsFunction(obj)
{
    return GetType(obj) == "[object Function]";
}
/*********************************************
是否是函数
*********************************************/
function IsDate(obj)
{
    return GetType(obj) == "[object Date]";
}
/*********************************************
是否是数字
*********************************************/
function IsNumber(obj)
{
    return GetType(obj) == "[object Number]";
}
/*********************************************
是否是数字
*********************************************/
function IsBoolean(obj)
{
    return GetType(obj) == "[object Boolean]";
}
/*********************************************
是否是基本数据类型
*********************************************/
function IsBaseType(obj)
{
    return IsString(obj) || IsNumber(obj) || IsBoolean(obj);
}


//取得文件扩展名
function GetFileExtName(file)
{
    if (typeof (file) == "string")
    {
        var i = file.lastIndexOf("\\");
        if (i > -1)
        {
            file = file.substr(i + 1);
        }

        i = file.lastIndexOf(".");
        if (i > -1)
        {
            return file.substr(i + 1);
        }
        else
        {
            return "";
        }
    }

    return "";
}


function getOs()
{
    var OsObject = "";
    if (navigator.userAgent.indexOf("MSIE") > 0)
    {
        return "MSIE";
    }
    if (isFirefox = navigator.userAgent.indexOf("Firefox") > 0)
    {
        return "Firefox";
    }
    if (isSafari = navigator.userAgent.indexOf("Safari") > 0)
    {
        return "Safari";
    }
    if (isCamino = navigator.userAgent.indexOf("Camino") > 0)
    {
        return "Camino";
    }
    if (isMozilla = navigator.userAgent.indexOf("Gecko/") > 0)
    {
        return "Gecko";
    }
    return OsObject;
}

function checkOsIE()
{
    if (navigator.userAgent.indexOf("MSIE") > 0)
    {
        return true;
    }
    return false;
}


