!function ($) { "use strict"; // jshint ;_; /* ALERT CLASS DEFINITION * ====================== */ var dismiss = '[data-dismiss="alert"]' , Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.prototype.close = function (e) { var $this = $(this) , selector = $this.attr('data-target') , $parent if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 } $parent = $(selector) e && e.preventDefault() $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) $parent.trigger(e = $.Event('close')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { $parent .trigger('closed') .remove() } $.support.transition && $parent.hasClass('fade') ? $parent.on($.support.transition.end, removeElement) : removeElement() } /* ALERT PLUGIN DEFINITION * ======================= */ var old = $.fn.alert $.fn.alert = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('alert') if (!data) $this.data('alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.alert.Constructor = Alert /* ALERT NO CONFLICT * ================= */ $.fn.alert.noConflict = function () { $.fn.alert = old return this } /* ALERT DATA-API * ============== */ $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) }(window.jQuery);(function(window,$){ var win = window; //声明api对象 var api = win.zapi = win.webframe = win.webframe || {}; //数据对象,用于各组件保存数据 var data = {}; /** * 兼容ie和w3c的frame,使之能使用frame.window * @param _frm * @returns {___anonymous525_575} */ api.frame = function(_frm){ return { window:_frm.open?_frm:_frm.contentWindow }; }; //最大的zIndex值 api.maxZIndex=null; //取下一个zIndex值 api.nextZIndex = function(idx){ if(idx && typeof(idx) == 'number'){ return this.maxZIndex = idx; } return ++this.maxZIndex; } //初始化maxZIndex $(function(){ $("div,span,ul,dl,li,dd,dt").each(function(){ var _idx = $(this).css("zIndex"); //对于大于100000,说明是遮罩层,忽略 if(_idx != '0' && _idx != 'auto' && parseInt(_idx)<100000){ var idx = parseInt(_idx); if(api.maxZIndex){ api.maxZIndex = idx>api.maxZIndex?_idx:api.maxZIndex; }else{ api.maxZIndex = idx; } } api.maxZIndex=api.maxZIndex?api.maxZIndex:1000; }); }); })(window,jQuery); (function(){ var DateUtil = window.DateUtil = function(){} DateUtil.firstMonthDate=function(date){ var d = new Date(date); d.setDate(1); return d; } //取得月末 DateUtil.lastMonthDate=function(date){ var lastDate = new Date(date); lastDate.setMonth(date.getMonth()+1); lastDate.setDate(0); return lastDate; }; DateUtil.addMonth = function(date,num){ var x = date.getMonth() + num; var result = new Date(date); var day = date.getDate(); result.setDate(1); if(x<0){ result.setFullYear(result.getFullYear()+(x - x%12)/12 - 1); result.setMonth(12+x%12); }else{ result.setFullYear(result.getFullYear()+(x-x%12)/12); result.setMonth(x%12); } var lastDate = DateUtil.lastMonthDate(result); if(lastDate.getDate() < day){ return lastDate; } result.setDate(day); return result; } DateUtil.addDate = function(date,num){ var td = (date.getDate() + num); var result = new Date(date); if(num<0){ if(td<0){ result.setDate(0); result.setDate(result.getDate()+td); }else{ result.setDate(result.getDate()+num); } }else{ var d = DateUtil.lastMonthDate(date); if(td>d.getDate()){ result.setMonth(result.getMonth()+1); result.setDate(td-d.getDate()); }else{ result.setDate(resultDate()+num); } } return result; } //小时 DateUtil.addHour = function(date,num){ var td = (date.getDate() + num); var result = new Date(date); if(num<0){ if(td<0){ result.setDate(0); result.setDate(result.getDate()+td); }else{ result.setDate(result.getDate()+num); } }else{ var d = DateUtil.lastMonthDate(date); if(td>d.getDate()){ result.setMonth(result.getMonth()+1); result.setDate(td-d.getDate()); }else{ result.setDate(resultDate()+num); } } return result; } //分钟 DateUtil.addMinutes = function(date,num){ var td = (date.getDate() + num); var result = new Date(date); if(num<0){ if(td<0){ result.setDate(0); result.setDate(result.getDate()+td); }else{ result.setDate(result.getDate()+num); } }else{ var d = DateUtil.lastMonthDate(date); if(td>d.getDate()){ result.setMonth(result.getMonth()+1); result.setDate(td-d.getDate()); }else{ result.setDate(resultDate()+num); } } return result; } var dateFormatSetting={ match_queue:["yyyy","yy","y","MM","M","dd","d","HH","hh","mm","ss","S"], parser:{ 'yyyy':{format:function(date){ return date.getFullYear()+""; },parse:function(date,val){ date.setFullYear(parseInt(val,10)); return date; },length:4}, 'yy':{format:function(date){ return (date.getFullYear()+"").substring(2); },parse:function(date,val){ date.setFullYear(parseInt("19"+val,10)); return date; },length:2}, 'y':{format:function(date){ return date.getFullYear() + ""; },parse:function(date,val){ date.setFullYear(parseInt(val,10)); return date; },length:4}, 'dd':{format:function(date){ return date.getDate()<10 ?"0"+date.getDate():date.getDate()+""; },parse:function(date,val){ date.setDate(parseInt(val,10)); return date; },length:2}, 'd':{format:function(date){ return date.getDate() + ""; },parse:function(date,val){ date.setDate(parseInt(val,10)); return date; }}, 'MM':{format:function(date){ return (date.getMonth()+1)<10 ? "0"+(date.getMonth()+1):(date.getMonth()+1)+""; },parse:function(date,val){ date.setMonth(parseInt(val,10)-1); return date; },length:2}, 'M':{format:function(date){ return (date.getMonth()+1)+""; },parse:function(date,val){ date.setMonth(parseInt(val,10)-1); return date; }}, //时(24小时制) 'HH':{format:function(date){ return date.getHours()<10?"0"+date.getHours():""+date.getHours(); },parse:function(date,val){ date.setHours(parseInt(val,10)); return date; },length:2}, //时 'hh':{format:function(date){ var hours = date.getHours() % 12; if(hours){ hours = 12; } return hours<10?"0"+hours:""+hours; },parse:function(date,val){ date.setHours(parseInt(val,10)); return date; },length:2}, //分 'mm':{format:function(date){ return date.getMinutes()<10?"0"+date.getMinutes():date.getMinutes()+""; },parse:function(date,val){ date.setMinutes(parseInt(val,10)); return date; },length:2}, //秒 'ss':{format:function(date){ return date.getSeconds()<10?"0"+date.getSeconds():date.getSeconds()+""; },parse:function(date,val){ date.setSeconds(parseInt(val,10)); return date; },length:2}, //毫秒数 'S':{format:function(date){ return date.getMilliseconds()+""; },parse:function(date,val){ date.setMilliseconds(parseInt(val,10)); return date; }} } }; DateUtil.format = function(date,format){ //如果是字符串,则直接返回 if(typeof(date) == 'string'){ return date; } var result = format; var que = dateFormatSetting.match_queue; for(var i=0;i0){ var fills = []; for(var i=0;i .title").html(DateUtil.format(current,"yyyy-MM-dd HH:mm")); var html = ''; $content = $dom.find(".datepicker-content"); $content.empty(); $content.append($(html)); $content.find(".optional").click(function(){ if(datepicker.status.level == datepicker.setting.level){ var result = new Date(); result.setTime(current.getTime()); result.setSeconds(parseInt($(this).attr("seconds"),10)); datepicker.status.current = result; datepicker.onselect(result); } }); }, parent:function(datepicker){ datepicker.status.level = 'MI'; datepicker.status.get_level_model().show(datepicker); }, next:function(datepicker){ datepicker.status.current = DateUtil.addSecond(datepicker.status.current,1); this.show(datepicker); }, prev:function(datepicker){ datepicker.status.current = DateUtil.addSecond(datepicker.status.current,-1); this.show(datepicker); } }, "MI":{ //分 show:function(datepicker){ $dom = datepicker.getdom(); var current = datepicker.status.current; $dom.find(".datepicker-header > .title").html(DateUtil.format(current,"yyyy-MM-dd HH")); var html = ''; $content = $dom.find(".datepicker-content"); $content.empty(); $content.append($(html)); $content.find(".optional").click(function(){ if(datepicker.status.level == datepicker.setting.level){ var result = new Date(); result.setTime(current.getTime()); result.setMinutes(parseInt($(this).attr("minutes"),10)); datepicker.status.current = result; datepicker.onselect(result); }else{ datepicker.status.current.setMinutes(parseInt($(this).attr("minutes"),10)); datepicker.status.level = 'S'; datepicker.status.get_level_model().show(datepicker); } }); }, parent:function(datepicker){ datepicker.status.level = 'H'; datepicker.status.get_level_model().show(datepicker); }, next:function(datepicker){ datepicker.status.current = DateUtil.addDate(datepicker.status.current,1); this.show(datepicker); }, prev:function(datepicker){ datepicker.status.current = DateUtil.addDate(datepicker.status.current,-1); this.show(datepicker); } }, "H":{ //时 show:function(datepicker){ $dom = datepicker.getdom(); var current = datepicker.status.current; $dom.find(".datepicker-header > .title").html(DateUtil.format(current,"yyyy-MM-dd")); var html = ''; $content = $dom.find(".datepicker-content"); $content.empty(); $content.append($(html)); $content.find(".optional").click(function(){ if(datepicker.status.level == datepicker.setting.level){ var result = new Date(); result.setTime(current.getTime()); result.setHours(parseInt($(this).attr("hours"),10)); datepicker.status.current = result; datepicker.onselect(result); }else{ datepicker.status.current.setHours(parseInt($(this).attr("hours"),10)); datepicker.status.level = 'MI'; datepicker.status.get_level_model().show(datepicker); } }); }, parent:function(datepicker){ datepicker.status.level = 'D'; datepicker.status.get_level_model().show(datepicker); }, next:function(datepicker){ datepicker.status.current = DateUtil.addDate(datepicker.status.current,1); this.show(datepicker); }, prev:function(datepicker){ datepicker.status.current = DateUtil.addDate(datepicker.status.current,-1); this.show(datepicker); } }, "D":{ //日 show:function(datepicker){ var current = datepicker.status.current; var wk_html = ''; wk_html+=''; $dom = datepicker.getdom(); $dom.find(".datepicker-header > .title").html(DateUtil.format(datepicker.status.current,"yyyy-MM")); $content = $dom.find(".datepicker-content"); $content.empty(); $content.append($(wk_html)); $this = this; $content.find(".optional").click(function(){ if(datepicker.status.level == datepicker.setting.level){ var result = new Date(); result.setTime(0); result.setFullYear(parseInt($(this).attr("year"),10)); result.setMonth(parseInt($(this).attr("month"),10)); result.setDate(parseInt($(this).attr("date"),10)); datepicker.status.current = result; datepicker.onselect(result); return; } datepicker.status.current.setDate(parseInt($(this).attr("date"),10)); datepicker.status.level = 'H'; datepicker.status.get_level_model().show(datepicker); }); }, parent:function(datepicker){ datepicker.status.level = 'M'; datepicker.status.get_level_model().show(datepicker); }, next:function(datepicker){ datepicker.status.current = DateUtil.addMonth(datepicker.status.current,1); this.show(datepicker); }, prev:function(datepicker){ datepicker.status.current = DateUtil.addMonth(datepicker.status.current,-1); this.show(datepicker); } }, "M":{ //月 show:function(datepicker){ $dom = datepicker.getdom(); var current = datepicker.status.current; $dom.find(".datepicker-header > .title").html(current.getFullYear()); var html = ''; $content = $dom.find(".datepicker-content"); $content.empty(); $content.append($(html)); $content.find(".optional").click(function(){ if(datepicker.status.level == datepicker.setting.level){ var result = new Date(); result.setTime(0); result.setFullYear(parseInt($(this).attr("year"),10)); result.setMonth(parseInt($(this).attr("month"),10)); datepicker.status.current = result; datepicker.onselect(result); }else{ datepicker.status.current.setMonth(parseInt($(this).attr("month"),10)); datepicker.status.level = 'D'; datepicker.status.get_level_model().show(datepicker); } }); }, next:function(datepicker){ datepicker.status.current.setFullYear(datepicker.status.current.getFullYear()+1); this.show(datepicker); }, prev:function(datepicker){ datepicker.status.current.setFullYear(datepicker.status.current.getFullYear()-1); this.show(datepicker); }, parent:function(datepicker){ datepicker.status.level='Y'; datepicker.status.yearRange = null; datepicker.status.get_level_model().show(datepicker); } }, "Y":{ //年 show:function(datepicker){ $dom = datepicker.getdom(); var current = datepicker.status.current; if(!datepicker.status.yearRange){ datepicker.status.yearRange = [current.getFullYear() - 4,current.getFullYear() + 5]; } $dom.find(".datepicker-header > .title").html(datepicker.status.yearRange.join("-")); var html = ''; $content = $dom.find(".datepicker-content"); $content.empty(); $content.append($(html)); $content.find(".optional").click(function(){ if(datepicker.status.level == datepicker.setting.level){ var result = new Date(); result.setTime(0); result.setFullYear(parseInt($(this).attr("year"),10)); datepicker.status.current = result; datepicker.onselect(result); }else{ datepicker.status.current.setFullYear(parseInt($(this).attr("year"),10)); datepicker.status.level = 'M'; datepicker.status.get_level_model().show(datepicker); } }); }, next:function(datepicker){ datepicker.status.yearRange[0]=datepicker.status.yearRange[0]+10; datepicker.status.yearRange[1]=datepicker.status.yearRange[1]+10; this.show(datepicker); }, prev:function(datepicker){ datepicker.status.yearRange[0]=datepicker.status.yearRange[0]-10; datepicker.status.yearRange[1]=datepicker.status.yearRange[1]-10; this.show(datepicker); }, parent:function(datepicker){ datepicker.status.level='T'; datepicker.status.yearRange = null; datepicker.status.get_level_model().show(datepicker); } }, "T":{ //十年 show:function(datepicker){ $dom = datepicker.getdom(); var current = datepicker.status.current; if(!datepicker.status.yearRange){ datepicker.status.yearRange = [current.getFullYear() - 44,current.getFullYear() + 55]; } var minYear = datepicker.status.yearRange[0]-10; var maxYear = datepicker.status.yearRange[1]+10; $dom.find(".datepicker-header > .title").html(datepicker.status.yearRange.join("-")); var html = ''; $content = $dom.find(".datepicker-content"); $content.empty(); $content.append($(html)); $content.find(".optional").click(function(){ var range = [parseInt(this.getAttribute("min"),10),parseInt(this.getAttribute("max"),10)]; if(datepicker.status.level == datepicker.setting.level){ datepicker.status.current = null; datepicker.onselect(range[0]+"-"+range[1]); return; } datepicker.status.yearRange = range; datepicker.status.level = 'Y'; datepicker.status.get_level_model().show(datepicker); }); }, next:function(datepicker){ datepicker.status.yearRange[0]=datepicker.status.yearRange[0]+100; datepicker.status.yearRange[1]=datepicker.status.yearRange[1]+100; this.show(datepicker); }, prev:function(datepicker){ datepicker.status.yearRange[0]=datepicker.status.yearRange[0]-100; datepicker.status.yearRange[1]=datepicker.status.yearRange[1]-100; this.show(datepicker); }, parent:function(datepicker){ } } }; var Datepicker = function(setting){ var _this = this; this.setting={} $.extend(this.setting,{ i18n:{ zh_CN:{ WeekNameMin:["日","一","二","三","四","五","六"], WeekName:["周日","周一","周二","周三","周四","周五","周六"], MonthName:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], Month:"月", Year:"年", Hours:"时", Minute:"分", Second:"秒" } }, location:"zh_CN", format:"yyyy-MM-dd", initDate:new Date(), maxDate:null, minDate:null, level:'D',//选择级别、精度(T、Y、M、D、H、MI、S) initLevel:null,//初始级别(初始化显示时的级别) className:null },setting); if(!this.setting.initLevel){ var ilvl = this.setting.level; if(ilvl == 'M' || ilvl == 'Y' || ilvl == 'T'){ this.setting.initLevel = ilvl; }else{ this.setting.initLevel = 'D'; } } //初始化事件堆栈 this.event_stack = {select:[],show:[]} //状态初始化 this.status = { //原始日期 original:new Date(), //当前日期 current:new Date(), level:_this.setting.initLevel,//显示级别 T(十年) Y(年) M(月) D(日) H(时) MI(分) S(秒) //显示级别的模型 level_model:level_models[_this.setting.initLevel], get_level_model:function(level){return level_models[level||this.level];} }; this.status.original = this.setting.initDate || new Date(); this.status.current = this.setting.initDate || new Date(); this.create(); } //要显示的日期列表 var days = function(dt){ date = new Date(dt); var dates = []; //设置为月初 date.setDate(1); var week = date.getDay(); //如果不是周日,则取上月的补全 if(week){ var prev_month = new Date(date); prev_month.setDate(0); for(var i=week;i>0;i--){ var d = new Date(prev_month); d.setDate(d.getDate()-(i-1)); dates[dates.length] = d; } } var lastDate = DateUtil.lastMonthDate(date); for(var i=1;i<=lastDate.getDate();i++){ dates[dates.length] = new Date(date.getFullYear(),date.getMonth(),i); } var week = lastDate.getDay(); if(week != 6){ var next_month = DateUtil.addMonth(date,1); for(var i=0;i<6-week;i++){ dates[dates.length] = new Date(next_month.getFullYear(),next_month.getMonth(),i+1); } } return dates; }; var fn = Datepicker.prototype; //取dom节点 fn.getdom = function(){ return this.dom; }; //设置指定日期 fn.setDate = function(date){ this.status.current = date; this.status.current = date; } //创建dom fn.create = function(){ var html = '
' + '
' + ' ' + ' #TITLE#' + ' ' + '
' + '
' + '
'; html = html.replace(/#ID#/g,this.id || 'default').replace(/#CLASS#/g,this.setting.className||"datepicker-view"); this.dom = $(html); //追加到body上,如果是drop-wrap,则加上view上,需要考虑和dropbox的接口 this.dom.appendTo($(document.body)); var $this = this; this.dom.click(function(e){ e.stopPropagation(); }); this.dom.find(".prev").click(function(){ $this.status.get_level_model().prev($this); }); this.dom.find(".next").click(function(){ $this.status.get_level_model().next($this); }); this.dom.find(".title").click(function(){ $this.status.get_level_model().parent($this); }); return this.dom; } fn.show = function(param){ if(param && typeof(param) == "function"){ this.event_stack.show[this.event_stack.show.length] = param; }else{ for(var i=0;i
"); if(setting.cssClass){ _alert.addClass(setting.cssClass); } _alert.find(".alert-content").html(setting.content || ""); //图标 var _icon = _alert.find("i"); //如果有指定,则使用指定的图标,否则使用默认的 if(setting.icon){ _icon.append(""); }else{ _icon.addClass("msg-icon"); if(setting.level == 'warn'){ _icon.addClass("msg-icon-warn"); }if(setting.level == 'error'){ _icon.addClass("msg-icon-error"); }else{ _icon.addClass("msg-icon-info"); } } _alert.hide().appendTo($(document.body)); // TODO 智能控制对话框宽度 var _dialog = api.dialog({ target:_alert, title:setting.title, autoSize:true, //自适应大小 titleBarVisible:setting.title, draggable:setting.draggable, cssClass:setting.dialogCssClass, resizable:false, modal:true, buttons:[ {name:setting.buttonText,callback:function(){ _dialog.close(); //销毁 _dialog.destroy(); //删除自己 _alert.remove(); if(setting.callback) //不允许直接回调 setting.callback(); }} ], resize:function(_dialog){ api.outerHeight(_alert,_dialog.clientInnerHeight()); } }); }; /* * 确认框 * 参数格式: * (content,title) * 或 * { * title: 标题, * icon: 自定义图标,优先于level图标, * content:弹出框内容(html、dom节点、jquery对象、文本), * draggable:true,可拖曳 * cssClass:样式, * yButtonText:按扭的文本,默认为"确定", * nButtonText:按扭的文本,默认为"取消", * callback:function(val){}回调函数 ,val = true/false * } */ api.confirm=function(){ var _args = arguments; var setting = { title:null, icon:null, draggable:true, cssClass:null, dialogCssClass:null, yButtonText:"确定", nButtonText:"取消" }; if(_args[0] && typeof(_args[0]) == 'object'){ setting = $.extend(setting,_args[0]); }else{ setting.content = _args[0] || ""; if(_args[1] && typeof(_args[1]) == 'function'){ setting.callback = _args[1]; }else if (_args[1] && typeof(_args[1]) == 'string'){ setting.title = _args[1]; } } var _alert = $("
"); if(setting.cssClass){ _alert.addClass(setting.cssClass); } _alert.find(".confirm-content").html(setting.content || ""); //图标 var _icon = _alert.find("i"); //如果有指定,则使用指定的图标,否则使用默认的 if(setting.icon){ _icon.append(""); }else{ _icon.addClass("msg-icon").addClass("msg-icon-help"); } _alert.hide().appendTo($(document.body)); // TODO 智能控制对话框宽度 var _dialog = api.dialog({ target:_alert, title:setting.title, autoSize:true, //自适应大小 titleBarVisible:setting.title, draggable:setting.draggable, cssClass:setting.dialogCssClass, resizable:false, modal:true, buttons:[ {name:setting.yButtonText,callback:function(){ _dialog.close(); //销毁 _dialog.destroy(); //删除自己 _alert.remove(); if(setting.callback) setting.callback(true); }}, {name:setting.nButtonText,callback:function(){ _dialog.close(); //销毁 _dialog.destroy(); //删除自己 _alert.remove(); if(setting.callback) setting.callback(false); }} ], resize:function(_dialog){ api.outerHeight(_alert,_dialog.clientInnerHeight()); } }); }; /** * 输入框 * 参数格式: * { * title: 标题, * prompt:提示内容(html、文本), * value: 缺省值, * draggable:true,可拖曳 * pattern: 匹配模式, * cssClass:样式, * maskClass:遮罩层的样式, * buttonText:按扭的文本,默认为"确定", * onok:function(val){} 确定按扭回调, * oncancel:function(val){} 取消按扭回调 * } */ api.input=function(){ //TODO }; /** * 对话框 * 参数格式: * { * title:"标题", * target:"目标对象", //DOM|jQuery|id * autoOpen:true, * modal:false, * draggable:true, * cssClass:"dialog", 对话框的样式 * autoSize:false, //窗口根据内容自适应大小,如果要自适应大小,则target对象需要明确指定宽度否则窗口宽度将不可预料 * height:undefined, * width:undefined, * minHeight:0, //最小高度 * minWidth:0, * maxHeight:0, * maxWidth:0, * titleBarVisible:true, //标题栏是否可见 * resizable:false, * open:null,//打开对话框时触发的事件 * close:null,//关闭对话框时触发的事件 * resize:null,//改变大小时触发的事件 * position:'center', * buttons:[ * { * name:"取消", 按扭的名称 * cssClass:"", 按扭的样式 * callback:function(dlg){} 按扭的回调 * },{ * name:"确定", 按扭的名称 * cssClass:"", 按扭样式 * callback:function(dlg){} 按扭的回调 * } * ] * } */ api.dialog=function(param){ //一些默认值 var setting = $.extend({ title:"", autoOpen:true, modal:false, draggable:true, autoSize:false, //窗口根据内容自适应大小 height:undefined, width:undefined, minHeight:0, minWidth:0, maxHeight:0, maxWidth:0, titleBarVisible:true, resizable:true, open:null,//打开对话框时触发的事件 close:null,//关闭对话框时触发的事件 resize:null,//改变大小时触发的事件 position:'center', buttons:[] },param); //如果target不是jquery对象 ,则转换成jquery对象 if(typeof(setting.target) == 'string'){ setting.target = $("#"+setting.target); }else if(! setting.target instanceof $){ setting.target = $(setting.target); } if(setting.target.data("dialog-cache")){ var dlg = setting.target.data("dialog-cache"); dlg.open(); return dlg; } setting.cssClass=setting.cssClass || "dialog"; //定义一个单独context的目的是封装私有化的变量 var _object = (function(){ //对话框的内容 var _target = setting.target; //记住原来节点的特性,以便destory时还原 var _old_feature = api.feature(_target); //对话框的dom节点的jquery对象 var _dom = null; //对话框状态 var _status = 'none'; //对话框位置 var _position = null; //遮罩层 var _mask = null; //dialog对象的事件堆栈 var _events = (function(){ var _event_stack = {}; return function(name,func){ if(!name) return null; if(!_event_stack[name]){ _event_stack[name] = []; } if(func && typeof(func) == 'function'){ _event_stack[name].push(func); } return _event_stack[name]; } })(); return { setting:setting, //对话框状态 status:function(_p){ if(_p && typeof(_p) == 'string' ){ _status = _p; //状态的变更需要更新对话框控制状态 this.refresh(); }else{ return _status; } }, /** * 获取对话框的dom节点 */ getdom:function(){ if(_dom){ return _dom; } //如果父节点有dialog的class,则说明dialog已存在 if(_target.parent().hasClass("dialog")){ return _dom = _target.parent(); } return _dom = this.create(); }, /** * 获取BODY的dom节点(jquery对象) */ getbody:function(){ var _bdom = this.getdom(); return _bdom.find(".dialog-content"); }, create:function(){ var _setting = this.setting; var _html = '
' +'
' +'
#TITLE#
' +'
' +' ' +' ' +' ' +'
' +'
' +'
' +'
' +'
' +'
' +' ' +'
'; //创建好,不显示 var _dialog = $(_html).appendTo($(document.body)); //样式 _dialog.addClass(this.setting.cssClass); //标题 _dialog.find(".dialog-title").html(_setting.title); //隐藏mask层 _dialog.find(".dialog-mask").hide(); //IE9会重新加载资源 _dialog.find(".dialog-body").append(_target); //控制按扭 if(!this.setting.buttons || this.setting.buttons.length==0){ _dialog.find(".dialog-footer").hide(); }else{ //添加按扭 var _buttons = _dialog.find(".dialog-buttons"); for(var x =0;x< this.setting.buttons.length;x++){ var _button = this.setting.buttons[x]; var _jbutton = $(""); if(_button.callback){ _jbutton.click(_button.callback); } if(_button.cssClass){ _jbutton.addClass(_button.cssClass); } _jbutton.appendTo(_buttons); } } var _h_dialog = this; //设置其可拖曳 if(this.setting.draggable){ api.draggable({ target:_dialog ,overflow:"disable" ,handle:this.setting.titleBarVisible?_dialog.find(".dialog-header"):null ,ondragstart:function(){ //在拖曳的时候显示遮罩层,防止出现iframe之类的影响拖曳效果 _dialog.find(".dialog-mask").show(); _mask.show(); } ,ondrop:function(){ //隐藏方才显示的遮罩层 _dialog.find(".dialog-mask").hide(); if(!_h_dialog.setting.modal){ _mask.hide(); } } }); } //设置其允许resize if(this.setting.resizable){ api.resizable({target:_dialog ,minWidth:this.setting.minWidth ,maxWidth:this.setting.maxWidth ,minHeight:this.setting.minHeight ,maxHeight:this.setting.maxHeight ,onstart:function(){ //在拖曳的时候显示遮罩层,防止出现iframe之类的影响拖曳效果 _dialog.find(".dialog-mask").show(); _mask.show(); } ,onresize:function(){ _h_dialog.resize(); } ,ondrop:function(){ //隐藏方才显示的遮罩层 _dialog.find(".dialog-mask").hide(); if(!_h_dialog.setting.modal){ _mask.hide(); } }}); }else{ //如果不允许改变大小,则隐藏最大化和最小化按扭 _dialog.find(".dialog-maximal").hide(); _dialog.find(".dialog-minimal").hide(); } //如果标题栏不可见,则隐藏标题栏 if(!this.setting.titleBarVisible){ _dialog.find(".dialog-header").hide(); } //注册控制按扭事件 this.close(function(){ //去掉body的overflow:hidden; $(_doc.body).removeClass("over-body"); _dialog.hide(); _mask.hide(); }); _dialog.find(".dialog-close")[0].onclick = function(){ _h_dialog.close(); }; _dialog.find(".dialog-minimal")[0].onclick = function(){ _h_dialog.minimal(); }; _dialog.find(".dialog-maximal")[0].onclick = function(){ _h_dialog.maximal(); }; _dialog.mousedown(function(){ _h_dialog.moveLayerToTop(); }); this.open(function(_this){ $(_doc.body).addClass("over-body"); var _dialog = _this.getdom(); var zIndex = Math.max(_this.setting.zIndex ? _this.setting.zIndex : 1000 , api.nextZIndex()); //非模态窗口和ie6均用透明的遮罩层 var className = ($.browser.msie && $.browser.version == 6) || !_this.setting.modal ? "mask-layer":"mask-layer-black"; if(!_mask){ _mask = api.mask({id:"dialog-mask-"+new Date().getTime(),zIndex:zIndex,cssClass:className}); }else{ _mask.css({zIndex:zIndex,display:"block"}); } //如果不是模态窗口,则把遮罩层隐藏掉 if(!_this.setting.modal){ _mask.hide(); } _dialog.css({zIndex:api.nextZIndex(zIndex+1)}); _dialog.show(); //显示目标 _target.show(); _this.resize(); //如果窗口高度小于对话框高,则使offsetTop为0 if(_this.height() < $win.height()){ _this.moveTo({top:($win.height()-_this.height())/2+($win.scrollTop())}); }else{ _this.moveTo({top:$win.scrollTop()}); } if(_this.width() < $win.width()){ //移动到中间 _this.moveTo({left:($win.width()-_this.width())/2+($win.scrollLeft())}); }else{ _this.moveTo({left:$win.scrollLeft()}); } //打开后记住对话框的位置 _this.markPosition(); //状态修改为正常 _this.status('normal'); }); //大小改变时自动调整客户端区域的大小 this.resize(function(_this){ _this.autoClientSize(); }); if(this.setting.resize && typeof(this.setting.resize) == 'function'){ this.resize(this.setting.resize); } if(this.setting.open && typeof(this.setting.open) == 'function'){ this.open(this.setting.open); } if(this.setting.close && typeof(this.setting.close) == 'function'){ this.close(this.setting.close); } //窗口resize时,如果对话框是最大化状态,则要跟着窗口变化而变化 $win.resize(function(){ if(_h_dialog.status() == 'maximal') _h_dialog.maximal(); }); return (_dom = _dialog); }, //自动适应client大小 autoClientSize:function(){ var dom = this.getdom(); var _title = dom.find(".dialog-header"); var _content = dom.find(".dialog-content"); var _body = dom.find(".dialog-body"); var _mask = dom.find(".dialog-mask"); var _bottom = dom.find(".dialog-footer"); var outerSize = _content.outerHeight(true) - _content.height(); var ctx_height = dom.height() - outerSize; if(_title.css("display")!='none'){ ctx_height -= _title.outerHeight(true); } if(_bottom.css("display")!='none'){ ctx_height -= _bottom.outerHeight(true); } _content.height(ctx_height ); _mask.height(ctx_height+outerSize); _body.height(ctx_height); }, //此处的width指outerWidth,包括其padding、border; width:function(_p){ if(_p){ var x = typeof(_p)!='number'?parseInt(_p):_p; var dom = this.getdom(); var outerSize = dom.outerWidth() - dom.width(); //在padding、border间距与width之间取最大值,确保对话框显示正常 dom.width(x>outerSize?x - outerSize:outerSize); this.resize(); return this; } return this.getdom().outerWidth(); }, //此处的height指outerHeight,包括padding和border height:function(_p){ if(_p){ var x = typeof(_p)!='number'?parseInt(_p):_p; var dom = this.getdom(); var outerSize = dom.outerHeight() - dom.height(); //在padding、border间距与width之间取最大值,确保对话框显示正常 dom.height(x>outerSize?x - outerSize:outerSize); //修改高度后需要调整内容大小 this.autoClientSize(); //触发resize事件 this.resize(); return this; } return this.getdom().outerHeight(); }, //标题栏高度 titleHeight:function(){ var _title = this.getdom().find(".dialog-header"); //如果标题栏被设置成display:none,则忽略其高度 return _title.css("display") == 'none'?0:_title.outerHeight(true); }, clientWidth:function(_p){ var dom = this.getdom(); var _content = dom.find(".dialog-content"); if(_p){ var x = typeof(_p)!='number'?parseInt(_p):_p; var outerSize = dom.outerWidth() - dom.width() + _content.outerWidth(true) - _content.width(); this.width(outerSize + x); return this; } return _content.outerWidth(); }, clientHeight:function(_p){ var dom = this.getdom(); var _content = dom.find(".dialog-content"); if(_p){ var x = typeof(_p)=='string'?parseInt(_p):_p; var _title = dom.find(".dialog-header"); var _bottom = dom.find(".dialog-footer"); var outerSize = dom.outerHeight() - dom.height() + this.titleHeight() + _bottom.outerHeight(true) + _content.outerHeight(true) - _content.height(); this.height(outerSize + x); return this; } return _content.outerHeight(); }, //body内部宽 clientInnerWidth:function(_w){ var _body = this.getdom().find(".dialog-body"); if(_w){ this.clientWidth((_body.outerWidth(true) - _body.width()) + _w); } return _body.width(); }, //body内部高 clientInnerHeight:function(_h){ var _body = this.getdom().find(".dialog-body"); if(_h){ this.clientHeight((_body).outerHeight(true) - _body.height() + _h); } return _body.height(); }, //窗口标题 title:function(_title){ if(_title){ this.setting.title = _title; this.getdom().find("dialog-title"); } return this.setting.title; }, //移动到最顶层 moveLayerToTop:function(){ //遮罩层同时往上移,先移遮罩层,使对话框在_mask之上 _mask.css({zIndex:api.nextZIndex()}); this.getdom().css({zIndex:api.nextZIndex()}); }, //更新窗口状态等 refresh:function(){ var _dialog = this.getdom(); var _title_bar = _dialog.find(".dialog-header"); var _min = _dialog.find(".dialog-minimal"); var _max = _dialog.find(".dialog-maximal"); var _this_dialog_obj = this; var _old_size = {width:_dialog.width(),height:_dialog.height()}; _dialog.find(".dialog-body").show(); if(this.status() == 'normal'){ _max.removeClass("icon-normal").addClass("icon-maximal"); _min.removeClass("icon-normal").addClass("icon-minimal"); _min[0].onclick = function(){ _this_dialog_obj.minimal(); } _max[0].onclick = function(){ _this_dialog_obj.maximal(); }; //标题栏双击事件 _title_bar.off("dblclick"); _title_bar.on('dblclick',function(){ _this_dialog_obj.maximal(); }); }else if(this.status() == 'minimal'){ _max.removeClass("icon-normal").addClass("icon-maximal"); _min.addClass("icon-normal").removeClass("icon-minimal"); _min[0].onclick = function(){ _this_dialog_obj.normal(); }; _max[0].onclick = function(){ _this_dialog_obj.maximal(); }; this.getdom().find(".dialog-body").hide(); //标题栏双击事件 _title_bar.off("dblclick"); _title_bar.on('dblclick',function(){ _this_dialog_obj.normal(); }); }else if(this.status() == 'maximal'){ _max.addClass("icon-normal").removeClass("icon-maximal"); _min.removeClass("icon-normal").addClass("icon-minimal"); _min[0].onclick = function(){ _this_dialog_obj.minimal(); }; _max[0].onclick = function(){ _this_dialog_obj.normal(); }; //标题栏双击事件 _title_bar.off("dblclick"); _title_bar.on('dblclick',function(){ _this_dialog_obj.normal(); }); } }, markPosition:function(){ if(this.status()=='normal') _position = {width:this.width(),height:this.height(),top:this.getdom().offset().top,left:this.getdom().offset().left}; }, //恢复对话框 normal:function(){ this.status('normal'); this.width(_position.width); this.height(_position.height); this.moveTo({top:_position.top,left:_position.left}); //调 用resize事件 this.resize(); }, //最大化对话框 maximal:function(){ //不允许移动 if(!this.setting.resizable){ return this; } //最大化前记录当前对话框的位置、大小等 this.markPosition(); this.status('maximal'); //使对话框全屏 api.fullscreen(this.getdom()); //调用resize事件 this.resize(); return this; }, //最小化对话框 minimal:function(){ if(!this.setting.resizable){ return this; } //最小化前记录当前对话框的位置、大小等 this.markPosition(); var _dialog = this.getdom(); var _title = _dialog.find(".dialog-header"); this.status('minimal'); this.height(_title.outerHeight(true) + _dialog.outerHeight() - _dialog.height()); this.width(200); //移到左下角 this.moveTo('left','bottom'); //调 用resize事件 this.resize(); return this; }, //移动对话框 moveTo:function(p1,p2){ var dom = this.getdom(); //如果第一个参数是字符串,则认为是基于位置的9点相对定位,即left,right,center,top,bottom,middle六个值的组合 if(typeof(p1)=='string'){ if(p1){ api.align(dom,p1); api.valign(dom,p1); } if(p2){ api.align(dom,p2); api.valign(dom,p2); } }else if(typeof(p1) == 'object'){ this.getdom().css(p1); } return this; }, open:function(fn){ var stack = _events('open',fn); if(fn) return this; for(var x = 0;x"); iframe.css({"display":"none","border":"none"}).attr("src",setting.url) .appendTo($(document.body)); setting.target = iframe; setting.resize=function(_dialog){ iframe.width(_dialog.clientInnerWidth()); iframe.height(_dialog.clientInnerHeight()); }; var _close = setting.close; setting.close=function(_d){ _d.destroy(); iframe.remove(); if(_close) _close(_d); }; var dialog = api.dialog(setting); var _callback = setting.callback || {}; _callback.close = function(){ dialog.close(); }; if(setting.request){ if(setting.request.url){ url = setting.request.url; } //在post提交的时候需要使用form表单来提交 if(setting.request.method && setting.request.method.toLowerCase() == 'post'){ var $form = $("
"); var params = setting.request.params || {}; var http_params = []; object_to_params(params,null,http_params); for(var i=0;i").attr("name",http_params[i].name).val(http_params[i].value)); } $form.appendTo($(document.body)); $form.submit(); $form.remove(); }else{ iframe.attr("src",url); } } var frminited = false; iframe.on('load',function(){ if(!frminited){ var _frm = iframe[0]; var win = _frm.open?_frm:_frm.contentWindow; win.callback=_callback; if(setting.autoSize || !setting.height){ var height = $(win.document).outerHeight(true); if(height > $(window).height()){ height = $(window).height() - 60; } dialog.clientInnerHeight(height); iframe.height(dialog.clientInnerHeight()); } if(setting.autoSize || !setting.width){ var width = $(win.document).outerWidth(true); if(width > $(window).width()){ width = $(window).width() - 60; } dialog.clientInnerWidth(width); iframe.width(dialog.clientInnerWidth()); } dialog.moveTo("center","middle"); frminited = true; } }) return dialog; }; //创建/显示/移除遮罩层 api.mask=function(_opt){ var opt = $.extend({ id:"fn-mask-default", zIndex:100000, cssClass:"mask-layer" },_opt); var method = arguments[1] || 'open'; var _mask_obj = null; switch(method){ case 'open': if($("#"+opt.id)[0]){ _mask_obj.removeClass(); _mask_obj.addClass(opt.cssClass); _mask_obj = $("#"+opt.id).show(); }else{ _mask_obj = $('
'); _mask_obj.addClass(opt.cssClass); _mask_obj.appendTo($(document.body)); } _mask_obj.css({zIndex:opt.zIndex}); _mask_obj.css({height:$(document).height(),width:$(document).width()}) $win.resize(function(){ api.fullscreen(_mask_obj); }); api.fullscreen(_mask_obj); break; case 'hide': _mask_obj = $("#"+opt.id).hide(); break; case 'close': _mask_obj = $("#"+opt.id).remove(); } return _mask_obj; }; /** * 使对象可拖曳 * 参数 (t:目标 h:柄 ) * 或者 { * target:目标 * ,handle:柄 * ,overflow:auto * ,ondragstart:function(setting){}//开始拖曳 * ,ondrag:function(setting){}//拖曳 * ,ondrop:function(setting){}//释放拖曳 * } */ api.draggable=function(t,h){ //拖动的目标 var _target = t.nodeType?$(t):t instanceof $?t:$(t.target); //可拖动的柄 var _handle = h ? h instanceof $? h:$(h) : t.handle || _target; if(! (_handle instanceof $)){ _handle = $(_handle); } //溢出时的处理方式 取值:disable | auto var _overflow = t && t.overflow ? t.overflow : "auto"; var _setting = {target:_target,handle:_handle,overflow:_overflow}; var _events = {ondragstart:(t && t.ondragstart) || null ,ondrag:(t && t.ondrag) || null ,ondrop:(t && t.ondrop) || null}; _target.css({position:"absolute"}); //指针样式 _handle.css({cursor:"default"}); //鼠标按下事件 var _down = function(_e){ //声明并初始化拖曳状态 var _draggable = false; //计算偏移 var _offset = {y:_e.clientY-_target.position().top,x:_e.clientX-_target.position().left}; //由于move可以调用较多,将生成document的jquery对象单独提出来,提高效率 var _jdoc = $(_doc); //目标跟随鼠标 var _tack = function(_e){ if(_draggable){ var _top = _e.clientY-_offset.y; var _left = _e.clientX-_offset.x; if(_overflow == 'auto' || _overflow == 'hidden'){ //不允许向上溢出 _target.css({top:_top < 0 ? 0:_top,left:_left}); }else if(_overflow == 'disable'){ var _mxtop = _jdoc.height() - _target.outerHeight(); var _mxleft = _jdoc.width() - _target.outerWidth(); _top = _top > _mxtop ? _mxtop : _top ; _top = _top < 0 ? 0 : _top; //不允许四周溢出 _target.css({top:_top,left:_left < 0 ? 0 : _left > _mxleft ? _mxleft:_left}); } //拖曳事件 if(_events.ondrag){ _events.ondrag(_setting); } } }; //鼠标释放事件 var _up = function(ev){ _draggable = false; $(document).unbind("mouseup",_up); $(document).unbind("mousemove",_tack); if(_events.ondrop){ //拖曳释放事件 _events.ondrop(_setting); } }; $(document).bind("mouseup",_up); $(document).bind('mousemove',_tack); //触发拖曳开始事件 if(_events.ondragstart) _events.ondragstart(_setting); //可拖曳状态 _draggable = true; }; _handle.mousedown(_down); }; /** * 使对象可变大小 * TODO 目前存在一个问题,当resizable和draggable同时作用一个节点对象时将会发生意想不到的效果 * 若要解决此问题,需要加一个节点套在要resizable的节点上面,要么加四条边,用于resize * 参数 (t:目标) * 或者 { * target:目标 * ,onresize:function(target){} //大小改变回调事件 * ,onstart:function(){} //开始resize事件 * ,ondrop:function(){} //释放事件 * ,borderWidth:10 //边框宽度 * ,maxWidth:null * ,minWidth:null * ,maxHeight:null * ,minHeight:null * } */ api.resizable=function(t){ //拖动的目标 var _target = t.nodeType?$(t):t instanceof $?t:$(t.target); var setting = t.nodeType || t instanceof $ ?{target:_target}:t; //边框宽度 var _border_width = setting.borderWidth || 10; //可扩展的方向 var _dir = {top:true,left:true,bottom:true,right:true}; //若不是绝对定位,则不允许向左和向上扩展 var _position = _target.css("position"); if(_position != 'absolute' && _position!='fixed'){ _dir.left = false; _dir.top = false; } //将要resize的方向 var dir = null; //鼠标移动时,如果在边框上,则可拉伸,此时鼠标显示可拉伸状 _target.mousemove(function(e){ if(e.target!=_target[0]){ if(_target.css("cursor") != "default") _target.css("cursor","default"); return; } if(!dir){ var _width = _target.outerWidth(); var _height = _target.outerHeight(); var _x = e.offsetX; var _y = e.offsetY; var _offset_right = _width - _border_width; var _offset_bottom = _height - _border_width; if(_dir.top && _dir.left && _x <= _border_width && _y <= _border_width){ _target.css("cursor","nw-resize"); }else if(_dir.right && _dir.bottom && _x >= _offset_right && _y >= _offset_bottom){ _target.css("cursor","se-resize"); }else if(_dir.top && _dir.right && _x >= _offset_right && _y <= _border_width){ _target.css("cursor","ne-resize"); }else if(_dir.left && _dir.bottom && _x <= _border_width && _y >= _offset_bottom){ _target.css("cursor","sw-resize"); }else if(_dir.left && _x <= _border_width){ _target.css("cursor","w-resize"); }else if(_dir.top && _y <= _border_width){ _target.css("cursor","n-resize"); }else if(_dir.right && _x >= _offset_right){ _target.css("cursor","e-resize"); }else if(_dir.bottom && _y >= _offset_bottom){ _target.css("cursor","s-resize"); }else{ if(_target.css("cursor") != "default") _target.css("cursor","default"); } }else{ //移动 } }); //resize之前的对象状态 var original = { offset:null,//原始偏移 size:null,//原始大小 pointer:null //指针所在位置 }; var resize = function(e){ var _rx = e.clientX - original.pointer.x; var _ry = e.clientY - original.pointer.y; if(dir.right){ var _w = original.size.width + _rx; if((setting.maxWidth && _w > setting.maxWidth && _rx > 0) || (setting.minWidth && _w < setting.minWidth && _rx < 0)){ return } _target.width(_w); }else if (dir.left){ var _w = original.size.width - _rx; if((setting.maxWidth && _w > setting.maxWidth && _rx < 0) || (setting.minWidth && _w < setting.minWidth && _rx > 0)){ return } _target.width(_w); _target.css("left",original.offset.left + _rx); } if(dir.bottom){ var _h = original.size.height + _ry; if((setting.maxHeight && _h > setting.maxHeight && _ry > 0) || (setting.minHeight && _h < setting.minHeight && _ry < 0)){ return } _target.height(_h); }else if (dir.top){ var _h = original.size.height - _ry; //限制最小高度与最大高度 if((setting.maxHeight && _h > setting.maxHeight && _ry < 0) || (setting.minHeight && _h < setting.minHeight && _ry > 0)){ return } _target.height(_h); _target.css("top",original.offset.top + _ry); } if(setting.onresize){ setting.onresize(_target); } }; var drop = function(target){ dir = null; $(document).off('mousemove',resize); $(document).off('mouseup',drop); if(setting.ondrop){ setting.ondrop(_target); } }; //鼠标按下置为可移动 _target.mousedown(function(e){ if(e.target!=_target[0]) return; //记录原来的偏移位置 original.offset = _target.offset(); //记录初始大小 original.size = {width:_target.width(),height:_target.height()}; //原始鼠标位置 original.pointer = {x:e.clientX,y:e.clientY}; var _width = _target.outerWidth(); var _height = _target.outerHeight(); var _x = e.offsetX; var _y = e.offsetY; var _offset_right = _width - _border_width; var _offset_bottom = _height - _border_width; if(_dir.top && _dir.left && _x <= _border_width && _y <= _border_width){ dir = {top:true,left:true}; }else if(_dir.right && _dir.bottom && _x >= _offset_right && _y >= _offset_bottom){ dir = {right:true,bottom:true}; }else if(_dir.top && _dir.right && _x >= _offset_right && _y <= _border_width){ dir = {top:true,right:true}; }else if(_dir.left && _dir.bottom && _x <= _border_width && _y >= _offset_bottom){ dir = {left:true,bottom:true}; }else if(_dir.left && _x <= _border_width){ dir = {left:true}; }else if(_dir.top && _y <= _border_width){ dir = {top:true}; }else if(_dir.right && _x >= _offset_right){ dir = {right:true}; }else if(_dir.bottom && _y >= _offset_bottom){ dir = {bottom:true}; } if(setting.onstart){ setting.onstart(_target); } $(document).on('mousemove',resize); $(document).on('mouseup',drop); }); }; $.fn.draggable = function(params){ for(var i=0;i"); $iframe.on('load',function(){ var ifwin = $iframe[0].open?$iframe[0]:$iframe[0].contentWindow; //设置frame的回调 ifwin.callback=setting.callback; $iframe.removeClass("hide"); }) this.boxview.empty(); this.boxview.append($iframe); }else if(setting.url){ this.boxview.load(setting.url); } this.viewCreated = true; } //当指定的是url或iframe时,创建其节点 fn.create=function(){ var _this = this; this.boxview = this.box.find("."+CLS_BOX_VIEW); //如果boxview不存在,则添加 if(!this.boxview[0]){ this.boxview = $("
"); this.box.append(this.boxview); } this.target.on('click',function(e){ //关闭其它的dropbox for(var i=0;i"); if(this.items && this.items.length>0){ for(var i=0;i < this.items.length ;i++){ menu.append(this.items[i].getdom()); } }else{ //menu.append(""); } return this.dom = menu; }; /** * 将菜单项转换成dom,并返回 */ MenuItem.prototype.getdom = function(){ if(this.dom){ return this.dom; } var item = null; //判断是否是第一级菜单 var isMenuL1 = this.parent instanceof Menu; //第一级菜单与其他级别的菜单样式上有些差异 item = $("
  • "); if(this.icon){ //20130125,niezf,不使用白色图标原语句(isMenuL1?"icon-white":"icon-black") item.append($('')); } item.append($(""+this.name+"")); if(this.items && this.items.length>0){ item.append($('')); var submenu = $(""); for(var i=0;i a").on("click",function(e){ if($(this).parent().hasClass("active")){ return; } var target = $(this).attr("href"); $dom.find("li.active > a").each(function(){ var target = $(this).attr("href"); $(this).parent().removeClass("active"); if(target.charAt(0) == '#'){ $(target).hide(); } }); if(target.charAt(0) == '#'){ $(target).show(); $(this).parent().addClass("active"); return false; } }); } $dom.attr("initialized",true); }; $.fn.tabs=function(){ this.each(function(){ new Tabs(this); }) } $(function(){ $(".tabs").tabs(); }); })(jQuery);(function($){ var tooltipids = {}; var genid = function(){ var result = "tooltip-"+parseInt(Math.random() * Math.pow(10,14),10); if(tooltipids[result]){ result = genid(); }else{ tooltipids[result] = result; } return result; } /** * 创建一个Tooltip对象,参数如下: * { * content:"提示内容" * className:"样式类名称" * show:"是否显示,true | false" * } */ var Tooltip = function(setting){ this.setting = {}; $.extend(this.setting,{content:"content is empty." ,className:"tooltip-view" ,show:false ,zIndex:100 ,width:null ,height:null ,status:null //状态,可用的状态包括success,warning,info,error ,position:{at:"top" ,align:"center" ,offset:4 }},setting); this.setting.position = $.extend({at:"top",align:"center",offset:4},this.setting.position) if(this.setting.target && !(this.setting.target instanceof $)){ this.setting.target = $(this.setting.target); } //事件堆栈 this.event_stack = {destroy:[],show:[],hide:[],create:[]}; this.create(); if(this.setting.show){ this.show(); } }; var fn = Tooltip.prototype; fn.getview = function(){ return this.$tooltip; } fn.show = function(callback){ if(callback){ this.event_stack.show[this.event_stack.show.length] = callback; return; } this.resetPosition(); this.$tooltip.show(); for(var i=0;i"+this.setting.content+""); $tooltip.css({visibility:"hidden",top:0,left:0,zIndex:this.setting.zIndex}) .appendTo($(document.body)) .attr("id",id); //检查是否有指定高度和宽度 if(this.setting.width){ $tooltip.css({width:this.setting.width}); } if(this.setting.height){ $tooltip.css({height:this.setting.height}); } var $target = this.setting.target; $target.attr("tooltip-id",id); var $this = this; this.$tooltip = $tooltip; // this.resetPosition(); $target.mouseover((this.mouseover = function(){ $this.show(); })); $target.mouseout((this.mouseout=function(){ $this.hide(); })); for(var i=0;imax){ return false; } } return true; } /** * 必填验证 */ fn.required = function(params){ if(this.value){ return true; } return false; } /** * 必填字符串(trim可指定是否执行trim) */ fn.requiredstring = function(params){ if(!this.value || this.value.length == 0){ return false; } if(params && params.trim){ return this.value.trim().length>0; } return true; } /** * 检查整数范围 */ fn.short = fn.long = fn.int = function(params){ if(isNaN(this.value)){ return false; } var val = parseInt(this.value,10); if(params.min && val< params.min){ return false; } if(params.max && val>params.max){ return false; } return true; } /** * 检查double范围 */ fn.double = function(params){ if(isNaN(this.value)){ return false; } var val = parseFloat(this.value); if(params.min && val< params.min){ return false; } if(params.max && val>params.max){ return false; } return true; } /** * TODO 检查日期范围 */ fn.date = function(params){ var val = this.value; if(params.min && val< params.min){ return false; } if(params.max && val>params.max){ return false; } return true; } /** * EMAIL匹配 */ fn.email = function(params){ return this.regex({expression:""}); } /** * URL匹配 */ fn.url = function(params){ return this.regex({expression:""}); } /** * 正则表达式 */ fn.regex = function(params){ } /** * 针对form表单进行客户端验证 * 参数格式: * { * "fieldName":[ * {type:"required",message:'只能是整型',max:100,min:1}, * {type:"int",message:'只能是整型',max:100,min:1} * ] * } */ $.fn.validate = function(fields){ var $form = this; this.submit(function(evn){ var errors = {}; var haserror = false; for(var i=0;i0){ $e = $(e); var validator = new Validator(e.value); var fielderrors = []; for(var j=0;j0){ errors[e.name] = fielderrors; haserror = true; } } } if(haserror){ $form.fieldErrors(errors); evn.preventDefault(); } }); } /** * 设置字段错误 */ $.fn.fieldError = function(message){ if(this && this.length){ this.addClass("error"); this.tooltip({content:message,position:{at:"top",align:"left",offset:4}}); } }; /** * 清除字段错误 */ $.fn.fieldErrorClear = function(){ this.removeClass("error"); this.tooltip().destroy(); this.removeAttr("title"); }; /** * 绑定错误信息 */ $.fn.fieldErrors = function(messages){ $errors = $(".error").each(function(idx,e){ $(e).fieldErrorClear(); }); if(!messages){ return; } for(var x in messages){ var name = x.replace(/[.]/,"\\."); var field = $("*[name='"+name+"']",this); if(messages[x].join){ field.fieldError(messages[x].join("\n")); }else{ field.fieldError(messages[x]); } } }; /** * action error */ $.fn.actionErrors = function(messages){ var $error_view = $(".action-error"); if(!$error_view[0]){ $error_view = $('
      '); $(this).append($error_view); } var $ul = $error_view.find("ul"); if(!messages){ $error_view.remove(); return; } $ul.empty(); for(var i=0;i"+messages[i]+""); } }; /** * Action 消息 */ $.fn.actionMessages = function(messages){ var $info_view = $(".action-message"); if(!$info_view[0]){ $info_view = $('
        '); $(this).append($info_view); } var $ul = $info_view.find("ul"); if(!messages){ $info_view.remove(); return; } $ul.empty(); for(var i=0;i"+messages[i]+""); } }; $.fn.showValidateResult = function(result){ if(!result){ return; } if(result.actionMessages && result.actionMessages.length){ this.actionMessages(result.actionMessages); } if(result.actionErrors && result.actionErrors.length){ this.actionErrors(result.actionErrors); } if(result.fieldErrors){ this.fieldErrors(result.fieldErrors); } }; })(jQuery);