/*! * ZUI: Standard edition - v1.10.0 - 2021-11-04 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2021 cnezsoft.com; Licensed MIT */ /*! Some code copy from Bootstrap v3.0.0 by @fat and @mdo. (Copyright 2013 Twitter, Inc. Licensed under http://www.apache.org/licenses/)*/ /* ======================================================================== * ZUI: jquery.extensions.js * http://openzui.com * ======================================================================== * Copyright (c) 2014-2016 cnezsoft.com; Licensed MIT * ======================================================================== */ (function($, window, undefined) { 'use strict'; /* Check jquery */ if(typeof($) === 'undefined') throw new Error('ZUI requires jQuery'); /* ZUI shared object */ if(!$.zui) $.zui = function(obj) { if($.isPlainObject(obj)) { $.extend($.zui, obj); } }; var MOUSE_BUTTON_CODES = { all: -1, left: 0, middle: 1, right: 2 }; var lastUuidAmend = 0; $.zui({ uuid: function(asNumber) { var uuidNumber = (Date.now() - 1580890015292) * 10e4 + Math.floor(Math.random() * 10e3) * 10 + (lastUuidAmend++) % 10; return asNumber ? uuidNumber : uuidNumber.toString(36); }, callEvent: function(func, event, proxy) { if(typeof func === 'function') { if(proxy !== undefined) { func = func.bind(proxy); } var result = func(event); if(event) event.result = result; return !(result !== undefined && (!result)); } return 1; }, strCode: function(str) { var code = 0; if (typeof str !== 'string') str = String(str); if(str && str.length) { for(var i = 0; i < str.length; ++i) { code += (i + 1) * str.charCodeAt(i); } } return code; }, getMouseButtonCode: function(mouseButton) { if(typeof mouseButton !== 'number') { mouseButton = MOUSE_BUTTON_CODES[mouseButton]; } if(mouseButton === undefined || mouseButton === null) mouseButton = -1; return mouseButton; }, /** * default language name * @type {string} */ defaultLang: 'en', /** * Get client language name * @return {string} */ clientLang: function() { var lang; var config = window.config; if(typeof(config) != 'undefined' && config.clientLang) { lang = config.clientLang; } if(!lang) { var hl = $('html').attr('lang'); lang = hl ? hl : (navigator.userLanguage || navigator.userLanguage || $.zui.defaultLang); } return lang.replace('-', '_').toLowerCase(); }, /** * @type {object} * @example * { * 'zui.pager': { * 'zh-cn': { * prev: '上一页', * } * } * } */ langDataMap: {}, /** * Add lang data for components * @param {string} [langName] * @param {string} [componentName] * @param {object} data * @example * // Add lang data to specify language and specify component * $.zui.addLangData('zh-cn', 'zui.pager', { * prev: '上一页', * next: '下一页', * }); * * // Add lang data to specify language and multiple components * $.zui.addLangData('zh-cn', { * 'zui.pager': { * prev: '上一页', * next: '下一页', * }, * 'chosen': { * } * }); * * // Add lang data to multiple languages and multiple components * $.zui.addLangData({ * 'zh-cn': { * 'zui.pager': { * prev: '上一页', * next: '下一页', * }, * 'chosen': { * } * }, * 'zh-tw': { * 'zui.pager': { * prev: '上一页', * next: '下一页', * } * } * }); */ addLangData: function(langName, componentName, data) { var langData = {}; if (data && componentName && langName) { langData[componentName] = {}; langData[componentName][langName] = data; } else if (langName && componentName && !data) { data = componentName; $.each(data, function(comName) { langData[comName] = {}; langData[comName][langName] = data[comName]; }); } else if (langName && !componentName && !data) { $.each(data, function(theLangName) { var comsData = data[theLangName]; $.each(comsData, function(comName) { if (!langData[comName]) { langData[comName] = {}; } langData[comName][theLangName] = comsData[comName]; }); }); } $.extend(true, $.zui.langDataMap, langData); }, /** * Get lang data * @example * $.zui.getLangData('zui.pager'); * * $.zui.getLangData('zui.pager', 'zh-cn'); * * $.zui.getLangData('zui.pager', 'zh-cn', { * prev: '上一页', * next: '下一页', * }); */ getLangData: function(componentName, langName, initialData) { if (!arguments.length) { return $.extend({}, $.zui.langDataMap); } if (arguments.length === 1) { return $.extend({}, $.zui.langDataMap[componentName]); } if (arguments.length === 2) { var comData = $.zui.langDataMap[componentName]; if (comData) { return langName ? comData[langName] : comData; } return {}; } if (arguments.length === 3) { langName = langName || $.zui.clientLang(); var comData = $.zui.langDataMap[componentName]; var langData = comData ? comData[langName] : {}; return $.extend(true, {}, initialData[langName] || initialData.en || initialData.zh_cn, langData); } return null; }, lang: function() { if (arguments.length && $.isPlainObject(arguments[arguments.length - 1])) { return $.zui.addLangData.apply(null, arguments); } return $.zui.getLangData.apply(null, arguments); }, _scrollbarWidth: 0, checkBodyScrollbar: function() { if(document.body.clientWidth >= window.innerWidth) return 0; if(!$.zui._scrollbarWidth) { var scrollDiv = document.createElement('div'); scrollDiv.className = 'scrollbar-measure'; document.body.appendChild(scrollDiv); $.zui._scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; document.body.removeChild(scrollDiv); } return $.zui._scrollbarWidth; }, fixBodyScrollbar: function() { if($.zui.checkBodyScrollbar()) { var $body = $('body'); var bodyPad = parseInt(($body.css('padding-right') || 0), 10); if($.zui._scrollbarWidth) { $body.css({paddingRight: bodyPad + $.zui._scrollbarWidth, overflowY: 'hidden'}); } return true; } }, resetBodyScrollbar: function() { $('body').css({paddingRight: '', overflowY: ''}); }, }); $.fn.callEvent = function(name, event, model) { var $this = $(this); var dotIndex = name.indexOf('.zui.'); var shortName = dotIndex < 0 ? name : name.substring(0, dotIndex); var e = $.Event(shortName, event); if((model === undefined) && dotIndex > 0) { model = $this.data(name.substring(dotIndex + 1)); } if(model && model.options) { var func = model.options[shortName]; if(typeof func === 'function') { e.result = $.zui.callEvent(func, e, model); } } $this.trigger(e); return e; }; $.fn.callComEvent = function(component, eventName, params) { if (params !== undefined && !Array.isArray(params)) { params = [params]; } var $this = this; var result; $this.trigger(eventName, params); var eventCallback = component.options[eventName]; if (eventCallback) { result = eventCallback.apply(component, params); } return result; }; }(jQuery, window, undefined)); /* ======================================================================== * ZUI: typography.js * http://openzui.com * ======================================================================== * Copyright (c) 2014-2016 cnezsoft.com; Licensed MIT * ======================================================================== */ (function($) { 'use strict'; $.fn.fixOlPd = function(pd) { pd = pd || 10; return this.each(function() { var $ol = $(this); $ol.css('paddingLeft', Math.ceil(Math.log10($ol.children().length)) * pd + 10); }); }; $(function() { $('.ol-pd-fix,.article ol').fixOlPd(); }); }(jQuery)); /* ======================================================================== * Bootstrap: button.js v3.0.3 * http://getbootstrap.com/javascript/#buttons * * ZUI: The file has been changed in ZUI. It will not keep update with the * Bootsrap version in the future. * http://openzui.com * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ + function($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function(element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function(state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state = state + 'Text' if(!data.resetText) $el.data('resetText', $el[val]()) $el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit setTimeout((function() { if(state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d) } else if(this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d) } }).bind(this), 0) } Button.prototype.toggle = function() { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if($parent.length) { var $input = this.$element.find('input') if($input.prop('type') == 'radio') { if($input.prop('checked') && this.$element.hasClass('active')) changed = false else $parent.find('.active').removeClass('active') } if(changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') } if(changed) this.$element.toggleClass('active') } // BUTTON PLUGIN DEFINITION // ======================== var old = $.fn.button $.fn.button = function(option) { return this.each(function() { var $this = $(this) var data = $this.data('zui.button') var options = typeof option == 'object' && option if(!data) $this.data('zui.button', (data = new Button(this, options))) if(option == 'toggle') data.toggle() else if(option) data.setState(option) }) } $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function() { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document).on('click.zui.button.data-api', '[data-toggle^=button]', function(e) { var $btn = $(e.target) if(!$btn.hasClass('btn')) $btn = $btn.closest('.btn') $btn.button('toggle') e.preventDefault() }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.0.0 * http://twbs.github.com/bootstrap/javascript.html#alerts * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * ZUI: The file has been changed in ZUI. It will not keep update with the * Bootsrap version in the future. * http://openzui.com * ======================================================================== */ + function($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var zuiname = 'zui.alert'; var Alert = function(el) { $(el).on('click', dismiss, this.close) } Alert.prototype.close = function(e) { var $this = $(this) var selector = $this.attr('data-target') if(!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector) if(e) e.preventDefault() if(!$parent.length) { $parent = $this.hasClass('alert') ? $this : $this.parent() } $parent.trigger(e = $.Event('close.' + zuiname)) if(e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { $parent.trigger('closed.' + zuiname).remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one($.support.transition.end, removeElement) .emulateTransitionEnd(150) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= var old = $.fn.alert $.fn.alert = function(option) { return this.each(function() { var $this = $(this) var data = $this.data(zuiname) if(!data) $this.data(zuiname, (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.' + zuiname + '.data-api', dismiss, Alert.prototype.close) }(window.jQuery); /* ======================================================================== * ZUI: pager.js * http://openzui.com * ======================================================================== * Copyright (c) 2017-2019 cnezsoft.com; Licensed MIT * ======================================================================== */ (function($, undefined) { 'use strict'; var NAME = 'zui.pager'; // model name var DEFAULT_PAGER = { page: 1, // current page index recTotal: 0, // records total count recPerPage: 10, // records count per page }; var LANG = { zh_cn: { pageOfText: '第 {0} 页', prev: '上一页', next: '下一页', first: '第一页', last: '最后一页', goto: '跳转', pageOf: '第 {page} 页', totalPage: '共 {totalPage} 页', totalCount: '共 {recTotal} 项', pageSize: '每页 {recPerPage} 项', itemsRange: '第 {start} ~ {end} 项', pageOfTotal: '第 {page}/{totalPage} 页' }, zh_tw: { pageOfText: '第 {0} 頁', prev: '上一頁', next: '下一頁', first: '第一頁', last: '最後一頁', goto: '跳轉', pageOf: '第 {page} 頁', totalPage: '共 {totalPage} 頁', totalCount: '共 {recTotal} 項', pageSize: '每頁 {recPerPage} 項', itemsRange: '第 {start} ~ {end} 項', pageOfTotal: '第 {page}/{totalPage} 頁' }, en: { pageOfText: 'Page {0}', prev: 'Prev', next: 'Next', first: 'First', last: 'Last', goto: 'Goto', pageOf: 'Page {page}', totalPage: '{totalPage} pages', totalCount: 'Total: {recTotal} items', pageSize: '{recPerPage} per page', itemsRange: 'From {start} to {end}', pageOfTotal: 'Page {page} of {totalPage}' } }; // The pager model class var Pager = function(element, options) { var that = this; that.name = NAME; that.$ = $(element); options = that.options = $.extend({}, Pager.DEFAULTS, this.$.data(), options); that.langName = options.lang || $.zui.clientLang(); that.lang = $.zui.getLangData(NAME, that.langName, LANG); that.state = {}; that.set(options.page, options.recTotal, options.recPerPage, true); that.$.on('click', '.pager-goto-btn', function() { var $goto = $(this).closest('.pager-goto'); var page = parseInt($goto.find('.pager-goto-input').val()); if (page !== NaN) { that.set(page); } }).on('click', '.pager-item', function() { var page = $(this).data('page'); if (typeof page === 'number' && page > 0) { that.set(page); } }).on('click', '.pager-size-menu [data-size]', function() { var size = $(this).data('size'); if (typeof size === 'number' && size > 0) { that.set(-1, -1, size); } }); }; Pager.prototype.set = function(page, recTotal, recPerPage, notTiggerChange) { var that = this; if (typeof page === 'object' && page !== null) { recPerPage = page.recPerPage; recTotal = page.recTotal; page = page.page; } var state = that.state; if (!state) { state = $.extend({}, DEFAULT_PAGER); } var oldState = $.extend({}, state); if (typeof recPerPage === 'number' && recPerPage > 0) { state.recPerPage = recPerPage; } if (typeof recTotal === 'number' && recTotal >= 0) { state.recTotal = recTotal; } if (typeof page === 'number' && page >= 0) { state.page = page; } state.totalPage = (state.recTotal && state.recPerPage) ? (Math.ceil(state.recTotal / state.recPerPage)) : 1; state.page = Math.max(0, Math.min(state.page, state.totalPage)); // stateRecCount is items count in current page state.pageRecCount = state.recTotal; if (state.page && state.recTotal) { if (state.page < state.totalPage) { state.pageRecCount = state.recPerPage; } else if (state.page > 1) { state.pageRecCount = state.recTotal - (state.recPerPage * (state.page - 1)); } } state.skip = state.page > 1 ? ((state.page - 1) * state.recPerPage) : 0; state.start = state.skip + 1; state.end = state.skip + state.pageRecCount; state.prev = state.page > 1 ? (state.page - 1) : 0; state.next = state.page < state.totalPage ? (state.page + 1) : 0; that.state = state; if (!notTiggerChange && (oldState.page !== state.page || oldState.recTotal !== state.recTotal || oldState.recPerPage !== state.recPerPage)) { that.$.callComEvent(that, 'onPageChange', [state, oldState]); } return that.render(); }; Pager.prototype.createLinkItem = function(page, text, asAElement) { var that = this; if (text === undefined) { text = page; } var $ele = $('').attr('href', page ? that.createLink(page, that.state) : '###').html(text); if (!asAElement) { $ele = $('
').append($ele).toggleClass('active', page === that.state.page).toggleClass('disabled', !page || page === that.state.page); } return $ele; }; Pager.prototype.createNavItems = function(maxCount) { var that = this; var $nav = that.$; var pager = that.state; var totalPage = pager.totalPage; var page = pager.page; var appendItem = function(p, to) { if(p === false) { $nav.append(that.createLinkItem(0, to || that.options.navEllipsisItem)); return; } if(to === undefined) to = p; for(var i = p; i <= to; ++i) { $nav.append(that.createLinkItem(i)); } }; if (maxCount === undefined) { maxCount = that.options.maxNavCount || 10; } appendItem(1); if(totalPage > 1) { if(totalPage <= maxCount) { appendItem(2, totalPage); } else if(page < (maxCount - 2)) { appendItem(2, maxCount - 2); appendItem(false); appendItem(totalPage); } else if(page > (totalPage - maxCount + 2)) { appendItem(false); appendItem((totalPage - maxCount + 2), totalPage); } else { appendItem(false); appendItem(page - Math.ceil((maxCount-4)/2), page + Math.floor((maxCount-4)/2)); appendItem(false); appendItem(totalPage); } } }; Pager.prototype.createGoto = function() { var that = this; var pager = this.state; var $goto = $('