﻿// Name:        Thallo.Web.UI.WebControls.scripts.jqueryextend.debug.js
// Assembly:    Thallo.Web
// Version:     1.0.0.0
// FileVersion: 1.0.0.0
/// <reference name="MicrosoftAjax.debug.js"/>
/// <reference path="../../scripts/jquery-1.3.2-vsdoc2.js" />

var __debug__ = false;
$.extend(Type.prototype, {
    registerProperties: function(baseType, base) {
        ///	<summary>为指定的类型注册新的属性。该方法将生成属性的 set_ 和 get_ 方法体。</summary>
        /// <remark>
        /// 该方法参数可以2种方式：
        /// function(baseType:Type, base:string)
        ///     baseType 为当前实例中指定属性(base)的类型。
        ///     base 为注册的属性将封装调用当前实例中指定属性(base)的属性方法体。该参数用于对某一类型的封装扩展。
        /// function(properties)
        ///     properties 注册的属性列表。属性项可以为 JSON 对象(name, summary)或名称。
        /// </remark>
        var properties = baseType;
        var ib = Object.getType(baseType) == Type;
        if (ib)
            properties = baseType.getProperties();
        var p = this.prototype;
        $.each(properties, function(i, o) {
            var n, s;
            n = typeof (o) == 'object' ? o.name : o;
            s = typeof (o) == 'object' ? o.summary : '';
            var nn = "_" + n, gn = "get_" + n, sn = "set_" + n;
            if (!$.isFunction(p[gn])) {
                p[gn] = function() {
                    /// <summary>__propertysummary</summary>
                    if (ib && this.get_isInitialized())
                        return this[base][gn]();
                    return this[nn];
                };
                if (__debug__) {
                    if (ib && baseType.prototype[gn]) {
                        var sr = /\/\/\/\s*<summary>(.*?)<\/summary>/gm;
                        var sm = sr.exec(baseType.prototype[gn].toString());
                        if (sm)
                            s = sm[1];
                    }
                    var pn = p[gn].toString().replace('__propertysummary', s);
                    eval('p[gn]=' + pn);
                }
            }
            if (!$.isFunction(p[sn])) {
                p[sn] = function(v) {
                    if (this[nn] != v || ib && this[base][nn] != v) {
                        this[nn] = v;
                        if (ib && this.get_isInitialized())
                            return this[base][sn](v);
                    }
                };
            }
        });
    },
    registerEvents: function(events) {
        ///	<summary>为指定的类型注册新的时间。该方法将生成属性的 add_ 和 rmove_ 方法体。</summary>
        ///	<param name="events" type="array">注册的事件列表</param>
        var p = this.prototype;
        $.each(events, function(i, o) {
            var n = typeof (o) == 'object' ? o.name : o;
            var s = typeof (o) == 'object' ? o.summary : '';
            var an = "add_" + n, rn = "remove_" + n;
            if (!$.isFunction(p[an])) {
                p[an] = function(handler) {
                    /// <summary>__propertyevent</summary>
                    this.get_events().addHandler(n, handler);
                };
                if (__debug__) {
                    var pn = p[an].toString().replace('__propertyevent', s);
                    eval('p[an]=' + pn);
                }
            }
            if (!$.isFunction(p[rn])) {
                p[rn] = function(handler) {
                    this.get_events().removeHandler(n, handler);
                };
            }
        });
    },
    getProperties: function() {
        ///	<summary>返回当前类型的属性名称集合。</summary>
        ///	<return type="array">属性名称集合</return>
        var ps = new Array();
        var p = this.prototype;
        $.each(this.prototype, function(i, n) {
            if ($.isFunction(n) && i.substr(0, 4) === 'get_' && i.substr(4, 1) != i.substr(4, 1).toLowerCase())
                ps.push(i.substr(4));
        });
        return ps;
    }
});
$.extend(Sys.Component.prototype, {
    dispatchEvent: function(en, e) {
        ///	<summary>为当前对象实例分派事件。</summary>
        ///	<param name="en" type="string">分派事件的名称</param>
        var evt = this.get_events()._getEvent(en);
        if (!evt || (evt.length === 0))
            return;
        if (e == undefined)
            e = Sys.EventArgs.Empty;
        for (var i = 0, l = evt.length; i < l; i++) {
            if (evt[i](this, e))
                return true;
        }
    },
    clearNodes: function(n) {
        ///	<summary>删除 DOM 元素的所有子节点。</summary>
        ///	<param name="n" type="DOM">DOM 元素。</param>
        while (n.childNodes.length > 0) {
            n.removeChild(n.childNodes[0]);
        }
    },
    getCB: function() {
        ///	<summary>获取当前浏览器窗体客户端的范围。</summary>
        ///	<return type="map">客户端的范围的 JSON 对象。x: document.scrollLeft, y:document.scrollTop, w: window.width, h: window.height。</return>
        var cb = { x: $(document).scrollLeft(), y: $(document).scrollTop(), w: $(window).width(), h: $(window).height() };
        $.extend(cb, { l: cb.x, t: cb.y, r: cb.x + cb.w, b: cb.y + cb.h });
        return cb;
    },
    grepProperties: function(filter) {
        ///	<summary>根据筛选条件获取当前组件指定的属性列表的 JSON 对象。</summary>
        ///	<param name="filter" type="array">要获取的属性列表。</param>
        ///	<return type="map">JSON 对象。</return>
        var a = {};
        for (var n in this) {
            var v = this[n];
            if (n.substr(0, 1) == "_" && typeof (this['get' + n]) == "function") {
                var rn = n.substr(1);
                if (__Util.contains(filter, rn, false))
                    a[rn] = v;
            }
        }
        return a;
    },
    setProperties: function(o) {
        var ps = Object.getType(this).getProperties();
        for (var i in ps) {
            var n = ps[i];
            var pn = __Util.getPropertyName(o, n, true);
            if (pn)
                this["_" + n] = o[pn];
        }
    },
    create: function(n, p, t) {
        ///	<summary>创建 DOM 元素并返回其 JQuery 对象。</summary>
        ///	<param name="n" type="string">DOM 元素名称。</param>
        ///	<param name="p" type="DOM">新建的 DOM 元素要加入的节点</param>
        ///	<param name="t" type="string">Input 元素时的类型。</param>
        ///	<return type="object">JQuery 对象。</return>
        var e = document.createElement(n);
        if (n.toLowerCase() == "input" && t)
            e.type = t;
        if (p.get)
            p.get(0).appendChild(e);
        else
            p.appendChild(e);
        return $(e);
    },
    isIE6: function() {
        /// <summary>浏览器是否为IE6。</summary>
        return $.browser.msie && $.browser.version.substr(0, 1) == "6";
    },
    createDelegate: function(m) {
        /// <summary>用于在不同的上下文下创建在当前上下文的代理</summary>
        ///	<param name="m" type="Function">要创建代理的方法。</param>
        var t = this;
        return function() { m.apply(t, arguments) };
    }
});

$.fn.extend({
    defaultcss: function(p) {
        ///	<summary>为当前对象设置默认样式。</summary>
        ///	<param  name="p" type="map">使用 JSON 对象表达的样式定义。</param>
        if (!this[0])
            return;
        var t = this;
        return this.each(function() {
            $.each(p, function(n, dv) {
                var f = n.substr(0, 5).toLowerCase() == 'outer';
                if (f)
                    n = n.substr(5);
                var v = t.css(n);

                if ($.inArray(n, ['left', 'right', 'top', 'bottom', 'width', 'height']) > -1 && (v === 'auto' || v === '0px') ||
                    $.inArray(n, ['backgroundColor']) > -1 && v === 'transparent' ||
                    $.inArray(n, ['opacity']) > -1 && v == 1
                    ) {
                    if (f) {
                        if (n == 'height')
                            t.setOuterHeight(dv);
                        else if (n == 'width')
                            t.setOuterWidth(dv);
                    }
                    else {
                        t.css(n, dv);
                    }
                }
            });
        });
    },
    clearNodes: function() {
        ///	<summary>删除 DOM 元素的所有子节点。</summary>
        if (!this[0])
            return;
        return this.each(function() {
            var n = this;
            while (n.childNodes.length > 0) {
                n.removeChild(n.childNodes[0]);
            }
        });
    },
    setOuterHeight: function(v) {
        ///	<summary>设置当期 DOM 元素的外部高度。</summary>
        ///	<param  name="v" type="int">外部高度。</param>
        if (!this[0])
            return;
        return this.height(v - (this.outerHeight() - this.height()));
    },
    setOuterWidth: function(v) {
        ///	<summary>设置当期 DOM 元素的外部宽度。</summary>
        ///	<param  name="v" type="int">外部宽度。</param>
        if (!this[0])
            return;
        return this.width(v - (this.outerWidth() - this.width()));
    }
});


__Util = {
    contains: function(obj, filter, ignoreCase) {
        /// <summary>判断指定的对象是否有包含指定的属性。</summary>
        /// <param name="obj" type="object">判断的对象。</param>
        /// <param name="filter" type="string/Array">进行筛选的属性名称或属性名称数组。</param>
        /// <param name="ignoreCase" type="bool">（可选）属性名词比较时是否忽略大小写，默认值为 true。</param>
        if (obj) {
            if (typeof (filter) == "string") {
                return this.getPropertyName(obj, filter, ignoreCase) != null;
            }
            else {
                for (var i in filter) {
                    if (this.getPropertyName(obj, filter[i], ignoreCase) != null)
                        return true;
                }
            }
        }
        return false;
    },
    grepObject: function(obj, filter, ignoreCase, except) {
        /// <summary>根据条件修改对象属性并返回新的对象。</summary>
        /// <param name="obj" type="object">判断的对象。</param>
        /// <param name="filter" type="Array">进行筛选的属性名称数组。</param>
        /// <param name="ignoreCase" type="bool">（可选）属性名词比较时是否忽略大小写，默认值为 true。</param>
        /// <param name="except" type="bool">（可选）当值为 false 时，返回的对象仅包含 filter 规定的属性，否则将返回的对象将包含匹配的属性之外的所有属性。默认值为 false。</param>
        if (except == undefined)
            except = false;
        var a = {};
        if (typeof (obj) != "undefined") {
            for (var n in obj) {
                var mn = this.getPropertyName(filter, n, ignoreCase);
                if (!except && mn)
                    a[mn] = obj[n];
                else if (except && mn == null)
                    a[n] = obj[n];
            }
        }
        return a;
    },
    getPropertyName: function(o, name, ec) {
        if (o == undefined)
            return null;
        if (ec == undefined)
            ec = true;
        var rn = ec ? name.toLowerCase() : name;
        var isa = Object.getType(o) == Array;
        for (var i in o) {
            var n = isa ? o[i] : i;
            if (ec && n.toLowerCase() == rn || n == rn)
                return n;
        }
        return null;
    },
    getEnumName: function(type, v) {
        var p = type.prototype;
        for (var i in p) {
            if (p[i] == v)
                return i;
        }
    },
    getEnumValue: function(type, n) {
        var p = type.prototype;
        for (var i in p) {
            if (i.toLowerCase() == n.toLowerCase()) {
                return p[i];
            }
        }
    }
};

//Type.registerNamespace("ModalFrame");

//ModalFrame.jQuery = function() {
//    ModalFrame.jQuery.initializeBase(this);
//};

//ModalFrame.jQuery.prototype = $.prototype;

//ModalFrame.jQuery.registerClass('ModalFrame.jQuery', Sys.Component);

if (typeof (ValidatorSetFocus) == 'function') {
    eval(ValidatorSetFocus.toString().replace("ctrl.focus();", "__innerfocus(ctrl);"));
};

function __innerfocus(ctrl) {
    if (ctrl.style.display == 'none') {
        var pt = $(ctrl).parent(':visible').offset().top;
        var t = $(document.documentElement).scrollTop();
        if (pt < t || t > t + $(window).height()) {
            $(document.documentElement).scrollTop(pt);
        }
    }
    else {
        ctrl.focus();
    }
};

function InvokeValidate(e) {
    if (typeof (ValidatorOnChange) == "function") {
        if (typeof (e) == "string")
            e = $get(e);
        if (typeof (e.Validators) != 'undefined')
            ValidatorOnChange({ target: e });
    }
};
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();