if (!ydm) { var ydm = { dialog: function (options) { var _options = options || {}; // 获取或覆盖提供的选项值 this.option = function (key, val) { if (typeof val === 'undefined') { return _options[key]; } _options[key] = val; } // dialog对象的id, elem的id this.id = null; // 绑定的节点 this.elem = null; // jq dialog对象 this.dialogobject = null; // dialog拖动停止事件 // todo #controlbar 入侵得很犀利 this.dragstop = function (event, ui) { if (ui.position.top < $('#controlbar').children().outerheight(true)) { ui.helper.css('top', $('#controlbar').children().outerheight(true) + 'px'); } ui.helper.find('iframe').nextall('div').remove(); }; // 提交的数据 this.submitdata = null; // 显示dialog this.open = function () { this.check(); this.dialogobject.dialog('open'); }; // 关闭dialog,并且移除dialog对象 this.destroy = function () { this.check(); if (typeof _options.destroy === 'function') { _options.destroy(this.submitdata); } for (var i = 0; i < ydm._dialogs.length; i++) { if (ydm._dialogs[i].elem.id == this.elem.id) { ydm._dialogs.splice(i, 1); break; } } $(this.dialogobject).dialog('destroy').remove(); }; // 提交 this.submit = function (value) { this.submitdata = value; if (typeof _options.submit === 'function') _options.submit(value); }; // 检查elem和dialogobject为null this.check = function () { if (this.elem == null || this.dialogobject == null) { throw 'dialog eccured an exception!'; } }; // 为dialog内容区里面的非iframe元素绑定事件 this.bindevent = function (selector, evtname, evt) { $(this.elem).find(selector).on(evtname, this, evt); }; // 获取jq dialog节点元素 this.finddialogelem = function () { if (typeof this.elem == 'object') return $(this.elem).closest('.ui-dialog').get(0); return null; }; // todo 设置loading显示 this.setloading = function (isshow, duration, delay) { }; }, _dialogs: [], _createid: function () { return 'd' + new date().gettime() + ('' + (math.random() * (99999 - 10000) + 10000)).replace(/\.+.*$/, ''); }, _create: function (html, did, options) { // 创建对象 var odialog = new this.dialog(options); odialog.id = did; // jq dialog 默认值 var oself = odialog; var odefaultdialogoptions = { autoopen: true, width: 600, height: 500, title: '', resizable: false, draggable: true, modal: true, close: function () { oself.destroy(); }, destroy: function () { } }; // 传入options 与默认值比较合并 options = options || {}; for (var key in odefaultdialogoptions) { if (!(key in options)) { options[key] = odefaultdialogoptions[key]; } } // 窗体加载到的window,默认为顶层 var owin = options.window || top; // 创建内容节点 var oelem = document.createelement('div'); oelem.id = did; oelem.style.overflow = 'hidden'; oelem.style.padding = 0; oelem.innerhtml = html; owin.document.body.appendchild(oelem); odialog.elem = oelem; // 创建jq dialog odialog.dialogobject = ydm.showcommondialog($(oelem), options, { helptip: true }) var ojqdialogelem = odialog.dialogobject.dialog('widget'); // 设置遮罩层position和z-index和opacity,确保遮罩层和dialog的z-index在1000以上,并且保持在当前所有jq、bootstrap模态对话框中最高 var aoverlays = $('.ui-widget-overlay').css('position', 'fixed'); var ilastoverlayzindex = 9999; $('.modal-backdrop, .modal, .ui-widget-overlay,.cke_dialog_background_cover,.cke_dialog,.module-setting', owin.document).each(function () { ilastoverlayzindex = math.max(parseint($(this).css('z-index') || 0), ilastoverlayzindex); }); ilastoverlayzindex += 2; aoverlays.eq(-1).css('z-index', ilastoverlayzindex); ojqdialogelem.css('z-index', ++ilastoverlayzindex); $('.ui-widget-overlay').eq(-1).css('opacity', '0'); // 修正jq content高度 oelem.style.height = options.height + 'px'; // 是否显示标题 if (options.showtitle === false) ojqdialogelem.find('.ui-dialog-titlebar').remove(); // 设置dialog position fixed属性 if (options.fixed === true) ojqdialogelem.css('position', 'fixed'); // 限制 dialog 拖动范围 //var iy1 = $('#controlbar').children().outerheight(true); //ojqdialogelem.draggable('option', 'containment', [0, iy1]); //ojqdialogelem.draggable({ stop: odialog.dragstop }); 有bug // ojqdialogelem.draggable({ drag: odialog.dragstop }); 无效 // dialog的top,left var itop = options.top; var ileft = options.left; // 坐标top if (typeof itop !== 'undefined') { ojqdialogelem.css('top', itop + 'px'); } else { if (options.fixed === true) { itop = $(owin).outerheight() / 2 - ojqdialogelem.outerheight(true) / 2; itop = itop > 0 ? itop : 0; ojqdialogelem.css('top', itop + 'px'); } } // 坐标left if (typeof ileft !== 'undefined') { ojqdialogelem.css('left', ileft + 'px'); } else { if (options.fixed === true) { ileft = $(owin).outerwidth() / 2 - ojqdialogelem.outerwidth(true) / 2; ileft = ileft > 0 ? ileft : 0; ojqdialogelem.css('left', ileft + 'px'); } } // 调整一下样式 $(odialog.elem).css('clear', 'both'); // 添加到对象组 this._dialogs.push(odialog); return odialog; }, // 创建dialog对象 createdialog: function (html, options) { return this._create(html, this._createid(), options); }, // 创建内容为iframe的dialog对象 createframedialog: function (src, options) { options = options || {}; options['width'] = options['width'] || 600; options['height'] = options['height'] || 500; var sdid = this._createid(); /* if (!/\?+/.test(src)) src += "?"; src += '&did=' + sdid; */ var param_did = 'did=' + sdid; param_did = (/\?+/.test(src) ? '&' : '?') + 'did=' + sdid; src = src.replace(/^([^\?#]*)([^#]*)(#.*)*/, '$1 $2 ' + param_did + ' $3').replace(/\s/g, ''); var shtml = ''; return this._create(shtml, sdid, options); }, // 查找dialog对象 find: function (id) { for (var key in this._dialogs) { if (this._dialogs[key].id === id) { return this._dialogs[key]; } } return null; }, //closedialog closedialog: function (idorclassname) { $("#" + idorclassname + ",." + idorclassname).find(".bootbox-close-button").click(); } } } /** * 轻量级弹窗 * @param {*} type 显示类型:1,成功;2,警告;3,错误;4,信息提示 * @param {*} msg 展示信息 * @param {*} options 额外参数 */ ydm.showmsgtipdialog = function (type, msg, options) { var iconinfo = '' switch (type) { case 1: iconinfo = '' break; case 2: iconinfo = '' break; case 3: iconinfo = '' break; case 4: iconinfo = '' break; } var optionsdefault = { title: '', dialogclass: 'msgtipbox', position:["center", 0], width: 'auto', height: 0, minwidth: 154, minheight: 34, zindex: 99999, modal: true, resizable: false, autoclose:2000 }; $.extend(optionsdefault, options || {}) var oldclose = optionsdefault.close; optionsdefault.close = function () { oldclose && oldclose() } optionsdefault.open = function (e) { $(e.target.offsetparent).prev().css('opacity', '0') } var odialogelem = $('
'+ iconinfo + ''+msg + '
').dialog(optionsdefault); if (optionsdefault.autoclose) { settimeout(function () { odialogelem.closest('.ui-dialog').css({ opacity: 0, top:0 }) settimeout(function () { odialogelem.closest('.msgtipbox').remove() },500) }, optionsdefault.autoclose) } if (optionsdefault.title === '') { odialogelem.siblings('.ui-dialog-titlebar').remove(); } odialogelem.closest('.ui-dialog').css({ height:'0' }) settimeout(function(){ odialogelem.closest('.ui-dialog').css({ height:'34px', padding: '8px 16px;', opacity: 1, top:'80px' }) odialogelem.css({height:'32px'}) },100) if (typeof optionsdefault.close === 'function') { settimeout(function () { optionsdefault.close('close'); }, 10); } if(type == 1){ if(typeof window['savetips'] == 'function'){ window['savetips'](); } } } /** * 重量级弹窗 * @param {*} type 显示类型:1,警告;2,错误;3,信息提示 * @param {*} msg 展示信息 * @param {*} options 额外参数 * @param {*} callback 回调 */ ydm.showmodaltipdialog = function (type, msg, options){ options = options || {} var iconinfo = '' var defaulttitle ='' switch (type) { case 1: iconinfo = '' defaulttitle='删除提示'; break; case 2: iconinfo = '' defaulttitle='失败提示'; break; case 3: iconinfo = '' defaulttitle='消息'; break; } var str = '
'+ iconinfo + ''+msg + '
'; var defaultoptions = { dialogclass: options.dialogclass || 'modaltipbox', title: options.title || defaulttitle, modal: true, width: 432, minheight: 140, autoopen: true, position: ['center', 'center'], resizable: false } var defaultconfirmparms = { helptip: false, zindex: 2147483647, btn: { cancelbtn: true, cancelbtnstyles: 'background-color:#f7f7f7;color:#666666;', canceltext: '取消', cancelcallback: function () { }, confirmbtn: true, confirmbtnstyles: 'background-color:#52a1f9', confirmtext: '确定', confirmloading: false, confirmcallback: function (callback) { callback() } } } defaultconfirmparms = $.extend(true, defaultconfirmparms, options) var odialogelem = ydm.showcommondialog($(str), defaultoptions, defaultconfirmparms) odialogelem.siblings('.ui-dialog-titlebar').css({ padding: 0, border: 0, height:'auto', 'line-height':'1.5', background: '#fff' }) odialogelem.closest('.ui-dialog').css({ 'border-radius':'8px' }) odialogelem.siblings('.ui-dialog-titlebar').find('.ui-dialog-title').css({ color: '#333333', 'padding-top':'16px', 'font-size': '14px;' }) odialogelem.siblings('.ui-dialog-titlebar').find('.ui-dialog-titlebar-close').remove() odialogelem.find('.dialog-footer').css({ 'border-top':'0px' }) } /** * target:目标元素 * options:参数 * 弹窗过度过程 */ ydm.showcommondialog = function (target, options, showobject, callback) { // 初始化参数 if ($.isfunction(showobject)) { callback = showobject showobject = {} } var needdestroy = !target.parent().length var defaultsettings = { helptip: true, closedestroy: needdestroy } $.extend(defaultsettings, showobject || {}) // 对开启关闭事件重写 if (defaultsettings) { var oldclosefun = options.close var oldopenfun = options.open var overlay = null var targettop = null options.close = function (e) { oldclosefun && oldclosefun(e) if (defaultsettings.zindex || defaultsettings["z-index"]) { targettop.css('z-index', '') } if (defaultsettings.closedestroy) { targetialog.dialog('destroy') } } options.open = function (e) { overlay = $(e.target.offsetparent).prev() if (!targettop) { targettop = $(e.target.offsetparent) } if (defaultsettings.zindex || defaultsettings["z-index"]) { targettop.css('z-index', defaultsettings.zindex || defaultsettings["z-index"]) overlay.css('z-index', defaultsettings.zindex || defaultsettings["z-index"]) } if (defaultsettings.hidebackground) { overlay.css('opacity', '0') } oldopenfun && oldopenfun(e) } } var targetialog = target.dialog(options) if (options.theme === 'red') { targetialog.closest('.ui-dialog').find('.ui-dialog-titlebar').addclass('theme-red') targetialog.closest('.ui-dialog').addclass('theme-red-ui') } if (defaultsettings) { // 是否显示问号 if (defaultsettings.helptip) { targetialog.closest('.ui-dialog').find('.ui-dialog-titlebar .ui-dialog-titlebar-help').remove() targetialog.closest('.ui-dialog').find('.ui-dialog-titlebar').append('') } // 是否显示底部按钮 var str = ''; if (defaultsettings.btn == true) { str += '
' str += '' } else if (defaultsettings.btn) { if (defaultsettings.btn.cancelbtn || defaultsettings.btn.confirmbtn) { str += '
' str += '' } } targetialog.append(str) // 绑定回调事件 if (defaultsettings.btn == true || defaultsettings.btn && defaultsettings.btn.cancelbtn) { targetialog.find('.dialog-footer .dialog-cancel').off().on('click', function () { defaultsettings.btn.cancelcallback && defaultsettings.btn.cancelcallback() targetialog.dialog('close') }) } if (defaultsettings.btn == true || defaultsettings.btn && defaultsettings.btn.confirmbtn) { targetialog.find('.dialog-footer .dialog-confirm').off().on('click', function () { var status = defaultsettings.btn.confirmcallback && defaultsettings.btn.confirmcallback(function () { defaultsettings.btn.confirmloading && targetialog.dialog('close') }) if (status == true) { return } !defaultsettings.btn.confirmloading && targetialog.dialog('close') }) } } callback && callback(targetialog) return targetialog } /** * 公共刪除彈窗 * @param {*} callback 關閉回調 * @param {*} content 內容 */ ydm.moduledeletedialog = function (options) { options = options || {} ydm.showmodaltipdialog(1,(options.contenttext?options.contenttext:'等等,你真的要删除吗?'),options) return var str = '' if (options.contenttext) { str = '
' + options.contenttext + '
' } else { str = '
等等,你真的要删除吗?
' } var defaultoptions = { title: options.title || '删除提示', modal: true, width: 540, height: 290, autoopen: true, position: ['center', 'center'], resizable: false, theme: 'red' } var defaultconfirmparms = { helptip: false, zindex: 100000, btn: { cancelbtn: true, cancelbtnstyles: 'background-color:#fbe3e2;color:rgba(231,79, 77, 1);', canceltext: '取消', cancelcallback: function () { }, confirmbtn: true, confirmbtnstyles: 'background-color:rgba(241, 75, 73, 0.9);', confirmtext: '确定', confirmloading: false, confirmcallback: function (callback) { callback() } } } defaultconfirmparms = $.extend(true, defaultconfirmparms, options) ydm.showcommondialog($(str), defaultoptions, defaultconfirmparms) } /** * 提示语信息,关闭弹窗 * @param {*} hint 是否有自定义 * @param {*} iserr 错误提示加true * @param {*} options */ ydm.moduleshowclosed = function (hint, iserr, options) { var tip = !iserr ? (hint ? hint : '您已保存成功') : (hint ? hint : '保存失败') ydm.showmsgtipdialog((iserr?3:1),tip,options) return ; var autoclose = 1000; if (iserr) autoclose = 2500; var tip = hint || '' if (!iserr) { // 如果没有自定义 if (!hint) { tip = '您已保存成功' } else { // 有自定义 tip = '' + tip } } else { // 如果没有自定义 if (!hint) { tip = '保存失败' } else { // 有自定义 tip = '' + tip } } var optionsdefault = { content: tip, autoclose: autoclose, close: function () { } }; $.extend(optionsdefault, options || {}) var oldclose = optionsdefault.close; optionsdefault.close = function () { oldclose && oldclose() } optionsdefault.open = function (e) { $(e.target.offsetparent).prev().css('opacity', '0') } ydw.msgbox(optionsdefault); } /** * module style setting 模块样式设置窗口 * @moduleid 模块id,可以是数字或者module_id这两种形式,必选 * @return 返回dialog对象 */ ydm.modulestylesetting = function (moduleid) { // 接收参数:模块id,必填 if (moduleid === '') return; moduleid = moduleid.replace('module_', ''); // 获取event对象 var oevent = window.event; if (oevent == null) { var ocaller = arguments.callee.caller; // 简单判断event对象, firefox while (ocaller != null && (ocaller.arguments.length == 0 || ocaller.arguments[0].type != 'click' || ocaller.arguments[0].clientx == null)) { ocaller = ocaller.caller; } oevent = ocaller.arguments[0]; } // 计算坐标 var imiddleleft = $(window).outerwidth() / 2; var ileft = 0; var sinitlocation = "left"; var initlocation = arguments[1]; if (oevent.clientx <= imiddleleft || initlocation == 'right') { ileft = $(window).outerwidth() - 320; sinitlocation = "right"; } // todo 这里很奇怪 ,无论怎么取,#controlbar的高度都为0... ,所以取其子元素 var icontrolbarheight = $('#controlbar').children().outerheight(true); icontrolbarheight = icontrolbarheight === null ? 0 : icontrolbarheight; var itop = icontrolbarheight; var iheight = $(window).outerheight() - icontrolbarheight; // 构造参数 var squery = ''; squery += squery.addurlparam('t', new date().gettime()); squery += squery.addurlparam('mid', moduleid); squery += squery.addurlparam('initlocation', sinitlocation); // 生成对象 odialog = ydm.createframedialog('/admin/modules/modulestylesetting.html?' + squery, { width: 320, height: iheight, showtitle: false, fixed: true, top: itop, left: ileft, destroy: function () { $(window).off('resize.modulestylesetting'); } }); // 浏览器变换大小事件 $(window).on('resize.modulestylesetting', { dialog: odialog, controlbarheight: icontrolbarheight }, function (evt) { var oselector = $(evt.data.dialog.elem); oselector.css('height', ($(window).outerheight() - evt.data.controlbarheight) + 'px'); oselector.find('iframe').css('height', ($(window).outerheight() - evt.data.controlbarheight) + 'px'); if (odialog.finddialogelem().getboundingclientrect().left > 0) { $(odialog.finddialogelem()).css('left', ($(window).outerwidth() - $(odialog.finddialogelem()).outerwidth(true)) + 'px'); } }); return odialog; } /** * 新的模块样式设置窗口 */ ydm.modulestylegiant = {}; /** * 显示模块样式设置窗体 * @param moduleid 模块id,可以是数字或者module_id这两种形式,必选 * @param moduletype 模块类型 * @param isshowanimate 是否优先显示模块动画设置界面 * @param hasanimate 是否包含动画页面 */ ydm.modulestylegiant.show = function (moduleid, moduletype, isshowanimate, hasanimate) { moduleid = (moduleid || '').replace('module_', ''); var commonstyleurl = '/admin/modules/commonstyle.html?moduleid=' + moduleid + '&moduletype=' + moduletype + '&t=' + new date().gettime();; var privatestyleurl = '/admin/modules/' + moduletype + 'style.html?moduleid=' + moduleid + '&t=' + new date().gettime(); var animateeffecturl = '/admin/widget/moblieanimate.html?moduleid=module_' + moduleid; // 获取event对象 var oevent = window.event; if (oevent == null) { var ocaller = arguments.callee.caller; // 简单判断event对象, firefox while (ocaller != null && (ocaller.arguments.length == 0 || ocaller.arguments[0].type != 'click' || ocaller.arguments[0].clientx == null)) { ocaller = ocaller.caller; } oevent = ocaller.arguments[0]; } // 计算坐标 var middleleft = window.innerwidth / 2; var left = 0; var targetlocation = "right"; if (oevent.clientx > middleleft) { targetlocation = "left"; } //子分栏跟分栏不共用 if( $("#modulesetting").exist() && $("#modulesetting").hasclass('grid-custom') ){ $("#modulesetting").remove(); } if (!$("#modulesetting").exist()) { var html = ''; html += ''; $(html).appendto('body'); // 打开时,关闭添加模块框 $('#addmodulepopup').fadeout(400); var elem = $('#modulesetting'); elem.fadein(200); // 样式编辑框在body区域内可拖拽 elem.draggable({ containment: "body", scroll: false, handle: 'span' }); // 屏幕高度减去180px,作为样式编辑框的高度 elem.css('height', $(window).outerheight() - 110); // 样式/动画 切换 elem.find('.title-tab').off().on('click', function () { $(this).siblings().removeclass('active'); $(this).addclass('active'); var target = $(this).attr('target') || ''; $('.setting-panel').not(target).hide(); $(target).show(); triggerstylemenu(); }); // elem.find('.title-tab').eq(0).click(); // 样式侧栏 通用/专属样式 切换 elem.find('.side-bar').off().on('click', '.style-tab', function () { $(this).siblings().removeclass('active'); $(this).addclass('active'); if ($(this).is('.common-style')) { $('#privatestyleframe').hide(); $('#commonstyleframe').show(); } else { $('#privatestyleframe').show(); $('#commonstyleframe').hide(); } triggerstylemenu(); }); // elem.find('.style-tab').eq(0).click(); // 样式 默认样式/鼠标经过 切换 elem.find('.content-nav-tab').off().on('click', function () { $(this).siblings().removeclass('active'); $(this).addclass('active'); triggerstylemenu(); }); // elem.find('.content-nav-tab').eq(0).click(); // 关闭按钮 elem.find('.close-btn').off().on('click', function () { $('#modulesetting').find('iframe').each(function () { try { $($(this)[0].contentwindow.window).trigger('beforeunload'); } catch (ex) { } }); // $('#modulesetting').css('transform', ''); $("#modulesetting").fadeout('200', function () { $('#modulesetting').remove(); }) }); // 恢复默认样式按钮 elem.find('#restorestyle').off().on('click', function () { var moduleid = $(this).data('moduleid'); if (!moduleid) return false; if (window.restorestylerunning) { return false; } var win = findeditwin(); var articleid = win.$('#module_' + moduleid + ' .articleid').val(); var productid = win.$('#module_' + moduleid + ' [name=productid]').val(); var moduletype = win.$('#module_' + moduleid).attr('moduletype'); var data = { mid: moduleid }; if (articleid) data.newsid = articleid; if (productid) data.productid = productid; window.restorestylerunning = true; // 因为新的缓存机制 所以要传入当前的page 才能获取容器模块的子模块 data['loadpage'] = decodeuri(page); $.ajax({ type: 'get', url: '/index.php?c=admin/module/modulestylesetting&a=restorestyle', async: true, cache: false, data: data, datatype: 'json', success: function (json) { if (!json.success) { alert(json.msg); return; } if (json.modulehtml) { win.clearmoduleremain && win.clearmoduleremain(); win.clearstyle && win.clearstyle(moduleid); win.$('#module_' + moduleid).replacewith(json.modulehtml); win.cancelorredoobj.savecancellist({ 'action': 'editoradd', 'do': 'restorestyle' }); } // 添加关联操作按钮还原 if (window.localstorage) { var inputstatus = window.localstorage['multi_inputer_lock_states'] || '', borderstatus = window.localstorage['border_style_setting_group_lock_states'] || '', regexpfilter = new regexp('m\\w' + moduleid + '_' + '.+?:\\d;', 'g'); // 查找出需要还原的字符串 var inputstrarray = inputstatus.match(regexpfilter), borderstrarray = borderstatus.match(regexpfilter); // 将需要还原的值还原为0(清空也可以) if (inputstrarray) { for (var i = 0; i < inputstrarray.length; i++) { inputstatus = inputstatus.replace(inputstrarray[i], ''); // inputstrarray[i].substr(0, inputstrarray[i].length - 2) + '0;' } window.localstorage['multi_inputer_lock_states'] = inputstatus; } if (borderstrarray) { for (var i = 0; i < borderstrarray.length; i++) { borderstatus = borderstatus.replace(borderstrarray[i], ''); } window.localstorage['border_style_setting_group_lock_states'] = borderstatus; } } // 'mc' + moduleid + '_' $('#commonstyleframe')[0].contentwindow.window.onbeforeunload = $.noop; $('#privatestyleframe')[0].contentwindow.window.onbeforeunload = $.noop; $('#commonstyleframe')[0].contentwindow.window.location.reload(); $('#privatestyleframe')[0].contentwindow.window.location.reload(); delete window.restorestylerunning; // 处理一下模块初始化的样式 比如加上默认最小高度 去掉黄色的border top.findeditwin().addzonetipsall(); top.findeditwin().$('.modulecontainer').css("outline", "none"); win.$('#commonstyle_margin_module_' + moduleid).remove(); // 去除边距拖拽