Files
lions-vote-backend/public/static/js/mzui.js
2022-05-04 15:41:02 +08:00

1534 lines
56 KiB
JavaScript
Vendored

/*!
* MZUI: standard - v1.0.1 - 2018-01-09
* Copyright (c) 2018 cnezsoft.com; Licensed MIT
*/
/* ========================================================================
* MZUI: utils.js
* https://github.com/easysoft/mzui
* ========================================================================
* Copyright (c) 2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
window.CoreLib = window['jQuery'] || window['Zepto'];
!(function($){
'use strict';
$.callEvent = function(name, func, proxy, relativeElement, params) {
var event = $.Event(name);
var result;
if(relativeElement) {
$(relativeElement).trigger(event, params);
result = event.result;
}
if($.isFunction(func)) {
result = func.apply(proxy, $.isArray(params) ? params : [params]);
}
return result;
}
$.fn.callEvent = function(component, name, params) {
return $.callEvent(name, component.options ? component.options[name] : null, component, this, params);
};
$.bindFn = function(fnName, _Constructor, defaultOptions) {
var old = $.fn[fnName];
var NAME = _Constructor.NAME || ('mzui.' + fnName);
$.fn[fnName] = function(option, params) {
return this.each(function() {
var $this = $(this);
var data = $this.data(NAME);
var options = typeof option == 'object' && option;
if(defaultOptions) options = $.extend(options, defaultOptions);
if(!data) $this.data(NAME, (data = new _Constructor($this, options)));
if(typeof option == 'string') data[option].apply(data, $.isArray(params) ? params : [params]);
});
};
$.fn[fnName].Constructor = _Constructor;
$.fn[fnName].noConflict = function() {
$.fn[fnName] = old;
return this
};
};
$.formatDate = function(date, format) {
if(!(date instanceof Date)) date = new Date(date);
var dateInfo = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
// 'H+': date.getHours() % 12,
'm+': date.getMinutes(),
's+': date.getSeconds(),
// 'q+': Math.floor((date.getMonth() + 3) / 3),
'S+': date.getMilliseconds()
};
if(/(y+)/i.test(format)) {
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
for(var k in dateInfo) {
if(new RegExp('(' + k + ')').test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? dateInfo[k] : ('00' + dateInfo[k]).substr(('' + dateInfo[k]).length));
}
}
return format;
};
$.format = function(str, args) {
if(str instanceof Date) return $.formatDate(str, args);
if(arguments.length > 1) {
var reg;
if(arguments.length == 2 && typeof(args) == "object") {
for(var key in args) {
if(args[key] !== undefined) {
reg = new RegExp("({" + key + "})", "g");
str = str.replace(reg, args[key]);
}
}
} else {
for(var i = 1; i < arguments.length; i++) {
if(arguments[i] !== undefined) {
reg = new RegExp("({[" + (i - 1) + "]})", "g");
str = str.replace(reg, arguments[i]);
}
}
}
}
return str;
};
$.calValue = function(anything, proxy, params) {
return $.isFunction(anything) ? anything.apply(proxy, $.isArray(params) ? params : [params]) : anything;
};
$.is$ = function(obj) {
return window.jQuery === $ ? (obj instanceof jQuery) : $.zepto.isZ(obj)
};
$.isStr = function(x) {
return typeof x == 'string';
};
$.isNum = function(x) {
return typeof x == 'number';
};
$.TapName = 'ontouchstart' in document.documentElement ? 'touchstart' : 'click';
if(!$.uuid) $.uuid = 0;
}(CoreLib));
/* ========================================================================
* MZUI: display.js
* https://github.com/easysoft/mzui
* ========================================================================
* Copyright (c) 2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
!(function($, undefined, window, document){
'use strict';
var uuid = 1200,
TAP_EVENT_NAME = $.TapName,
STR_DISPLAY = 'display',
STR_ORIGINAL_CLASS = 'orginalClass',
STR_HIDDEN = 'hidden',
STR_LOADING = 'loading',
STR_BODY = 'body',
TARGET_EVENT_SUFFIX = '.' + STR_DISPLAY + '.oneTarget',
NAME = 'mzui.' + STR_DISPLAY,
inverseSide = {left: 'right', bottom: 'top', top: 'bottom', right: 'left'};
// Display constructor([$element], options)
// $element is optional
var Display = function($element, options) {
var that = this;
if($.isPlainObject($element)) {
options = $element;
$element = null;
}
options = $.extend({element: $element}, Display.DEFAULT, $element ? $element.data() : null, options);
var display = options.display;
if(display && Display.plugs['_' + display]) {
options = $.calValue(Display.plugs['_' + display], that, options);
}
var selector = options.selector;
if(!$element) options.trigger = null;
if(!options.name) options.name = STR_DISPLAY + uuid++;
var triggerCallback = function(e) {
if(options.stopPropagation) e.stopPropagation();
var $this = $(this);
var thisOptions = $this.data() || {};
thisOptions.element = this;
if($this.is('a')) {
var href = $this.data('url') || $this.attr('href');
if(href && href !== '#' && href.indexOf('##') < 0) {
if(!options.target && /^#[a-z]/i.test(href)) {
thisOptions.target = href;
} else if(!thisOptions.remote) {
thisOptions.remote = href;
}
}
if(e && options.preventDefault !== false) e.preventDefault();
}
that[options.triggerMethod](thisOptions);
};
if(options.trigger) {
selector ? $element.on(options.trigger, selector, triggerCallback) : $element.on(options.trigger, triggerCallback);
}
that.$ = $element;
that.options = options;
if(options.displayAuto !== undefined && options.displayAuto !== false) {
if(selector && $element) {
$element.find(selector).each(triggerCallback);
} else that.show();
} else if(selector && $element) {
var activeClass = options.activeClass;
$element.find(selector).filter('[data-display-auto]' + (activeClass ? (',.' + activeClass) : '')).each(triggerCallback);
}
};
Display.prototype._getTarget = function(options) {
var that = this;
var target = $.calValue(options.target, that, options);
if(target === '!new' || target === '#' + STR_DISPLAY + 'Target') {
var targetId = STR_DISPLAY + 'Target-' + options.name,
layerId = STR_DISPLAY + 'Layer-' + options.name;
$('#' + targetId).remove();
target = $('<div class="' + STR_DISPLAY + ' ' + STR_HIDDEN + '"/>').attr({id: targetId});
var $layer = $('#' + layerId);
if(!$layer.length) $layer = $('<div class="' + STR_DISPLAY + '-layer"/>').attr({id: layerId}).appendTo(STR_BODY);
options.layer = options.container = $layer.append(target);
} else if(target === '!self') {
target = options.element || that.$;
}
target = $(target).addClass(STR_DISPLAY).attr('data-' + STR_DISPLAY + '-name', options.name);
if(!target.parent().length) {
target.appendTo(options.container);
}
if(!target.data(STR_ORIGINAL_CLASS)) target.data(STR_ORIGINAL_CLASS, target.attr('class'));
return target;
};
Display.prototype.update = function($target, options, callback, readyCallback) {
var that = this;
var fillContent = function(content) {
var template = options.template;
if($.isFunction(template)) {
content = template(content, options);
} else if($.isStr(template)) {
content = $.format(template, content);
}
if(content !== false) {
if($.is$(content)) {
$target.empty().append(content);
} else {
$target[options.contentType === 'text' ? 'text' : 'html'](content);
}
}
};
var remote = $.calValue(options.remote, that, options);
if(remote) {
var remoteCall = $.uuid++,
loadingClass = options.loadingClass;
$target.removeClass(options.showInClass).addClass(loadingClass);
$(STR_BODY).addClass('has-' + STR_DISPLAY + '-' + STR_LOADING);
if(options.$backdrop) options.$backdrop.addClass(loadingClass);
var ajaxOptions = $.isStr(remote) ? {url: remote} : remote;
if(that.xhr) that.xhr.abort();
that.remoteCall = remoteCall;
that.xhr = $.ajax($.extend({
dataType: options.remoteType || 'html',
error: options.remoteError
}, ajaxOptions, {
success: function(data, status, xhr) {
fillContent(data);
ajaxOptions.success && ajaxOptions.success(data, status, xhr);
},
complete: function(xhr, status) {
that.xhr = 0;
if(that.remoteCall !== remoteCall) return;
if(that.lastRemote !== remote) {
$(options.container).scrollTop(0);
that.lastRemote = remote;
}
$target.removeClass(loadingClass).addClass(options.showInClass);
$(STR_BODY).removeClass('has-' + STR_DISPLAY + '-' + STR_LOADING);
if(options.$backdrop) options.$backdrop.removeClass(loadingClass);
$.callEvent('loaded', options['loaded'], that, that.$, options);
$(document).triggerHandler(STR_DISPLAY + '.loaded', [that, that.$, options]);
ajaxOptions.complete && ajaxOptions.complete(xhr, status);
readyCallback && readyCallback();
}
}));
} else {
var content = $.calValue(options.content, that, options),
source = options.source;
if(source) {
source = $($.calValue(source, that, options));
source = source.parent().length ? source.clone() : source;
content = content ? source.html(content) : source;
}
fillContent(content);
readyCallback && readyCallback();
}
callback && callback(remote);
};
Display.prototype._getOptions = function(extraOptions) {
var that = this;
var options = $.extend({}, that.options, extraOptions);
var display = options.display;
if(display && Display.plugs[display]) {
options = $.calValue(Display.plugs[display], that, options);
}
if(!options.$target) options.$target = that._getTarget(options);
return options;
};
Display.prototype.show = function(extraOptions, callback) {
if($.isFunction(extraOptions)) {
callback = extraOptions;
extraOptions = null;
}
var that = this;
var options = that._getOptions(extraOptions);
that.last = options;
var $target = options.$target,
activeClass = options.activeClass,
animate = options.animate,
element = options.element,
placement = options.placement,
$layer = options.layer,
suggestAnimate = '',
suggestArrow = '',
displayName = options.name,
arrow = options.arrow,
backdrop = options.backdrop,
$element = $(element);
$target.attr('class', 'invisible ' + $target.data(STR_ORIGINAL_CLASS) + ' ' + (options.targetClass || '')).removeClass(STR_HIDDEN);
if($.callEvent('show', options.show, that, that.$, options) === false) {
$target.attr('class', STR_ORIGINAL_CLASS);
if(options.layer) options.layer.remove();
return callback && callback();
}
if(options.showSingle) {
(options.showSingle === true ? $target.parent().children() : $(options.showSingle)).not($target).removeClass(options.showInClass).addClass(STR_HIDDEN);
}
if($layer) $layer.removeClass(STR_HIDDEN);
if(backdrop) {
var backdropId = 'backdrop-' + displayName;
$('#' + backdropId).remove();
var $backdrop = options.$backdrop = $('<div class="display-backdrop"/>').attr({
id: backdropId,
type: options.display,
'data-display-name': displayName
}).appendTo(STR_BODY).css('zIndex', uuid++);
if(backdrop === true) backdrop = 'fade';
if($.isStr(backdrop)) $backdrop.addClass(backdrop);
$(STR_BODY).addClass('display-show-' + options.name);
setTimeout(function(){$backdrop.addClass('in');}, 10);
if(options.backdropDismiss) {
$backdrop.attr('data-dismiss', STR_DISPLAY);
}
}
if(options.targetZIndex !== 'none') ($layer || $target).css('zIndex', options.targetZIndex || uuid++);
if(activeClass && element) {
if(options.activeSingle) $element.parent().children().removeClass(activeClass);
$element.addClass(activeClass);
}
that.update($target, options, function(isRemoteContent) {
if(options.scrollTop) $(options.container).scrollTop(0);
placement = $.calValue(placement, that, options);
if(placement) {
if($.isStr(placement) && placement[0] == '{') {
placement = $.parseJSON(placement);
}
var $body = $('body');
if($.isPlainObject(placement)) {
$target.css(placement);
} else if(placement === 'overlay') {
var bounding = $element[0].getBoundingClientRect();
$target.css({position: 'absolute', left: bounding.left, top: bounding.top, width: bounding.width, height: bounding.height});
} else if(placement.indexOf('beside') === 0) {
$target.css({position: 'fixed'});
placement = placement.split('-');
var $win = $(window);
var beside = placement[1] || 'auto',
float = placement[2] || 'center',
offset = $element.offset(),
bounding = $element[0].getBoundingClientRect(),
width = $target.width(),
height = $target.height(),
wWidth = $win.width(),
wHeight = $win.height(),
floatStart = float === 'start',
floatEnd = float === 'end',
top, left;
var eTop = bounding.top,
eLeft = bounding.left,
eWidth = bounding.width,
eHeight = bounding.height;
if(beside === 'auto') {
if(eTop + eHeight + height <= wHeight) {
beside = 'bottom';
} else if(height <= eTop) {
beside = 'top';
} else if(eLeft + eWidth + width <= wWidth) {
beside = 'right';
} else if(width <= eLeft) {
beside = 'left';
} else beside = 'bottom'
}
var bestLeft = floatStart ? eLeft : (floatEnd ? (eLeft + eWidth) : (eLeft + eWidth/2 - width/2)),
bestTop = floatStart ? eTop : (floatEnd ? (eTop + eHeight) : (eTop + eHeight/2 - height/2));
if(beside === 'bottom') {
top = eTop + eHeight;
left = bestLeft;
} else if(beside === 'top') {
top = eTop - height;
left = bestLeft;
} else if(beside === 'right') {
top = bestTop;
left = eLeft + eWidth;
} else {
top = bestTop;
left = eLeft - width;
}
$target.css({
top: Math.max(0, Math.min(top, wHeight - height)),
left: Math.max(0, Math.min(left, wWidth - width))
});
suggestArrow = inverseSide[beside];
suggestAnimate = 'fade scale-from-' + suggestArrow;
} else {
placement = placement.split('-');
var justify = placement[0],
align = placement[1],
layerCss = {};
if(justify == 'top' || justify == 'bottom' || justify == 'left' || justify == 'right') {
layerCss.justifyContent = 'flex-' + ((justify === 'top' || justify == 'left') ? 'start' : 'end');
layerCss.flexDirection = (justify == 'top' || justify == 'bottom') ? 'column' : 'row';
layerCss.alignItems = align ? (align == 'center' ? 'center' : (align == 'left' ? 'flex-start' : 'flex-end')) : 'stretch';
}
if($layer) $layer.css(layerCss);
suggestAnimate = justify;
suggestArrow = inverseSide[suggestAnimate];
suggestAnimate = 'from-' + suggestAnimate;
}
}
if(arrow) {
var arrowClass = 'display-arrow arrow-' + suggestArrow;
if($.isStr(arrow)) arrowClass += ' ' + arrow;
$target.addClass(arrowClass);
}
var afterShow = function() {
$target.removeClass('invisible');
if(!isRemoteContent) $target.addClass(options.showInClass);
callback && callback();
var autoHide = options.autoHide;
if(autoHide) {
that.animateCall = setTimeout(function(){that.hide()}, $.isNum(autoHide) ? autoHide : 5000);
}
that.animateCall = setTimeout(function() {
$.callEvent('shown', options.shown, that, that.$, options);
$(document).triggerHandler(STR_DISPLAY + '.shown', [that, that.$, options]);
}, options.duration + 50);
if(options.targetDismiss) {
$target.one((options.targetDismiss === true ? TAP_EVENT_NAME : options.targetDismiss) + TARGET_EVENT_SUFFIX, function(){that.hide();});
}
};
if(animate) {
if(animate === true) {
$target.addClass(suggestAnimate ? ('enter-' + suggestAnimate) : 'fade');
} else {
if($.isStr(animate)) {
$target.addClass(animate.replace('suggest', suggestAnimate));
} else if($.isNum(animate)) {
options.duration = animate;
}
}
clearTimeout(that.animateCall);
that.animateCall = setTimeout(afterShow, 10);
} else {
afterShow();
}
}, function() {
$.callEvent('displayed', options.displayed, that, that.$, options);
$(document).triggerHandler(STR_DISPLAY + '.displayed', [that, that.$, options]);
if(options.plugSkin) {
$target.find('[data-skin]').skin();
}
if(options.plugDisplay) {
$target.find('[data-' + STR_DISPLAY + ']').display();
}
if($.fn.listenScroll) {
$target.find('.listen-scroll').listenScroll();
}
});
Display.last = displayName;
Display.all[displayName] = that;
};
Display.prototype.hide = function(extraOptions, callback) {
if($.isFunction(extraOptions)) {
callback = extraOptions;
extraOptions = null;
}
var that = this;
var options = that.last || that._getOptions(extraOptions);
if($.callEvent('hide', options.hide, that, that.$, options) === false) return callback && callback();
that.last = false;
var $target = options.$target.off(TARGET_EVENT_SUFFIX),
$backdrop = $('#backdrop-' + options.name);
var afterHide = function() {
if(options.layer) options.layer.addClass(STR_HIDDEN);
$.callEvent(STR_HIDDEN, options[STR_HIDDEN], that, that.$, options);
$(document).triggerHandler(STR_DISPLAY + '.' + STR_HIDDEN, [that, that.$, options]);
$target.addClass(STR_HIDDEN);
$backdrop.remove();
$(STR_BODY).removeClass(STR_DISPLAY + '-show-' + options.name);
if(options.layer) options.layer.remove();
};
if(options.activeClass && options.element) {
$(options.element).removeClass(options.activeClass);
}
$target.removeClass(options.showInClass);
$backdrop.removeClass('in');
if(options.animate) {
clearTimeout(that.animateCall);
that.animateCall = setTimeout(afterHide, options.duration + 50);
} else {
afterHide();
}
};
Display.prototype.isShow = function(options) {
options = this._getOptions(options);
return options.checkShow ? $.calValue(options.checkShow, this, options) : (options.$target ? options.$target.hasClass(options.showInClass) : options.last);
};
Display.prototype.toggle = function(options, callback) {
var toggle;
if(options === true || options === false) {
toggle = options;
options = $.isPlainObject(callback) ? callback : null;
if(options) callback = null;
} else {
toggle = this.isShow(options);
}
this[toggle ? 'hide' : 'show'](options, callback);
};
Display.NAME = NAME;
Display.DEFAULT = {
// display: '', // the display type
trigger: TAP_EVENT_NAME, // trigger event name
// name: '', // unique name
triggerMethod: 'show', // trigger method: show, toggle, hide
// target: null, // page, tooltip,
// selector: null, // trigger event selector,
// targetClass: null // CSS class be add to the target element
// targetGroup: '',
container: STR_BODY,
// arrow: false, // Display arrow beside target edge
// scrollTop: false,
plugSkin: true,
plugDisplay: true,
// targetDismiss: false,
content: false, // content source
// remote: '', // remote source
// remoteType: 'html', // html or json
// remoteError: '', // content or function for remote error
// contentType: 'html', // Content type: html or text
// source: '', // function or jquery selector
// template: null, // string to format content,
loadingClass: STR_LOADING, // CSS class to append to target and body element
showInClass: 'in', // CSS class to be add after show target
// showSingle: false, //
animate: true, // boolean, CSS classes or number for duration
duration: 300, // animation duration
// backdrop: false, // show backdrop or not,
// placement: false, // target placement, 'screen-center', 'screen-top-left'...
keyboard: true, // if true then hide target on press ESC
backdropDismiss: true, // if true then dismiss display on tab backdrop
// autoHide: 0, // if set a number then auto hide the target after the given millionseconds
// activeClass: '', // active class add to the trigger element after target show and remove it after the target hide
activeSingle: true, // make sure active class only be add to a single trigger element
// events callback
// show: null, // callback before show target
// shown: null, // callback after show target
// hide: null, // callback before hide target
// hidden: null, // callback after hide target
// loaded: null, // callback after load target
};
Display.plugs = function(name, func, fnName) {
if($.isPlainObject(name)) {
$.each(name, Display.plugs);
} else if(func) {
Display.plugs[name] = func;
name = name.indexOf('_') === 0 ? name.substr(1) : name;
if(!$.fn[name] && fnName !== false) {
$.bindFn(fnName || name, Display, {display: name});
}
} else {
return Display.plugs[name];
}
};
Display.all = {};
Display.dismiss = function(name, callback) {
if($.isFunction(name)) {
callback = name;
name = '';
}
name = name || Display.last;
var display = Display.all[name];
if(display) display.hide(callback);
};
$.bindFn(STR_DISPLAY, Display);
$.Display = Display;
$(function() {
$('[data-' + STR_DISPLAY + ']').display();
$(document).on(TAP_EVENT_NAME, '[data-dismiss="' + STR_DISPLAY + '"]', function() {
var $this = $(this), dataName = 'data-' + STR_DISPLAY + '-name';
name = $this.attr(dataName);
if(!name || name == 'null' || name == 'undefined') name = $this.closest('.' + STR_DISPLAY).attr(dataName);
Display.dismiss(name);
});
});
}(CoreLib, undefined, window, document));
/* ========================================================================
* MZUI: display.plugs.js
* https://github.com/easysoft/mzui
* ========================================================================
* Copyright (c) 2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
!(function($, undefined){
'use strict';
if(!$.Display) {
console.error('display.plugs.js requires display.js');
return;
}
var getSourceElement = function(name, element, oldSource, extraClass, nameClass) {
var $element = $(element).next('.' + name);
if(!$element.length) $element = oldSource;
return $element || '<div class="' + (nameClass || name) + ' ' + (extraClass || '') + '"/>';
};
var isUndefinedThen = function(x, y) {
return x === undefined ? y : x;
};
$.Display.plugs({
dropdown: function(options) {
var that = this,
oldSource = options.source;
return $.extend(options, {
backdrop: isUndefinedThen(options.backdrop, 'clean'),
source: options.target ? null : function() {
return getSourceElement('dropdown-menu', options.element, oldSource);
},
target: isUndefinedThen(options.target, '!new'),
placement: isUndefinedThen(options.placement, 'beside'),
activeClass: isUndefinedThen(options.activeClass, 'open'),
targetDismiss: isUndefinedThen(options.targetDismiss, true)
});
},
popover: function(options) {
var that = this,
oldSource = options.source;
return $.extend(options, {
arrow: isUndefinedThen(options.arrow, true),
backdrop: isUndefinedThen(options.backdrop, 'clean'),
source: options.target ? null : function() {
return getSourceElement('popover', options.element, oldSource, 'canvas with-padding');
},
target: isUndefinedThen(options.target, '!new'),
placement: isUndefinedThen(options.placement, 'beside'),
activeClass: isUndefinedThen(options.activeClass, 'open')
});
},
messager: function(options) {
var that = this;
return $.extend(options, {
autoHide: isUndefinedThen(options.autoHide, true),
animate: (options.animate === undefined || options.animate === true) ? 'scale-suggest fade' : options.animate,
// backdrop: isUndefinedThen(options.backdrop, 'clean'),
closeButton: isUndefinedThen(options.closeButton, true),
template: function(content, options) {
var $messager = $(options.source || '<div class="messager list-item"/>');
if(options.icon) $messager.append('<div class="avatar"><i class="icon icon-' + options.icon + '"/></div>');
$messager.append('<div class="title">' + content + '</div>');
if(options.closeButton) {
$messager.append('<button class="btn muted" type="button" data-dismiss="display"><i class="icon icon-remove"></i></button>');
}
return $messager.addClass(options.type || 'gray');
},
target: '!new',
placement: isUndefinedThen(options.placement, 'bottom-center'),
activeClass: isUndefinedThen(options.activeClass, 'open')
});
},
modal: function(options) {
var that = this,
oldSource = options.source;
return $.extend(options, {
backdrop: isUndefinedThen(options.backdrop, 'modal-backdrop fade'),
source: options.target ? null : function() {
return getSourceElement('modal', options.element, oldSource, '', 'content');
},
target: isUndefinedThen(options.target, '!new'),
targetClass: 'modal ' + (options.targetClass || ''),
placement: isUndefinedThen(options.placement, $.TapName === 'tap' ? 'bottom' : 'center'),
activeClass: isUndefinedThen(options.activeClass, 'open')
});
},
_collapse: function(options) {
return $.extend(options, {
triggerMethod: 'toggle',
animate: false,
showInClass: 'in',
activeClass: 'collapse-open',
showSingle: isUndefinedThen(options.group || options.showSingle, options.selector ? ('collapse-group-' + (++$.uuid)) : false)
});
}
});
$.Display.plugs('_self', function(options) {
return $.extend(options, {
trigger: false,
target: '!self',
targetZIndex: 'none',
displayAuto: isUndefinedThen(options.displayAuto, true)
});
}, 'displaySelf');
var messager = new $.Display({display: 'messager'});
messager._show = messager.show;
messager.show = function(content, options) {
messager._show($.extend({content: content}, options));
};
$.each({
primary : 0,
success : 'ok-sign',
info : 'info-sign',
warning : 'warning-sign',
danger : 'exclamation-sign',
important: 0,
special : 0
}, function(name, icon){
messager[name] = function(content, options) {
messager._show($.extend({content: content, icon: icon || null, type: name}, options));
};
});
$.messager = messager;
}(CoreLib, undefined));
/* ========================================================================
* MZUI: scroll-listener.js
* https://github.com/easysoft/mzui
* ========================================================================
* Copyright (c) 2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
!(function($){
'use strict';
var NAME = 'mzui.scrollListener';
var ScrollListener = function($element, options) {
var that = this;
that.options = options = $.extend({}, ScrollListener.DEFAULT, $element.data(), options);
that.$ = $element;
that.$container = options.container ? (options.container == 'parent' ? that.$.parent() : $(options.container)) : that.$;
that.lastScrollTop = 0;
that.lastCallTime = 0;
var lastScrollCall = 0;
$element.on('scroll.' + NAME, function() {
clearTimeout(lastScrollCall);
var time = new Date().getTime();
lastScrollCall = setTimeout(function() {
that.onScroll();
that.lastCallTime = time;
}, (time - that.lastCallTime) > options.handleInterval ? 0 : options.handleInterval);
});
if(options.canScrollClass) {
var scrollHeight = (that.$[0] === window ? $('body') : that.$)[0].scrollHeight;
that.$container.toggleClass(options.canScrollClass, scrollHeight > that.$.height());
}
};
ScrollListener.prototype.onScroll = function() {
var that = this;
var options = that.options;
var scrollTop = that.$.scrollTop();
var isInScroll = scrollTop > 0;
var scrollDirection = scrollTop > that.lastScrollTop ? 'down' : 'up';
var directionClass = options.directionClass;
that.$container.toggleClass(options.inScrollClass, isInScroll)
.toggleClass(directionClass + '-down', scrollDirection === 'down')
.toggleClass(directionClass + '-up', scrollDirection === 'up')
.toggleClass(directionClass + '-over', scrollTop + that.$.height() >= that.$[0].scrollHeight);
that.$container.callEvent(that, 'listenScroll', [isInScroll, scrollDirection, scrollTop]);
that.isInScroll = isInScroll;
that.scrollDirection = scrollDirection;
that.lastScrollTop = scrollTop;
};
ScrollListener.NAME = NAME;
ScrollListener.DEFAULT = {
minDelta : 20,
handleInterval: 100,
inScrollClass : 'in-scroll',
directionClass: 'scroll',
canScrollClass: 'can-scroll'
};
$.bindFn('listenScroll', ScrollListener);
$(function() {
$(window).listenScroll({container: 'body'});
$('.listen-scroll').listenScroll();
});
}(CoreLib));
/* ========================================================================
* MZUI: color.js
* https://github.com/easysoft/mzui
* ========================================================================
* Copyright (c) 2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
!(function($, Math, undefined) {
'use strict';
var hexReg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/,
N255 = 255,
N360 = 360,
N100 = 100,
STR_STRING = 'string',
STR_OBJECT = 'object';
var isUndefined = function(x) {
return x === undefined;
};
var isNotUndefined = function(x) {
return !isUndefined(x);
};
var convertToInt = function(x) {
return parseInt(x);
};
var clampNumber = function(x, max) {
return clamp(number(x), max);
};
var convertToRgbInt = function(x) {
return convertToInt(clampNumber(x, N255));
};
/* color */
var Color = function(r, g, b, a) {
var that = this;
that.r = that.g = that.b = 0;
that.a = 1;
if(isNotUndefined(a)) that.a = clampNumber(a, 1);
if(isNotUndefined(r) && isNotUndefined(g) && isNotUndefined(b)) {
that.r = convertToRgbInt(r);
that.g = convertToRgbInt(g);
that.b = convertToRgbInt(b);
} else if(isNotUndefined(r)) {
var type = typeof(r);
if(type == STR_STRING) {
r = r.toLowerCase();
if(r === 'transparent') {
that.a = 0;
} else {
that.rgb(hexToRgb(r));
}
} else if(type == 'number' && isUndefined(g)) {
that.r = that.g = that.b = convertToRgbInt(r);
} else if(type == STR_OBJECT && isNotUndefined(r.r)) {
that.r = convertToRgbInt(r.r);
if(isNotUndefined(r.g)) that.g = convertToRgbInt(r.g);
if(isNotUndefined(r.b)) that.b = convertToRgbInt(r.b);
if(isNotUndefined(r.a)) that.a = clampNumber(r.a, 1);
} else if(type == STR_OBJECT && isNotUndefined(r.h)) {
var hsl = {
h: clampNumber(r.h, N360),
s: 1,
l: 1,
a: 1
};
if(isNotUndefined(r.s)) hsl.s = clampNumber(r.s, 1);
if(isNotUndefined(r.l)) hsl.l = clampNumber(r.l, 1);
if(isNotUndefined(r.a)) hsl.a = clampNumber(r.a, 1);
that.rgb(hslToRgb(hsl));
}
}
};
Color.prototype.rgb = function(rgb) {
var that = this;
if(isNotUndefined(rgb)) {
if(typeof(rgb) == STR_OBJECT) {
if(isNotUndefined(rgb.r)) that.r = convertToRgbInt(rgb.r);
if(isNotUndefined(rgb.g)) that.g = convertToRgbInt(rgb.g);
if(isNotUndefined(rgb.b)) that.b = convertToRgbInt(rgb.b);
if(isNotUndefined(rgb.a)) that.a = clampNumber(rgb.a, 1);
} else {
var v = convertToInt(number(rgb));
that.r = v;
that.g = v;
that.b = v;
}
return that;
} else return {
r: that.r,
g: that.g,
b: that.b,
a: that.a
};
};
Color.prototype.hue = function(hue) {
var that = this;
var hsl = that.toHsl();
if(isUndefined(hue)) return hsl.h;
else {
hsl.h = clampNumber(hue, N360);
that.rgb(hslToRgb(hsl));
return that;
}
};
Color.prototype.darken = function(amount) {
var that = this;
var hsl = that.toHsl();
hsl.l -= amount / N100;
hsl.l = clamp(hsl.l, 1);
that.rgb(hslToRgb(hsl));
return that;
};
Color.prototype.clone = function() {
var that = this;
return new Color(that.r, that.g, that.b, that.a);
};
Color.prototype.lighten = function(amount) {
return this.darken(-amount);
};
Color.prototype.fade = function(amount) {
this.a = clamp(amount / N100, 1);
return this;
};
// Color.prototype.spin = function(amount) {
// var hsl = this.toHsl();
// var hue = (hsl.h + amount) % N360;
// hsl.h = hue < 0 ? N360 + hue : hue;
// return this.rgb(hslToRgb(hsl));
// };
Color.prototype.toHsl = function() {
var that = this;
var r = that.r / N255,
g = that.g / N255,
b = that.b / N255,
a = that.a;
var max = Math.max(r, g, b),
min = Math.min(r, g, b);
var h, s, l = (max + min) / 2,
d = max - min;
if(max === min) {
h = s = 0;
} else {
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
return {
h: h * N360,
s: s,
l: l,
a: a
};
};
Color.prototype.luma = function() {
var r = this.r / N255,
g = this.g / N255,
b = this.b / N255;
r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);
g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);
b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
};
Color.prototype.saturate = function(amount) {
var hsl = this.toHsl();
hsl.s += amount / N100;
hsl.s = clamp(hsl.s);
return this.rgb(hslToRgb(hsl));
};
// Color.prototype.desaturate = function(amount) {
// return this.saturate(-amount);
// };
Color.prototype.contrast = function(dark, light, threshold) {
if(isUndefined(light)) light = new Color(N255, N255, N255, 1);
else light = new Color(light);
if(isUndefined(dark)) dark = new Color(0, 0, 0, 1);
else dark = new Color(dark);
if(dark.luma() > light.luma()) {
var t = light;
light = dark;
dark = t;
}
if(this.a < 0.5) return dark;
if(isUndefined(threshold)) threshold = 0.43;
else threshold = number(threshold);
if(this.luma() < threshold) {
return light;
} else {
return dark;
}
};
Color.prototype.hexStr = function() {
var toHexValue = function(x) {
x = x.toString(16);
return x.length == 1 ? ('0' + x) : x;
};
return '#' + toHexValue(this.r) + toHexValue(this.g) + toHexValue(this.b);
};
Color.prototype.toCssStr = function() {
var that = this;
if(that.a > 0) {
if(that.a < 1) {
return 'rgba(' + that.r + ',' + that.g + ',' + that.b + ',' + that.a + ')';
} else {
return that.hexStr();
}
} else {
return 'transparent';
}
};
Color.isColor = isColor;
/* helpers */
function hexToRgb(hex) {
hex = hex.toLowerCase();
if(hex && hexReg.test(hex)) {
var i;
if(hex.length === 4) {
var hexNew = '#';
for(i = 1; i < 4; i += 1) {
hexNew += hex.slice(i, i + 1).concat(hex.slice(i, i + 1));
}
hex = hexNew;
}
var hexChange = [];
for(i = 1; i < 7; i += 2) {
hexChange.push(convertToInt('0x' + hex.slice(i, i + 2)));
}
return {
r: hexChange[0],
g: hexChange[1],
b: hexChange[2],
a: 1
};
} else {
throw new Error('Wrong hex string! (hex: ' + hex + ')');
}
}
function isColor(hex) {
return typeof(hex) === STR_STRING && (hex.toLowerCase() === 'transparent' || hexReg.test($.trim(hex.toLowerCase())));
}
function hslToRgb(hsl) {
var h = hsl.h,
s = hsl.s,
l = hsl.l,
a = hsl.a;
h = (number(h) % N360) / N360;
s = clampNumber(s);
l = clampNumber(l);
a = clampNumber(a);
var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
var m1 = l * 2 - m2;
var r = {
r: hue(h + 1 / 3) * N255,
g: hue(h) * N255,
b: hue(h - 1 / 3) * N255,
a: a
};
return r;
function hue(h) {
h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
if(h * 6 < 1) {
return m1 + (m2 - m1) * h * 6;
} else if(h * 2 < 1) {
return m2;
} else if(h * 3 < 2) {
return m1 + (m2 - m1) * (2 / 3 - h) * 6;
} else {
return m1;
}
}
}
function fit(n, end, start) {
if(isUndefined(start)) start = 0;
if(isUndefined(end)) end = N255;
return Math.min(Math.max(n, start), end);
}
function clamp(v, max) {
return fit(v, max);
}
function number(n) {
if(typeof(n) == 'number') return n;
return parseFloat(n);
}
$.Color = Color;
}(CoreLib, Math, undefined));
/* ========================================================================
* MZUI: skin.js
* https://github.com/easysoft/mzui
* ========================================================================
* Copyright (c) 2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
(function($, undefined, Math){
'use strict';
var NAME = 'mzui.skin',
allSkins = {};
var Skin = function($element, options) {
var that = this;
that.options = options = $.extend({}, Skin.DEFAULT, $element.data(), options);
that.$ = $element;
that.paint();
};
Skin.prototype.paint = function(skin) {
var that = this;
var options = that.options,
$e = that.$;
var isPale = that.$.hasClass('pale') || options.pale,
isOutline = options.outline || $e.hasClass('outline'),
isTextTint = options.tint || $e.hasClass('text-tint'),
color, skinName;
skin = skin === undefined ? options.skin : skin;
if(isPale === undefined && (that.$.hasClass('dark') || options.dark)) isPale = false;
if($.isStr(skin) && skin.indexOf(':') > 0) {
skin = skin.split(':');
skinName = skin[0];
skin = skin[1];
var skinNum = parseInt(skin);
if(skinNum !== NaN) skin = skinNum;
}
if(skin === '' || skin === undefined || skin === 'random') {
skin = Math.round(Math.random() * 360);
} else if(allSkins[skin]) {
skin = allSkins[skin];
} else if($.isStr(skin) && skin.indexOf('random') === 0) {
allSkins[skin] = skin = Math.round(Math.random() * 360);
} else if($.isStr(skin) && skin.indexOf('@') === 0) {
var val = 0;
for(var i = skin.length - 1; i > 0; --i) {
val += Math.pow(3, (i - 1)) * skin.charCodeAt(i);
}
skin = val;
}
if(skinName) allSkins[skinName] = skin;
if(typeof skin === 'number') {
color = new $.Color({h: (skin * options.hueSpace) % 360, s: options.saturation, l: options.lightness});
} else {
color = new $.Color(skin);
}
that.color = color;
if(color.luma() < options.threshold) { // color is dark color
if(isPale) {
that.darkColor = color;
that.color = new $.Color($.extend(color.toHsl(), {l: options.paleLight}));
}
} else {
if(isPale === false) {
that.paleColor = color;
that.color = new $.Color($.extend(color.toHsl(), {l: options.darkLight}));
} else {
isPale = true;
if(isTextTint) that.darkColor = new $.Color($.extend(color.toHsl(), {l: options.darkLight}));
}
}
var colorCss = that.color.toCssStr();
var cssStyle = {
backgroundColor: isOutline ? 'transparent' : colorCss,
borderColor: colorCss,
color: isOutline ? colorCss : (!isPale ? '#fff' : (isTextTint ? that.darkColor.toCssStr() : ''))
};
if(that.$.callEvent(that, 'paint', cssStyle) !== false) $e.css(cssStyle);
};
Skin.NAME = NAME;
Skin.DEFAULT = {
skin: 'random',
hueSpace: 47,
saturation: 0.7,
lightness: 0.6,
threshold: 0.5,
darkLight: 0.4,
paleLight: 0.92
};
Skin.all = allSkins;
Skin.set = function(name, skin) {
if($.isPlainObject(name)) {
$.extend(Skin.all, name, skin);
} else {
Skin.all[name] = skin;
}
$('[data-skin]').skin('paint');
};
$.bindFn('skin', Skin);
$.Skin = Skin;
$(function() {
$('[data-skin]').skin();
});
}(CoreLib, undefined, Math));
/* ========================================================================
* MZUI: ajaxform.js
* https://github.com/easysoft/mzui
* ========================================================================
* Copyright (c) 2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
!(function ($, window, undefined) {
'use strict';
var NAME = 'mzui.ajaxform';
var setAjaxForm = function ($form, options) {
if (!$form.length || $form.data(NAME)) return;
$form.data(NAME, 1);
var callEvent = function (name, data) {
var result;
var event = $.Event(name);
if (!$.isArray(data)) data = [data];
$form.trigger(event, data);
result = event.result;
if (options && $.isFunction(options[name])) {
result = options[name].apply($form, data);
}
return result;
};
var showMessage = function (message) {
var $message = $form.find('.form-message');
if ($message.length) {
var $content = $message.find('.content');
($content.length ? $content : $message).html(message);
$message.show();
} else {
$.messager.warning(message, { time: 10000 });
}
};
$form.on('submit', function (e) {
e.preventDefault();
var form = $form[0];
var _formData = {};
$.each($form.serializeArray(), function (idx, item) {
var _name = item.name,
_val = item.value,
_formVal = _formData[_name];
if (_val instanceof FileList) {
var _fileVal = [];
for (var i = _val.length - 1; i >= 0; --i) {
_fileVal.push(_val[i]);
}
_val = _fileVal;
}
if ($.isArray(_val)) {
if (_formVal === undefined) {
_formVal = _val;
} else if ($.isArray(_formVal)) {
_formVal.push.apply(_formVal, _val);
} else {
_val.push(_formVal);
_formVal = _val;
}
} else if (_name.lastIndexOf(']') === _name.length - 1) {
if (_formVal === undefined) {
_formVal = [_val];
} else {
_formVal.push(_val);
}
} else {
_formVal = _val;
}
_formData[_name] = _formVal;
});
var userSubmitData = callEvent('onSubmit', _formData);
if (userSubmitData === false) return;
if (userSubmitData !== undefined) {
_formData = userSubmitData;
}
if (options.dataConverter) {
_formData = options.dataConverter(_formData);
}
var formData = new FormData();
for (var key in _formData) {
var _val = _formData[key];
if ($.isArray(_val)) {
for (var i = _val.length - 1; i >= 0; --i) {
formData.append(key, _val[i]);
}
} else formData.append(key, _val);
}
var $submitBtn = $form.find('[type="submit"]').attr('disabled', 'disabled').addClass('disabled loading');
$.ajax({
url: options.url || form.action,
type: options.type || form.method,
processData: false,
contentType: false,
dataType: options.dataType || $form.data('type') || 'json',
data: formData,
success: function (response, status) {
var userResponse = callEvent('onResponse', [response, status]);
if (userResponse === false) return;
if (userResponse !== undefined) {
response = userResponse;
}
try {
if (typeof response === 'string') response = $.parseJSON(response);
if (callEvent('onSuccess', response) !== false) {
if (response.result === 'success') {
if (response.message) {
$.messager.success(response.message);
if (response.locate) {
setTimeout(function () { location.href = response.locate; }, 1200);
}
} else {
if (response.locate) location.href = response.locate;
}
} else {
var message = response.message || response.reason || response.error;
if (message) {
if ($.isPlainObject(message)) {
$.each(message, function (msgId, msg) {
if ($.isArray(msg) && msg.length) {
msg = msg.length > 1 ? ('<ul><li>' + msg.join('</li><li>') + '</li></ul>') : msg[0];
}
var $group = $form.find('#' + msgId + ', [name="' + msgId + '"]').closest('.control');
if ($group.length) {
var $msg = $group.find('.help-text');
if (!$msg.length) {
$group.append('<div class="help-text">' + msg + '</div>');
} else {
$msg.html(msg);
}
$group.addClass('has-error');
} else {
showMessage(msg);
}
});
} else {
showMessage(message);
}
}
}
}
} catch (e) {
if (callEvent('onError', ['Error response.']) !== false) {
showMessage(response || 'No response.');
}
}
callEvent('onResult', response);
},
error: function (xhr, errorType, error) {
if (callEvent('onError', [error, errorType, xhr]) !== false) {
showMessage('error: ' + error);
if (window.v && window.v.lang.timeout) {
$.messager.danger(window.v.lang.timeout);
}
}
},
complete: function (xhr, status) {
$submitBtn.attr('disabled', null).removeClass('disabled loading');
callEvent('onComplete', { xhr: xhr, status: status });
}
});
}).on('change', function (e) {
$form.find('.form-message').hide();
$(e.target).closest('.control').removeClass('has-error');
});
callEvent('init');
};
$.ajaxForm = setAjaxForm;
$.fn.ajaxform = function (options) {
return $(this).each(function () {
var $form = $(this);
setAjaxForm($form, $.extend($form.data(), options));
});
};
$(function () { $('.ajaxform').ajaxform(); });
}(CoreLib, window, undefined));