﻿/// <reference path="jquery-vsdoc.js" /> 
///jQuery扩展开始
//扩展Json功能
(function($) {
    $.setCookie = function(name, value, days) {
        var date = new Date();
        date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
        document.cookie = escape(name) + '=' + escape(value) + '; expires=' + date.toGMTString();
    };

    $.getCookie = function(name) {
        var arr = document.cookie.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)'));
        if (arr != null) return unescape(arr[2]); return null;
    };

    $.delCookie = function(name)//删除cookie
    {
        var exp = new Date();
        exp.setTime(exp.getTime() - 1);
        var cval = $.getCookie(name);
        if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
    };

    //json 处理方法来源于http://code.google.com/p/jquery-json/
    function toIntegersAtLease(n) {
        return n < 10 ? '0' + n : n;
    }

    Date.prototype.toJSON = function(date) {
        return this.getUTCFullYear() + '-' +
             toIntegersAtLease(this.getUTCMonth()) + '-' +
             toIntegersAtLease(this.getUTCDate());
    };

    var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
    var meta = {
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"': '\\"',
        '\\': '\\\\'
    };

    $.quoteString = function(string) {
        if (escapeable.test(string)) {
            return '"' + string.replace(escapeable, function(a) {
                var c = meta[a];
                if (typeof c === 'string') {
                    return c;
                }
                c = a.charCodeAt();
                return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
            }) + '"';
        }
        return '"' + string + '"';
    };

    $.toJSON = function(o, compact) {
        var type = typeof (o);

        if (type == "undefined")
            return "undefined";
        else if (type == "number" || type == "boolean")
            return o + "";
        else if (o === null)
            return "null";

        if (type == "string") {
            return $.quoteString(o);
        }

        if (type == "object" && typeof o.toJSON == "function")
            return o.toJSON(compact);

        if (type != "function" && typeof (o.length) == "number") {
            var ret = [];
            for (var i = 0; i < o.length; i++) {
                ret.push($.toJSON(o[i], compact));
            }
            if (compact)
                return "[" + ret.join(",") + "]";
            else
                return "[" + ret.join(", ") + "]";
        }

        if (type == "function") {
            throw new TypeError("Unable to convert object of type 'function' to json.");
        }

        var ret = [];
        for (var k in o) {
            var name;
            type = typeof (k);

            if (type == "number")
                name = '"' + k + '"';
            else if (type == "string")
                name = $.quoteString(k);
            else
                continue;

            var val = $.toJSON(o[k], compact);
            if (typeof (val) != "string") {
                continue;
            }

            if (compact)
                ret.push(name + ":" + val);
            else
                ret.push(name + ": " + val);
        }
        return "{" + ret.join(", ") + "}";
    };

    $.compactJSON = function(o) {
        return $.toJSON(o, true);
    };

    $.evalJSON = function(src) {
        return eval("(" + src + ")");
    };

    $.secureEvalJSON = function(src) {
        var filtered = src;
        filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
        filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
        filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');

        if (/^[\],:{}\s]*$/.test(filtered))
            return eval("(" + src + ")");
        else
            throw new SyntaxError("Error parsing JSON, source is not valid.");
    }; //json end

    //将Html代码转为网页可见元素
    $.HtmlEncode = function(strHTML) {
        var div = document.createElement('div');
        var text = document.createTextNode(strHTML);
        div.appendChild(text);
        return div.innerHTML;
    };
    //根据事件查找源元素
    $.srcElement = function(event) {
        return $(event.srcElement || event.target);
    };
    // 判断是否含有中文字符串
    $.hasCnChar = function(str) {
        str = $.trim(str);
        var reg = /[^\x00-\xff]/;
        return reg.test(str)
    };
    //是否是有效用户名，英文字符串，下划线，中文
    $.isValidName = function(str) {
        var reg = /^(\w|_|[\u4e00-\u9fa5]){1,40}$/;
        return reg.test(str)
    };
    //判断是否数字
    $.isInt = function(str) {
        var reg = /^\d+$/;
        return reg.test(str)
    };
    //是否英文
    $.isEnChar = function(str) {
        var reg = /^[a-zA-Z]+$/;
        if (!reg.test(str)) {
            return false;
        }
        return true;
    };

    //是否双字节（包括中文）
    $.isDoubleChar = function(str) {
        var reg = /^[^\x00-\xff]+$/;
        if (!reg.test(str)) {
            return false;
        }
        return true;
    };

    //判断Email
    $.isEmail = function(str) {
        var reg = /^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.){1,4}[a-z]{2,3}$/i;
        return reg.test(str)
    };

    //判断手机
    $.isMobile = function(str) {
        var reg = /^1[35][0-9]{9}$/;
        return reg.test(str)
    };

    $.isUrl = function(str) {
        var reg = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
        return reg.test(str);
    };

    //检查是否是正确的日期
    $.isDate = function(sDate) {
        var iaMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        var iaDate = new Array(3)
        var year, month, day

        if (arguments.length != 1) return false
        iaDate = sDate.toString().split("-")
        if (iaDate.length != 3) return false
        if (iaDate[1].length > 2 || iaDate[2].length > 2) return false

        year = parseFloat(iaDate[0])
        month = parseFloat(iaDate[1])
        day = parseFloat(iaDate[2])

        if (year < 1900 || year > 2100) return false
        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;
        if (month < 1 || month > 12) return false
        if (day < 1 || day > iaMonthDays[month - 1]) return false
        return true
    };

    //是否是有效域名
    $.isDomain = function(str) {
        var bCheck = false
        var reg = /^([0-9a-z\u4E00-\u9FA5]([a-z0-9\u4E00-\u9FA5\-]*[a-z0-9\u4E00-\u9FA5])?\.){1,3}[a-z]{2,6}$/gi;

        if (reg.test(str)) {
            reg = /(--)/;
            if (!reg.test(str))
                bCheck = true;
        }
        return bCheck;
    };
    //显示提示文字
    $.showText = function(emid, str, strCss) {
        var e = $('#' + emid);
        if (e.length == 0) return;
        e.show().html(str).attr('class', strCss);
    };
    //在标签内显示内容
    $.showTextInTag = function(tagid, text, className, needhide) {
        var id = 'helpmsg' + tagid;
        if ($('#' + id).length == 0) {
            $('#' + tagid).prepend('<div id="' + id + '"></div>');
        };
        $('#' + id).html(text).attr('class', className).show();
        if (needhide == true) $('#' + id).fadeOut(3000);
    };
    //消除提示
    $.clearText = function() {
        for (var i = 0; i < arguments.length; i++) {
            var element = $('#' + arguments[i]);
            if (element) element.hide().html('').attr('class', '');
        }
    };
    // 检测长度
    $.len = function(str) {
        var str = str.replace(/[^\x00-\xff]/g, '**');
        return str.length;
    };
    //截取指定长度字符串
    $.getByteOfNum = function(val, num) {
        var ch, bytenum = 0;
        var rs = "";
        var pt = /[^\x00-\xff]/;
        for (var i = 0; i < num; i++) {
            ch = val.substr(i, 1);
            if (ch.match(pt)) {
                bytenum += 2;
                if (bytenum > num) {
                    return rs;
                }
            } else {
                bytenum += 1;
            }
            rs += ch;
            if (bytenum == num) {
                return rs;
            }
        }
        return rs;
    };
    //导入文件
    $.loadCSS = function(path) {
        var ls = document.getElementsByTagName('link');
        for (i = 0; i < ls.length; i++) {
            if (ls[i].href && ls[i].href.indexOf(path) != -1) return;
        }
        s = document.createElement('link');
        s.rel = 'stylesheet';
        s.type = 'text/css';
        s.href = path;
        s.disabled = false;
        var head = document.getElementsByTagName('head')[0];
        head.appendChild(s);
    };
    $.rnd = function() {
        var day = new Date();
        var i = 9;
        var time = day.getYear().toString() + day.getMonth().toString() +
	                day.getDate().toString() + day.getHours().toString() +
	                day.getMinutes().toString() + day.getSeconds().toString() +
	                day.getMilliseconds().toString();
        return time;
    };
    $.anchor = function() {
        var hash = window.location.hash;
        hash = hash.substr(1);
        if (hash.indexOf('?') > -1) {
            var ary = hash.split('?', 1);
            hash = ary[0];
        }
        return hash;
    };
    $.QueryString = function(paramName) {
        var sValue = location.search.match(new RegExp('[\?\&]' + paramName + '=([^\&]*)(\&?)', 'i'))
        return sValue ? sValue[1] : sValue
    }
})(jQuery);

//周末深情提供 http://www.manhoo.cn
$.fn.drag = function() {
    return this.each(function() {
        var draging = false;
        var pX, pY;
        $(this).mousedown(function(event) {
            if (this.setCapture)
                this.setCapture();
            else
                window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
            pX = event.clientX - this.offsetLeft;
            pY = event.clientY - this.offsetTop;
            draging = true;
        }).mousemove(function(event) {
            if (draging == false) return;
            if (window.event) event = window.event;
            this.style.left = event.clientX - pX + "px";
            this.style.top = event.clientY - pY + "px";
        }).mouseup(function(event) {
            draging = false;
            if (this.releaseCapture)
                this.releaseCapture();
            else
                window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
        });
    });
}
///jQuery扩展结束

//静态类，含有常用方法
var Biuren = {

    //向元素中插入html内容
    //在ie8中jquery的$.html支持不友好，如果加载内容中有js，则无法运行
    html: function(container, html) {
        if ($('#' + container).length > 0)
            $('#' + container).get(0).innerHTML = html;
    },

    //获取ckeditor编辑器内容
    getEditorHTMLContents: function(editorName) {
        var editor = CKEDITOR.instances[editorName];
        return (editor.getData());
    },

    insertEditorHtml: function(editorName, html) {
        var editor = FCKeditorAPI.GetInstance(editorName).InsertHtml(html);
    },

    //显示提示文字，并获焦点
    inputErr: function(fid, emid, str, strCss, setTop) {
        var f = $('#' + fid);
        this.showText(emid, str, strCss);
        if (f.length == 0) return false;
        if (f.disabled) return false;
        f.focus();
        if (typeof setTop != 'undefined') this.scrollTop();
        return false;
    },

    post: function(options) {
        var options = jQuery.extend({
            type: 'post',
            dataType: 'json',
            success: function(json) {
                if (Biuren.checkError(json, ajaxOptions.container)) return;
                if (json.Result == 0) {
                    Biuren.Pager.setAjaxStatus('本次操作成功！', 'help');
                }
                else {
                    $.showText('help', Biuren.Comm.getErrorText(json.Result), 'error');
                    //$(":button").attr("disabled", false);
                }
            },
            error: function() {
                $.showText('help', Biuren.Comm.getErrorText('1000', true), 'error');
                //$(":button").attr("disabled", false);
            }
        }, options);

        $.ajax(options);
    },

    get: function(options) {
        var options = jQuery.extend({
            cache: true,
            type: 'get'
        }, options);

        $.ajax(options);
    },
    showOK: function() {
        $('#help').show().attr('class', 'help').html('操作成功').fadeOut(4000);
    },

    setBgColor: function(obj) {
        $(obj).css({ backgroundColor: '#EFEFEF' });
    },

    moveBgColor: function(obj) {
        $(obj).css({ backgroundColor: '' });
    },
    checkError: function(data, container) {
        var result = false;
        if (typeof (data.Result) != 'undefined') {
            if (data.Result != 0) {
                $.showText('help', Biuren.Comm.getErrorText(data.Result), 'error');
                result = true;
            }
        }
        if (result) $('#' + container).text("");
        return result;
    }
}

Biuren.Pager = new function() {

    //默认更新ID
    this.updateID = 'ajaxcontainer';

    //默认
    this.defaultAction = 'notfound';

    //初始化页面
    this.init = function() {

        //绑定click事件
        this.blindClick();

        //得到瞄点
        var action = this.getAction();

        if (action != '' && typeof Pager != 'undefined' && typeof Pager[action] != 'undefined') {
            if (typeof Pager[action].doAction != 'undefined')
                Pager[action].doAction(Pager[action].container, Pager[action].url, action);
            else
                Biuren.Pager.doRequest(Pager[action].container, Pager[action].url, action);
        }
    };

    //初始化表单
    this.initForm = function() {
        //得到瞄点
        var action = this.getAction();

        //更新表单
        this.updateElement(Biuren.Pager.updateID, Pager[action].url);

        //更新导航条
        Biuren.html('biunav', Pager[action].nav);
    };

    //更新ID
    this.updateElement = function(destID, url) {
        $('#' + destID).html(requestLoading).load(url);
    };

    //得到瞄点动作
    this.getAction = function() {

        //得到瞄点
        var action = $.anchor();

        return action == '' ? Biuren.Pager.defaultAction : action;
    };

    //click处理函数
    this.doClick = function(event) {
        var target = $.srcElement(event).get(0);
        var url = window.location.href.toLowerCase();
        var clickurl = target.href.toLowerCase().split('#', 2);
        if (clickurl.length != 2) return;

        var href = clickurl[0];

        if (url.indexOf(href) > -1) {
            var action = target.rel;
            if (typeof Pager[action] == 'undefined') action = this.defaultAction;
            if (typeof Pager[action].doAction != 'undefined') {
                //处理回调
                if (typeof (Pager[action].oncreate) != 'undefined')
                    Pager[action].oncreate();
                Pager[action].doAction(Pager[action].container, Pager[action].url, action);
            }
            else
                Biuren.Pager.doRequest(Pager[action].container, Pager[action].url, action);
        }
    };

    //绑定click事件
    this.blindClick = function() {
        $('.relaction').bind('click', {}, Biuren.Pager.doClick);
    };

    //处理一般处理请求
    this.doRequest = function(container, url, action) {
        var options = {
            cache: Pager[action].cache,
            url: url,
            beforeSend: function() {
                //处理回调
                if (typeof (Pager[action].oncreate) != 'undefined')
                    Pager[action].oncreate();
                $('#' + container).html(requestLoading);
            },
            success: function(data) {
                if (Biuren.checkError(data, container)) return;
                Biuren.html(container, data);
                //处理回调
                if (typeof (Pager[action].oncomplete) != 'undefined')
                    Pager[action].oncomplete();
            }
        };

        Biuren.get(options);

        //更新导航条
        if (action != '' && typeof action != 'undefined' && $('#biunav'))
            Biuren.html('biunav', Pager[action].nav);
    };

    this.setAjaxStatus = function(text, className, speed) {
        if ($('#ajaxstatus').length == 0)
            $('<div id="ajaxstatus" class="help">').appendTo('body');
        $('#ajaxstatus').show().html(text).attr('class', className);
        if (typeof (speed) != 'undefined')
            $('#ajaxstatus').fadeOut(speed);
    };

    this.clearAjaxStatus = function() {
        $('#ajaxstatus').fadeOut('slow');
    };

}

Biuren.Box = {
    _closeCallback: Object,
    footerTitle: '有你，有我，有快乐',
    //初始化图层
    init: function() {
        var boxHtml = '<div id="biurenbox_overlay" style="display: none;"></div>' +
        '<div id="biurenbox" style="display: none;">' +
        '<div id="biurenbox_title">' +
        ' <span id="biurenbox_title_text"></span>' +
        ' <span id="biurenbox_title_close" title="关闭"></span></div>' +
        '<div id="biurenbox_container"><div id="biurenbox_content"></div></div>' +
        '<div id="biuren_footer">' + Biuren.Box.footerTitle + '</div>' +
        '</div>';
        $(boxHtml).appendTo('body');
        $('#biurenbox_title_close').click(Biuren.Box.close);
        $('#biurenbox').drag();
    },

    showBox: function(options) {
        var options = jQuery.extend({
            title: '提示信息',
            width: 300,
            height: 200,
            content: '',
            setUrl: ''
        }, options || {});

        Biuren.Box.setTitle(options.title);
        Biuren.Box.setContent(options.content);
        Biuren.Box.showCenter(options.width, options.height);
    }
    ,
    setTitle: function(title) {
        $('#biurenbox_title_text').html(title);
    },

    setContent: function(content) {
        Biuren.html('biurenbox_content', content);
    },

    setAjaxContent: function(url, callback) {
        $('#biurenbox_content').html(requestLoading);
        Biuren.get({
            url: url,
            success: function(data) {
                Biuren.html('biurenbox_content', data);
                if (typeof (callback) != 'undefined' && callback != null)
                    callback();
            }
        });
    },

    setUrl: function(url) {
        var content = '<iframe frameborder="0" name="biurenbox_content" \
                 id="biurenbox_framecontent" src="' + url + '" width="100%" height="100%"> </iframe>';
        Biuren.html('biurenbox_content', content);
    },

    show: function(width, height, top, left) {
        Biuren.Box._showBox(width, height, top, left);
    },

    showCenter: function(options) {
        var offset_top = ($(document).scrollTop() + (($(window).height() > options.height) ? Math.floor(($(window).height() - options.height) / 2) : 0)) - 80;
        var offset_left = ($(document).scrollLeft() + Math.floor(($(window).width() - options.width) / 2));
        var top = (options.height <= $(document).height()) ? ((offset_top != null && offset_top > 0) ? offset_top : '0') : 0;
        var left = (options.width <= $(document).width()) ? ((offset_left != null && offset_left > 0) ? offset_left : '0') : 0;
        Biuren.Box._showOverlay();
        Biuren.Box._showBox(options.width, options.height, top, left);
    },

    _showOverlay: function(width, height) {
        $('#biurenbox_overlay').css({ width: $(document).width() + 'px', height: $(document).height() + 'px' });
        $('#biurenbox_overlay').show();
    },

    _showBox: function(width, height, top, left) {
        $('#biurenbox_content').css({ height: height + 'px', width: (width - 10) + 'px' });
        $('#biurenbox').css({ width: width + 'px', top: top + 'px', left: left + 'px' });
        Biuren.Box._hideElement();
        $('#biurenbox').show();
    },
    closeCallback: function(func) {
        Biuren.Box._closeCallback = func;
    },
    close: function() {
        if (typeof (Biuren.Box._closeCallback) == 'function') {
            Biuren.Box._closeCallback();
        }
        $('#biurenbox_overlay').hide();
        $("#biurenbox").hide();
        Biuren.Box._showElement();
        $('#biurenbox_content').text('');

    },

    _hideElement: function() {
        if ($.browser.msie)
            $('select').hide();
        $("object").hide();
        $("embed").hide();
    },

    _showElement: function() {
        if ($.browser.msie)
            $('select').show();
        $("embed").show();
        $("object").show();
    }

}

Biuren.Grid = {
    create: function(options) {
        //获取父标签
        var parentTag = $('#' + options.container);

        //创建保存Table数组
        var aryHtml = new Array();

        //创建一个<table>
        aryHtml.push('<table id="' + options.id + '"  class="' + options.className + '">');

        //创建表标题
        if (typeof (options.caption) != 'undefined')
            aryHtml.push('<caption>' + options.caption + '</caption>');

        //创建表头
        if (typeof (options.template.head) != 'undefined') {
            aryHtml.push('<thead><tr>');
            var tempHead = options.template.head; //表头模板
            var temptitle;
            for (var i = 0; i < tempHead.length; i++) {
                if (typeof (tempHead[i].text) != 'undefined')
                    temptitle = tempHead[i].text;
                else
                    temptitle = tempHead[i];
                aryHtml.push('<td>' + temptitle + '</td>');
            }
            aryHtml.push('</tr></thead>');
        }

        //创建tbody
        aryHtml.push('<tbody>');

        //创建列表内容
        var tempRow = options.template.row; 	//行模板
        var ds = options.ds; //数据源
        //没有数据显示默认内容
        if (ds.length == 0)
            aryHtml.push('<tr><td>' + options.noData + '</td></tr>');

        for (var i = 0; i < ds.length; i++) {
            //处理分行显示，目前仅支持只有一列数据的多行多列显示
            if ((i % options.col) == 0) {
                if (i != 0) aryHtml.push('</tr>');
                aryHtml.push('<tr ');
                //tr行样式
                if (typeof (tempRow.className) != 'undefined') {
                    var temp = tempRow.className;
                    //交替ClassName
                    if (typeof (tempRow.switchClassName) != 'undefined' && i % 2 != 0)
                        temp = tempRow.switchClassName;
                    aryHtml.push('class="' + temp + '" ');
                };

                if (typeof (tempRow.mark) != 'undefined') {
                    aryHtml.push(' ' + tempRow.mark + ' ');
                };
                //tr行事件
                if (typeof (tempRow.event) != 'undefined')
                //循环增加行事件
                    for (var l = 0; l < tempRow.event.length; l++)
                    aryHtml.push(' ' + tempRow.event[l].name + '= "' + tempRow.event[l].func + '" ');

                aryHtml.push('>'); //关闭TR标签
            }
            //循环显示行的列数据
            var tempCell = options.template.cell; //列模板
            //列扩展属性
            var cellMark = '';
            if (typeof (options.template.cellAttr) != 'undefined') {
                if (typeof (options.template.cellAttr.event) != 'undefined') {
                    //循环增加列事件
                    for (var l = 0; l < options.template.cellAttr.event.length; l++)
                        cellMark += ' ' + options.template.cellAttr.event[l].name + '= "' + options.template.cellAttr.event[l].func + '" ';
                }
            }
            for (var j = 0; j < tempCell.length; j++) {
                aryHtml.push('<td ' + cellMark);
                //增加td样式表
                if (typeof (tempCell[j].className) != 'undefined')
                    aryHtml.push(' class="' + tempCell[j].className + '" ');
                aryHtml.push('>' + this.replaceParam(tempCell[j].text, this.getValueFromAry(ds[i], tempCell[j].value)) + '</td>');
            }
        }
        aryHtml.push('</tr></tbody>'); //关闭tbody标签

        //创建表尾
        if (typeof (options.template.foot) != 'undefined' && ds.length != 0) {
            aryHtml.push('<tfoot><tr><td colspan="' + options.template.cell.length * options.col + '"> ');

            //获取tfoot内容
            var tempFoot = options.template.foot; //表尾模板
            temp = tempFoot.text;
            if (typeof (options.pageLink) != 'undefined')
                temp = temp.replace('{0}', options.pageLink);

            aryHtml.push('<div class="pages">' + temp + '</div>');

            aryHtml.push('<input type="hidden" name="' + options.id + 'ViewState" id="' + options.id + 'ViewState" />');
            aryHtml.push('</td></tr></tfoot>');
        }

        aryHtml.push('</table>'); //关闭表格

        //将表格插入页
        Biuren.html(options.container, aryHtml.join(''));
    },

    chkAll: function(obj) {
        var ary = $(".biurenchk");
        if (obj.checked == true)
            $(".biurenchk").each(function(i, obj) { obj.checked = true });
        else
            $(".biurenchk").each(function(i, obj) { obj.checked = false });
    },

    getChkValue: function() {
        var ary = $('.biurenchk');
        var result = [];
        ary.each(function(i, obj) {
            if (obj.checked == true)
                result.push(obj.value);
        });
        return result.toString();
    },

    show: function(json, options) {
        $('#' + options.container).html('');
        if (typeof (json.Table) != 'undefined')
            jQuery.extend(options, { ds: json.Table.rows });
        else
            jQuery.extend(options, { ds: json.rows });

        this.create(options);
    },

    //显示指定长度字符串
    truncate: function(val, num, suffix) {
        if (val.replace(/[^\x00-\xff]/g, '**').length <= num)
            return val;
        var ch, bytenum = 0;
        var rs = '';
        var pt = /[^\x00-\xff]/;
        num = num - suffix.length;
        var result;
        for (var i = 0; i < num; i++) {
            ch = val.substr(i, 1);
            if (ch.match(pt)) {
                bytenum += 2;
                if (bytenum > num) {
                    result = rs;
                    break;
                }
            } else {
                bytenum += 1;
            }
            rs += ch;
            if (bytenum == num) {
                result = rs;
                break;
            }
        }
        return result + suffix;
    },
    //刷新当前列表
    refresh: function(id) {
        if ($('#BiurenGridcurrent' + id).length == 0) return;
        var func = $('#BiurenGridcurrent' + id).attr('rel');
        eval(func);
    }
    ,
    //获取一个数组中自定列的值，位置由1开始
    getValueFromAry: function(ary, value) {
        var temp;
        var result = new Array(value.length);
        var pos;
        for (var i = 0; i < value.length; i++) {
            pos = typeof (value[i].pos) == 'undefined' ? value[i] : value[i].pos;
            temp = ary[pos];
            //为空处理或有默认值
            if (typeof (temp) == 'undefined' || temp.length == 0) {
                if (typeof (value[i].def) != 'undefined')
                    temp = value[i].def;
                else
                    temp = '';

            }
            temp = temp.toString();

            //是否有转义
            if (typeof (value[i].parse) != 'undefined') {
                if (typeof (value[i].parse[temp]) != 'undefined')
                    temp = value[i].parse[temp];
                else
                    temp = '';
            }
            //限制长度
            if (typeof (value[i].maxlen) != 'undefined')
                temp = Biuren.Grid.truncate(temp, value[i].maxlen, '...');
            //是否转换Html
            if (value[i].isHtml != true)
                temp = $.HtmlEncode(temp);

            result[i] = temp;
        }
        return result;
    },

    //替换参数
    replaceParam: function(text, value) {
        var result = text;
        var reg;
        for (var i = 0; i < value.length; i++) {
            reg = new RegExp('\{+' + i + '+\}', 'g')
            result = result.replace(reg, value[i]);
        }
        return result;
    },


    //分页算法来源于： Gabriel Birke (birke *at* d-scribe *dot* de) 写的 jQuery Pagination Plugin v1.1
    _getInterval: function(pageIndex, pages) {
        var ne_half = Math.ceil(8 / 2);
        var upper_limit = pages - 8;
        var start = pageIndex > ne_half ? Math.max(Math.min(pageIndex - ne_half, upper_limit), 0) : 0;
        var end = pageIndex > ne_half ? Math.min(pageIndex + ne_half, pages) : Math.min(8, pages);
        return [start, end];
    },
    _appendItem: function(id, pageIndex, currentPage, pages, appendopts) {
        pageIndex = pageIndex < 0 ? 0 : (pageIndex < pages ? pageIndex : pages - 1); // Normalize page id to sane value
        appendopts = jQuery.extend({ text: pageIndex + 1, classes: "" }, appendopts || {});
        if (pageIndex == currentPage) {
            var lnk = '<span id="BiurenGridcurrent' + id + '" class="current" rel="Biuren.Grid.goto(\'' + escape($.toJSON({ id: id, pageIndex: pageIndex + 1 })) + '\')">' + (appendopts.text) + '</span>';
        }
        else
            var lnk = '<a href="javascript:void(0)" onclick="Biuren.Grid.goto(\'' + escape($.toJSON({ id: id, pageIndex: pageIndex + 1 })) + '\')"> ' + (appendopts.text) + '</a>';

        return lnk;
    }
    ,
    _pagination: function(id, listOptions) {
        var pageSize = listOptions.row * listOptions.col;
        var pageIndex = listOptions.pageIndex - 1;
        var pages = Math.floor((listOptions.total - 1) / pageSize) + 1;

        var aryNav = new Array();
        var interval = Biuren.Grid._getInterval(pageIndex, pages);

        //Generate "Previous"-Link
        if (pageIndex > 0)
            aryNav.push(Biuren.Grid._appendItem(id, pageIndex - 1, pageIndex, pages, { text: '上页', classes: 'prev' }));

        // Generate starting poin
        if (interval[0] > 0) {
            var end = Math.min(2, interval[0]);
            for (var i = 0; i < end; i++)
                aryNav.push(Biuren.Grid._appendItem(id, i, pageIndex, pages));

            if (interval[0] > 2) {
                aryNav.push('<span>...</span>');
            }
        }

        // Generate interval links
        for (var i = interval[0]; i < interval[1]; i++)
            aryNav.push(Biuren.Grid._appendItem(id, i, pageIndex, pages));

        // Generate ending points
        if (interval[1] < pages) {
            if (pages - 2 > interval[1]) {
                aryNav.push('<span>...</span>');
            }

            var begin = Math.max(pages - 2 + 1, interval[1]);
            for (var i = begin; i < pages; i++)
                aryNav.push(Biuren.Grid._appendItem(id, i, pageIndex, pages));
        }

        // Generate "Next"-Link
        if (pageIndex < pages - 1)
            aryNav.push(Biuren.Grid._appendItem(id, pageIndex + 1, pageIndex, pages, { text: '下页', classes: 'next' }));

        return aryNav.join('');
    },
    //分页算法结束

    //显示表格
    goto: function(ajaxOptions, templateOptions) {
        //还原参数
        if (arguments.length == 1) {
            var obj = $.evalJSON(unescape(arguments[0]));
            var json = $('#' + obj.id + 'ViewState').val();
            json = $.evalJSON(unescape(json));
            ajaxOptions = jQuery.extend(json.ajax, { pageIndex: obj.pageIndex });
            templateOptions = json.template;
        }

        //更新插入容器ID
        jQuery.extend(templateOptions, { container: ajaxOptions.container });
        $('#' + ajaxOptions.container).html(requestLoading);

        var options = {
            type: ajaxOptions.type || 'get',
            cache: ajaxOptions.cache || false,
            dataType: 'json',
            url: ajaxOptions.url,
            container: ajaxOptions.container,    //获取内容填充的对象Id，此属性给回调函数使用，ajax不用此参数
            data: ajaxOptions.queryParams + '&pageSize=' + ajaxOptions.row * ajaxOptions.col + '&pageIndex=' + ajaxOptions.pageIndex,
            error: function() {
                $.showText('help', Biuren.Comm.getErrorText('1000'), 'error');
                //Form.enable('biurenform');
            },
            success: function(json) {
                if (Biuren.checkError(json, ajaxOptions.container)) return;
                //如果有分页,则创建分页导航
                if (typeof (templateOptions.template.foot) != 'undefined') {
                    if (ajaxOptions.pageIndex == 1)
                        jQuery.extend(ajaxOptions, { 'total': json['Table1'].rows[0][0] }); //记录总数
                    var pagelink = Biuren.Grid._pagination(templateOptions.id, ajaxOptions); //获取换页导航
                    jQuery.extend(templateOptions, { pageLink: pagelink }); //将数据增加到表格模板中
                }
                //传入显示行数与列数
                jQuery.extend(templateOptions, { row: ajaxOptions.row, col: ajaxOptions.col });

                //显示表格
                Biuren.Grid.show(json, templateOptions);

                //如果有分页则将参数缓存到页面
                if (typeof (templateOptions.template.foot) != 'undefined') {
                    templateOptions = jQuery.extend(templateOptions, { ds: [] });
                    var param = { ajax: ajaxOptions, template: templateOptions };
                    $('#' + templateOptions.id + 'ViewState').val(escape($.toJSON(param)));
                }

                //回调CallBack
                if (typeof (templateOptions.callback) != 'undefined')
                    eval(templateOptions.callback)(json, ajaxOptions); //20090329将回调参数由options改为ajaxOptions
            }
        }
        Biuren.get(options);
    }
}

//折叠特效类
Biuren.Toggle = {
    init: function() {
        $('.biurentoggle').each(
                    function(i, obj) {
                        obj = $(obj);
                        obj.bind('click', {}, Biuren.Toggle.doClick);
                        if (obj.attr('cookie') == 'true') {
                            var target = obj.attr("toggle");
                            if ($.getCookie(target) == '1') {
                                $('#' + target).hide();
                                obj.toggleClass('biurentoggleclick');
                                obj.attr('title', '展开');
                            }
                        }
                    }
            );
    },

    doClick: function(event) {
        var link = $.srcElement(event);
        var target = link.attr('toggle');
        var cookie;
        $('#' + target).slideToggle("slow");
        link.toggleClass('biurentoggleclick');
        if (link.attr('title') == '收起') {
            link.attr('title', '展开');
            cookie = '1';
        }
        else {
            link.attr('title', '收起');
            cookie = '0';
        }
        if (link.attr('cookie') == 'true')
            $.setCookie(target, cookie, 36);
    }
}

Biuren.Tab = {
    activeClassName: 'biutabactive',
    init: function() {
        var anchor = $.anchor();
        $('a[tabgroup][loadedtab!=true]').each(
            function(i, obj) {
                obj = $(obj);
                obj.click(Biuren.Tab.doClick);
                if (obj.attr('rel') == anchor && anchor.length > 0) {
                    $('a[tabgroup="' + obj.attr('tabgroup') + '"]').removeClass(Biuren.Tab.activeClassName);
                    obj.addClass(Biuren.Tab.activeClassName);
                }
                obj.attr("loadedtab", "true");
            });
    },
    doClick: function(event) {
        var target = $.srcElement(event);
        var links = $('a[tabgroup="' + target.attr('tabgroup') + '"]').removeClass(Biuren.Tab.activeClassName);
        target.addClass(Biuren.Tab.activeClassName);
    }
}

// 表单校验类
Biuren.Valid = {
    imagePath: '',
    init: function() {
        $('form').find('[valid]').each(function(i, obj) {
            var obj = $(obj);
            if (obj.attr('loadedvalid') != undefined) return;
            obj.after('<label />').attr('loadedvalid', 'true');
            obj.blur(function(event) {
                var obj = $.srcElement(event); //根据事件查找源元素
                Biuren.Valid.checkElement(obj);
            });
            $($.evalJSON(obj.attr('valid'))).each(function(i, json) {
                if (json.show == true) {
                    obj.after('<span />')
                    obj.keydown(Biuren.Valid.pressKey).keyup(Biuren.Valid.pressKey);
                    obj.nextAll('span:first').html('<br/>可输入' + (json.max - $.len(obj.val())) + '个字符')
                }
            });
        });
    },
    //实时显示当前还可以输入的字符数
    pressKey: function(event) {
        var obj = $.srcElement(event);
        var value = obj.val();
        var json = $.evalJSON(obj.attr('valid'));
        $($.evalJSON(obj.attr('valid'))).each(function(i, json) {
            if (json.show == true) {
                var maxlen = json.max;
                if ($.len(value) > maxlen) {
                    var str = $.getByteOfNum(value, maxlen)
                    obj.val(str);
                };
                obj.nextAll('span:first').html('<br/>可输入' + (json.max - $.len(value)) + '个字符');
                return false;
            };
        });
    },

    //检测所有表单
    checkError: function(id) {
        var result = [];
        $('#' + id).find('[valid]').each(function(i, obj) {
            result.push(Biuren.Valid.checkElement($(obj)));
        });
        var hasError = false;
        $(result).each(function(i, value) {
            if (value == true) {
                hasError = true
                return false;
            }
        });
        return hasError;
    },

    //检测某一个元素配置
    checkElement: function(obj) {
        var validJson = $.evalJSON(obj.attr('valid')); //获取校验json配置
        var labelError = obj.nextAll('label:first'); //jquery object
        var hasError = false; //默认没有检测到错误
        var errorMsg = '';  //保存错误信息
        var errorclass = obj.attr('validerrorclass'); //错误信息class
        var errclass = typeof (errclass) == 'undefined' ? '' : ' ' + errorclass;
        $(validJson).each(function(i, json) {
            var type = json;
            if (typeof (json) == 'object') {
                type = json.type;
            }
            var val = $.trim(obj.val());
            //校验某一个控件
            switch (type) {
                case 'required': //判断是否为空
                    if ($.len(val) == 0) errorMsg = json.msg || '必须填写';
                    break;
                case 'limit':
                    var len = $.len(val);
                    if (typeof (json.min) != 'undefined' && len < json.min) errorMsg = json.msg || '长度必须大于等于' + json.min + '个字符';
                    if (typeof (json.max) != 'undefined' && len > json.max) errorMsg = json.msg || '长度必须小于等于' + json.max + '个字符';
                    break;
                case 'validname': //是否是有效用户名，英文字符串，下划线，中文
                    if (!$.isValidName(val) && val != '') errorMsg = json.msg || '请输入有效字符串，应为：英文字符串，下划线，中文';
                    break;
                case 'en': //是否为英文名字
                    if (!$.isEnChar(val) && val != '') errorMsg = json.msg || '仅能输入英文字符';
                    break;
                case 'domain': //校验是否为域名
                    if (!$.isDomain(val) && val != '') errorMsg = json.msg || '域名无效';
                    break;
                case 'mobile': //判断是否有移动电话
                    if (!$.isMobile(val) && val != '') errorMsg = json.msg || '移动电话无效';
                    break;
                case 'int': //校验是否为数字
                    if (!$.isInt(val) && val != '') errorMsg = json.msg || '必须输入整数';
                    break;
                case 'email': //校验邮件地址
                    if (!$.isEmail(val) && val != '') errorMsg = json.msg || '电子邮件地址无效';
                    break;
                case 'date': //校验是否为日期
                    if (!$.isDate(val) && val != '') errorMsg = json.msg || '日期不合法';
                    break;
                case 'regexp': //正则表达式匹配
                    var reg = eval('/^' + json.expression + '$/ig')
                    if (reg.test(val) == false) errorMsg = json.msg || '输入数据不合法';
                    break;
                case 'range': //判断是否在某一区间内
                    if ($.isInt(val)) {
                        val = parseInt(val);
                        if (val < json.min || val > json.max)
                            errorMsg = json.msg || '输入数字应该在' + json.min + '到' + json.max + '之间';
                    }
                    else
                        errorMsg = '请输入数字';
                    break;
                case 'compareto': //比较2个控件值是否一样
                    if ($('#' + json.destid).val() != val || val == '') errorMsg = json.msg || '请输入正确的内容';
                    break;
                case 'url': //判断是否为有效Url
                    if (!$.isUrl(val) && val != '') errorMsg = json.msg || 'Url地址无效,如：http://www.domain.com';
                    break;
                case 'callback': //回调函数判断
                    if (eval(json.fn)() == false) errorMsg = json.msg || '输入类容无效';
                    break;
                case 'tag': //检测tag的个数
                    if (val.split(json.mark || ' ').length > json.max && val != '') errorMsg = json.msg || '标签个数不能操过' + json.max + '个'
                    break;
            }
            //显示错误信息
            if (errorMsg != '') {
                labelError.html(errorMsg).attr('class', 'errormsg' + errclass).show().stop();
                hasError = true;
                return false;
            }
        });
        //如果校验都正确则显示正确信息
        if (hasError == false && errorMsg.length == 0)
            labelError.html('&nbsp;').attr('class', 'accept').show();
        return hasError;
    }
}

Biuren.Tooltips = {
    position: 'bottom',          //tip显示位置
    waittime: 100,            //显示内容延迟时间
    hidewaittime: 250,           //隐藏Tip延迟时间
    loading: '加载中...',       //加载内容前显示文字
    _loadevent: 0, //加载内容延迟事件
    _hideevent: 0,  //隐藏内容延迟时间

    init: function() {//初始化ToolTip
        $('.biutooltip').each(function(index, obj) {
            var jobj = $(obj);
            //已经加载Tooltip就不再初始化
            if (jobj.attr('loadedtip') != undefined)
                return true;
            //判断是否有click激活事件，如果没有则为MouseOver
            var tipevent = jobj.attr('tipevent') || 'mouseover';
            //绑定显示事件
            jobj.bind(tipevent, Biuren.Tooltips._showTip);
            //设置主题
            var theme = jobj.attr('tiptheme') || 'biutoop1';
            //如果没有指定显示内容，则创建一个tooltip
            if (jobj.attr('tiptargetid') == undefined) {
                var html = '<div id="biutooptipcontaiiner' + index + '"' +
                                'class="' + theme + '" style="display:none;position: absolute;z-index:1000;" ></div>';
                jobj.after(html).attr('tiptargetid', 'biutooptipcontaiiner' + index);

            }
            else {
                $('#' + jobj.attr('tiptargetid')).css({ 'display': 'none', 'position': 'absolute', 'z-index': '1000' }).attr('class', theme).attr('loadedtip', 'true');
            }

            var targetobj = $("#" + jobj.attr('tiptargetid'));
            //当mouseenter取消隐藏动作
            targetobj.mouseenter(Biuren.Tooltips._containerOver);

            //隐藏事件不为close时则绑定
            if (jobj.attr('tipclose') == undefined) {
                targetobj.mouseleave(Biuren.Tooltips.hideTip).attr('tipnotclose', 'false');
                jobj.mouseout(Biuren.Tooltips._doHide);
            } else {
                //绑定close事件
                $('.tipclose').click(Biuren.Tooltips.hideAllTip);
                //使该tip不受hidetip事件关闭
                targetobj.attr('tipnotclose', 'true');
            }
            //设置成功加载tooltip
            jobj.attr('loadedtip', 'true');
        });
    },
    _showTip: function(event) {
        var jobj = $.srcElement(event);
        var target = jobj.attr('tiptargetid');
        var container = $('#' + target);
        //加载tipcontent内容
        var tipcontent = jobj.attr('tipcontent');
        if (tipcontent != undefined)
            $('#' + target).html(tipcontent);
        //如果标签有Tip初始内容就显示初始内容，否则显示Ajax内容
        if (tipcontent == undefined && container.attr('loadedtip') != 'true') {
            container.html(Biuren.Tooltips.loading);
            //如果有延迟加载创建定时器
            Biuren.Tooltips._loadevent = window.setTimeout('Biuren.Tooltips._Callback("' + target + '")', Biuren.Tooltips.waittime);
        }

        var pos = jobj.offset();
        var containerwidth = container.width();
        var containerheight = container.height();
        var tipwidth = jobj.width();
        var tipheight = jobj.height();
        var top;
        var left;
        var showposition = jobj.attr('tipposition') || Biuren.Tooltips.position;
        switch (showposition) {
            case 'left':
                left = pos.left - containerwidth < 0 ? pos.left + tipwidth + 5 : pos.left - containerwidth - 5;
                top = pos.top + (tipheight / 2);
                break;
            case 'top':
                left = pos.left;
                top = pos.top - containerwidth - 3;
                break;
            case 'right':
                left = pos.left + tipwidth + containerwidth + $(document).scrollLeft() > $(window).width() ? pos.left - containerwidth - 5 : pos.left + tipwidth + 5;
                top = pos.top + (tipheight / 2);
                break;
            case 'bottom':
                left = pos.left;
                top = pos.top + tipheight + 3;
                break;
        }
        //显示tip内容
        container.css({ top: top, left: left });
        Biuren.Tooltips.hideTip();
        container.show();
    },
    _containerOver: function(event) {
        if (Biuren.Tooltips._hideevent > 0) {
            clearTimeout(Biuren.Tooltips._hideevent);
        }
    },
    _doHide: function(event) {
        var jobj = $.srcElement(event);
        Biuren.Tooltips._hideevent = window.setTimeout('Biuren.Tooltips._hideTip("' + jobj.attr('tiptargetid') + '")', Biuren.Tooltips.hidewaittime);
    },
    _hideTip: function(target) {
        //取消延迟加载事件
        if (Biuren.Tooltips._loadevent > 0)
            clearTimeout(Biuren.Tooltips._loadevent);
        $('#' + target).fadeOut('slow');
    },
    _Callback: function(container) {
        var jobj = $('#' + container).prev();
        eval(jobj.attr('tipcall'))(container, jobj.attr('tipparams'));

        $('#' + container).attr('loadedtip', 'true');
    },
    hideTip: function() {
        $('[tipnotclose=false]').fadeOut('slow');
    },
    hideAllTip: function() {
        $('[tipnotclose]').fadeOut('slow');
    }
}


Biuren.TextEditor = {
    init: function() {
        $('.texteditor').each(function(index, obj) {
            $(obj).hover(function() {
                $(this).addClass('texteditorhover');
            }, function() {
                $(this).removeClass('texteditorhover');
            }).attr('title', '点击修改').click(function() {
                var jobj = $(this);
                jobj.hide();
                var editorid = jobj.attr('editorid');
                if ($('#editorform' + editorid).length == 0) {
                    jobj.after('<form id="editorform' + editorid + '">' +
                            '<input id="inputtext' + editorid + '" name="inputtext" type="input" class="inputs"/><span style="display:none;color:red;">*</span>' +
                            '<input id="inputid' + editorid + '" value="' + editorid + '" name="inputid" type="hidden" />' +
                            '<a href="javascript:void(0)" id="linkupdate' + editorid + '">更新</a>  ' +
                            '<a href="javascript:void(0)" id="linkcancel' + editorid + '">取消</a>  ' +
                    '</form><div></div>');
                    $('#linkcancel' + editorid).click(Biuren.TextEditor.cancelEditor);
                    $('#linkupdate' + editorid).click(Biuren.TextEditor.updateEditor);
                }
                else {
                    $('#editorform' + editorid).show();
                    $('#inputtext' + editorid).next().hide();
                }
                $('#inputtext' + editorid).val(jobj.text());
            });
        });
    },
    updateEditor: function() {
        var jobj = $(this).parent();
        var input = jobj.find('input[name=inputtext]');
        if (input.val().length == 0) {
            input.next().show();
            return;
        }
        input.next().hide();
        jobj.hide();
        jobj.next().show().html(requestLoading);
        eval(jobj.prev().attr('editorcallback'))(jobj.attr('id'));
    }
    ,
    cancelEditor: function() {
        $(this).parent().hide().prev().show();
    },
    resetEditor: function(formid) {
        var jobj = $('#' + formid);
        jobj.next().hide();
        jobj.hide().prev().show();
    },
    updateText: function(formid) {
        var jobj = $('#' + formid);
        var text = jobj.find('input[name=inputtext]').val();
        jobj.next().hide();
        jobj.prev().show().text(text);
    }
}
