/** * jquery ligerui 1.1.9 * * http://ligerui.com * * author daomi 2012 [ gd_star@163.com ] * sjfe_cn modify * http://www.sdevnet.com * */ (function ($) { //ligerui 继承方法 function.prototype.ligerextend = function (parent, overrides) { if (typeof parent != 'function') return this; //保存对父类的引用 this.base = parent.prototype; this.base.constructor = parent; //继承 var f = function () { }; f.prototype = parent.prototype; this.prototype = new f(); this.prototype.constructor = this; //附加属性方法 if (overrides) $.extend(this.prototype, overrides); }; //延时加载 function.prototype.ligerdefer = function (o, defer, args) { var fn = this; return settimeout(function () { fn.apply(o, args || []); }, defer); }; // 核心对象 window.liger = $.ligerui = { version: 'v1.1.9', managercount: 0, //组件管理器池 managers: {}, manageridprev: 'ligerui', //错误提示 error: { managerisexist: '管理器id已经存在' }, getid: function (prev) { prev = prev || this.manageridprev; var id = prev + (1000 + this.managercount); this.managercount++; return id; }, add: function (manager) { if (arguments.length == 2) { var m = arguments[1]; m.id = m.id || m.options.id || arguments[0].id; this.addmanager(m); return; } if (!manager.id) manager.id = this.getid(manager.__idprev()); if (this.managers[manager.id]) throw new error(this.error.managerisexist); this.managers[manager.id] = manager; }, remove: function (arg) { if (typeof arg == "string" || typeof arg == "number") { delete $.ligerui.managers[arg]; } else if (typeof arg == "object" && arg instanceof $.ligerui.core.component) { delete $.ligerui.managers[arg.id]; } }, //获取ligerui对象 //1,传入ligerui id //2,传入dom object array(jquery) get: function (arg, idattrname) { idattrname = idattrname || "ligeruiid"; if (typeof arg == "string" || typeof arg == "number") { return $.ligerui.managers[arg]; } else if (typeof arg == "object" && arg.length) { if (!arg[0][idattrname] && !$(arg[0]).attr(idattrname)) return null; return $.ligerui.managers[arg[0][idattrname] || $(arg[0]).attr(idattrname)]; } return null; }, //根据类型查找某一个对象 find: function (type) { var arr = []; for (var id in this.managers) { var manager = this.managers[id]; if (type instanceof function) { if (manager instanceof type) { arr.push(manager); } } else if (type instanceof array) { if ($.inarray(manager.__gettype(), type) != -1) { arr.push(manager); } } else { if (manager.__gettype() == type) { arr.push(manager); } } } return arr; }, //$.fn.liger{plugin} 和 $.fn.ligerget{plugin}manager //会调用这个方法,并传入作用域(this) //@parm [plugin] 插件名 //@parm [args] 参数(数组) //@parm [ext] 扩展参数,定义命名空间或者id属性名 run: function (plugin, args, ext) { if (!plugin) return; ext = $.extend({ defaultsnamespace: 'ligerdefaults', methodsnamespace: 'ligermethods', controlnamespace: 'controls', idattrname: 'ligeruiid', isstatic: false, haselement: true, //是否拥有element主体(比如drag、resizable等辅助性插件就不拥有) propertytoelemnt: null //链接到element的属性名 }, ext || {}); plugin = plugin.replace(/^ligerget/, ''); plugin = plugin.replace(/^liger/, ''); if (this == null || this == window || ext.isstatic) { if (!$.ligerui.plugins[plugin]) { $.ligerui.plugins[plugin] = { fn: $['liger' + plugin], isstatic: true }; } return new $.ligerui[ext.controlnamespace][plugin]($.extend({}, $[ext.defaultsnamespace][plugin] || {}, $[ext.defaultsnamespace][plugin + 'string'] || {}, args.length > 0 ? args[0] : {})); } if (!$.ligerui.plugins[plugin]) { $.ligerui.plugins[plugin] = { fn: $.fn['liger' + plugin], isstatic: false }; } if (/manager$/.test(plugin)) return $.ligerui.get(this, ext.idattrname); this.each(function () { if (this[ext.idattrname] || $(this).attr(ext.idattrname)) { var manager = $.ligerui.get(this[ext.idattrname] || $(this).attr(ext.idattrname)); if (manager && args.length > 0) manager.set(args[0]); //已经执行过 return; } if (args.length >= 1 && typeof args[0] == 'string') return; //只要第一个参数不是string类型,都执行组件的实例化工作 var options = args.length > 0 ? args[0] : null; var p = $.extend({}, $[ext.defaultsnamespace][plugin] || {} , $[ext.defaultsnamespace][plugin + 'string'] || {}, options || {}); if (ext.propertytoelemnt) p[ext.propertytoelemnt] = this; if (ext.haselement) { new $.ligerui[ext.controlnamespace][plugin](this, p); } else { new $.ligerui[ext.controlnamespace][plugin](p); } }); if (this.length == 0) return null; if (args.length == 0) return $.ligerui.get(this, ext.idattrname); if (typeof args[0] == 'object') return $.ligerui.get(this, ext.idattrname); if (typeof args[0] == 'string') { var manager = $.ligerui.get(this, ext.idattrname); if (manager == null) return; if (args[0] == "option") { if (args.length == 2) return manager.get(args[1]); //manager get else if (args.length >= 3) return manager.set(args[1], args[2]); //manager set } else { var method = args[0]; if (!manager[method]) return; //不存在这个方法 var parms = array.apply(null, args); parms.shift(); return manager[method].apply(manager, parms); //manager method } } return null; }, //扩展 //1,默认参数 //2,本地化扩展 defaults: {}, //3,方法接口扩展 methods: {}, //命名空间 //核心控件,封装了一些常用方法 core: {}, //命名空间 //组件的集合 controls: {}, //plugin 插件的集合 plugins: {} }; //扩展对象 $.ligerdefaults = {}; //扩展对象 $.ligermethos = {}; //关联起来 $.ligerui.defaults = $.ligerdefaults; $.ligerui.methods = $.ligermethos; //获取ligerui对象 //@parm [plugin] 插件名,可为空 $.fn.liger = function (plugin) { if (plugin) { return $.ligerui.run.call(this, plugin, arguments); } else { return $.ligerui.get(this); } }; //组件基类 //1,完成定义参数处理方法和参数属性初始化的工作 //2,完成定义事件处理方法和事件属性初始化的工作 $.ligerui.core.component = function (options) { //事件容器 this.events = this.events || {}; //配置参数 this.options = options || {}; //子组件集合索引 this.children = {}; }; $.extend($.ligerui.core.component.prototype, { __gettype: function () { return '$.ligerui.core.component'; }, __idprev: function () { return 'ligerui'; }, //设置属性 // arg 属性名 value 属性值 // arg 属性/值 value 是否只设置事件 set: function (arg, value) { if (!arg) return; if (typeof arg == 'object') { var tmp; if (this.options != arg) { $.extend(this.options, arg); tmp = arg; } else { tmp = $.extend({}, arg); } if (value == undefined || value == true) { for (var p in tmp) { if (p.indexof('on') == 0) this.set(p, tmp[p]); } } if (value == undefined || value == false) { for (var p in tmp) { if (p.indexof('on') != 0) this.set(p, tmp[p]); } } return; } var name = arg; //事件参数 if (name.indexof('on') == 0) { if (typeof value == 'function') this.bind(name.substr(2), value); return; } this.trigger('propertychange', arg, value); if (!this.options) this.options = {}; this.options[name] = value; var pn = '_set' + name.substr(0, 1).touppercase() + name.substr(1); if (this[pn]) { this[pn].call(this, value); } this.trigger('propertychanged', arg, value); }, //获取属性 get: function (name) { var pn = '_get' + name.substr(0, 1).touppercase() + name.substr(1); if (this[pn]) { return this[pn].call(this, name); } return this.options[name]; }, hasbind: function (arg) { var name = arg.tolowercase(); var event = this.events[name]; if (event && event.length) return true; return false; }, //触发事件 //data (可选) array(可选)传递给事件处理函数的附加参数 trigger: function (arg, data) { var name = arg.tolowercase(); var event = this.events[name]; if (!event) return; data = data || []; if ((data instanceof array) == false) { data = [data]; } for (var i = 0; i < event.length; i++) { var ev = event[i]; if (ev.handler.apply(ev.context, data) == false) return false; } }, //绑定事件 bind: function (arg, handler, context) { if (typeof arg == 'object') { for (var p in arg) { this.bind(p, arg[p]); } return; } if (typeof handler != 'function') return false; var name = arg.tolowercase(); var event = this.events[name] || []; context = context || this; event.push({ handler: handler, context: context }); this.events[name] = event; }, //取消绑定 unbind: function (arg, handler) { if (!arg) { this.events = {}; return; } var name = arg.tolowercase(); var event = this.events[name]; if (!event || !event.length) return; if (!handler) { delete this.events[name]; } else { for (var i = 0, l = event.length; i < l; i++) { if (event[i].handler == handler) { event.splice(i, 1); break; } } } }, destroy: function () { $.ligerui.remove(this); } }); //界面组件基类, //1,完成界面初始化:设置组件id并存入组件管理器池,初始化参数 //2,渲染的工作,细节交给子类实现 //@parm [element] 组件对应的dom element对象 //@parm [options] 组件的参数 $.ligerui.core.uicomponent = function (element, options) { $.ligerui.core.uicomponent.base.constructor.call(this, options); var extendmethods = this._extendmethods(); if (extendmethods) $.extend(this, extendmethods); this.element = element; this._init(); this._prerender(); this.trigger('render'); //try { this._render(); // } // (e) { // alert('render' + e); //} this.trigger('rendered'); try { this._rendered(); } catch (e) { alert('rendered' + e); } }; $.ligerui.core.uicomponent.ligerextend($.ligerui.core.component, { __gettype: function () { return '$.ligerui.core.uicomponent'; }, //扩展方法 _extendmethods: function () { }, _init: function () { this.type = this.__gettype(); if (!this.element) { this.id = this.options.id || $.ligerui.getid(this.__idprev()); } else { this.id = this.options.id || this.element.id || $.ligerui.getid(this.__idprev()); } //存入管理器池 $.ligerui.add(this); if (!this.element) return; //读取attr方法,并加载到参数,比如['url'] var attributes = this.attr(); if (attributes && attributes instanceof array) { for (var i = 0; i < attributes.length; i++) { var name = attributes[i]; this.options[name] = $(this.element).attr(name); } } //读取ligerui这个属性,并加载到参数,比如 ligerui = "width:120,heigth:100" var p = this.options; if ($(this.element).attr("ligerui")) { try { var attroptions = $(this.element).attr("ligerui"); if (attroptions.indexof('{') != 0) attroptions = "{" + attroptions + "}"; eval("attroptions = " + attroptions + ";"); if (attroptions) $.extend(p, attroptions); } catch (e) { } } }, //预渲染,可以用于继承扩展 _prerender: function () { }, _render: function () { }, _rendered: function () { if (this.element) { $(this.element).attr("ligeruiid", this.id); } }, //返回要转换成ligerui参数的属性,比如['url'] attr: function () { return []; }, destroy: function () { if (this.element) $(this.element).remove(); this.options = null; $.ligerui.remove(this); } }); //表单控件基类 $.ligerui.controls.input = function (element, options) { $.ligerui.controls.input.base.constructor.call(this, element, options); }; $.ligerui.controls.input.ligerextend($.ligerui.core.uicomponent, { __gettype: function () { return '$.ligerui.controls.input'; }, attr: function () { return ['nulltext']; }, setvalue: function (value) { return this.set('value', value); }, getvalue: function () { return this.get('value'); }, setenabled: function () { return this.set('disabled', false); }, setdisabled: function () { return this.set('disabled', true); }, updatestyle: function () { } }); //全局窗口对象 $.ligerui.win = { //顶端显示 top: false, //遮罩 mask: function (win) { function setheight() { if (!$.ligerui.win.windowmask) return; var h = $(window).height() + $(window).scrolltop(); $.ligerui.win.windowmask.height(h); } if (!this.windowmask) { this.windowmask = $("
").appendto('body'); $(window).bind('resize.ligeruiwin', setheight); $(window).bind('scroll', setheight); } this.windowmask.show(); setheight(); this.masking = true; }, //取消遮罩 unmask: function (win) { var jwins = $("body > .l-dialog:visible,body > .l-window:visible"); for (var i = 0, l = jwins.length; i < l; i++) { var winid = jwins.eq(i).attr("ligeruiid"); if (win && win.id == winid) continue; //获取ligerui对象 var winmanager = $.ligerui.get(winid); if (!winmanager) continue; //是否模态窗口 var modal = winmanager.get('modal'); //如果存在其他模态窗口,那么不会取消遮罩 if (modal) return; } if (this.windowmask) this.windowmask.hide(); this.masking = false; }, //显示任务栏 createtaskbar: function () { if (!this.taskbar) { this.taskbar = $('
').appendto('body'); if (this.top) this.taskbar.addclass("l-taskbar-top"); this.taskbar.tasks = $(".l-taskbar-tasks:first", this.taskbar); this.tasks = {}; } this.taskbar.show(); this.taskbar.animate({ bottom: 0 }); return this.taskbar; }, //关闭任务栏 removetaskbar: function () { var self = this; self.taskbar.animate({ bottom: -32 }, function () { self.taskbar.remove(); self.taskbar = null; }); }, activetask: function (win) { for (var winid in this.tasks) { var t = this.tasks[winid]; if (winid == win.id) { t.addclass("l-taskbar-task-active"); } else { t.removeclass("l-taskbar-task-active"); } } }, //获取任务 gettask: function (win) { var self = this; if (!self.taskbar) return; if (self.tasks[win.id]) return self.tasks[win.id]; return null; }, //增加任务 addtask: function (win) { var self = this; if (!self.taskbar) self.createtaskbar(); if (self.tasks[win.id]) return self.tasks[win.id]; var title = win.get('title'); var task = self.tasks[win.id] = $('
' + title + '
'); self.taskbar.tasks.append(task); self.activetask(win); task.bind('click', function () { self.activetask(win); if (win.actived) win.min(); else { win.active(); if (win.dgwin && win.dgwin.document) { settimeout(function() { $("div[libctl='liblayout']", $(win.dgwin.document)).each(function () { try { var grdobj = win.dgwin.$("#" + $(this).attr("id")).ligergetlayoutmanager(); if (grdobj) { grdobj.resize(); } } catch(e) { } }); }, 100); } } }).hover(function () { $(this).addclass("l-taskbar-task-over"); }, function () { $(this).removeclass("l-taskbar-task-over"); }); return task; }, hastask: function () { for (var p in this.tasks) { if (this.tasks[p]) return true; } return false; }, //移除任务 removetask: function (win) { var self = this; if (!self.taskbar) return; if (self.tasks[win.id]) { self.tasks[win.id].unbind(); self.tasks[win.id].remove(); delete self.tasks[win.id]; } if (!self.hastask()) { self.removetaskbar(); } }, //前端显示 setfront: function (win) { var wins = $.ligerui.find($.ligerui.core.win); for (var i in wins) { var w = wins[i]; if (w == win) { $(w.element).css("z-index", "9200"); this.activetask(w); } else { $(w.element).css("z-index", "9100"); w.actived = false; } } } }; //窗口基类 window、dialog $.ligerui.core.win = function (element, options) { $.ligerui.core.win.base.constructor.call(this, element, options); }; $.ligerui.core.win.ligerextend($.ligerui.core.uicomponent, { __gettype: function () { return '$.ligerui.controls.win'; }, mask: function () { if (this.options.modal) $.ligerui.win.mask(this); }, unmask: function () { if (this.options.modal) $.ligerui.win.unmask(this); }, min: function () { }, max: function () { }, active: function () { } }); $.ligerui.draggable = { dragging: false }; $.ligerui.resizable = { reszing: false }; $.ligerui.tojson = typeof json === 'object' && json.stringify ? json.stringify : function (o) { var f = function (n) { return n < 10 ? '0' + n : n; }, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, quote = function (value) { escapable.lastindex = 0; return escapable.test(value) ? '"' + value.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charcodeat(0).tostring(16)).slice(-4); }) + '"' : '"' + value + '"'; }; if (o === null) return 'null'; var type = typeof o; if (type === 'undefined') return undefined; if (type === 'string') return quote(o); if (type === 'number' || type === 'boolean') return '' + o; if (type === 'object') { if (typeof o.tojson === 'function') { return $.ligerui.tojson(o.tojson()); } if (o.constructor === date) { return isfinite(this.valueof()) ? this.getutcfullyear() + '-' + f(this.getutcmonth() + 1) + '-' + f(this.getutcdate()) + 't' + f(this.getutchours()) + ':' + f(this.getutcminutes()) + ':' + f(this.getutcseconds()) + 'z' : null; } var pairs = []; if (o.constructor === array) { for (var i = 0, l = o.length; i < l; i++) { pairs.push($.ligerui.tojson(o[i]) || 'null'); } return '[' + pairs.join(',') + ']'; } var name, val; for (var k in o) { type = typeof k; if (type === 'number') { name = '"' + k + '"'; } else if (type === 'string') { name = quote(k); } else { continue; } type = typeof o[k]; if (type === 'function' || type === 'undefined') { continue; } val = $.ligerui.tojson(o[k]); pairs.push(name + ':' + val); } return '{' + pairs.join(',') + '}'; } }; $.nsui = $.ligerui; $.nsui.win = $.ligerui.win; $.dnui = $.nsui; $.dnui.win = $.nsui.win; })(jquery);