/*======================================================
************ Modals ************
======================================================*/
/*jshint unused: false*/
+function ($) {
"use strict";
var _modalTemplateTempDiv = document.createElement('div');
$.modalStack = [];
$.modalStackClearQueue = function () {
if ($.modalStack.length) {
($.modalStack.shift())();
}
};
$.modal = function (params) {
params = params || {};
var modalHTML = '';
var buttonsHTML = '';
if (params.buttons && params.buttons.length > 0) {
for (var i = 0; i < params.buttons.length; i++) {
buttonsHTML += '' + params.buttons[i].text + '';
}
}
var extraClass = params.extraClass || '';
var titleHTML = params.title ? '
' + params.title + '
' : '';
var textHTML = params.text ? '' + params.text + '
' : '';
var afterTextHTML = params.afterText ? params.afterText : '';
var noButtons = !params.buttons || params.buttons.length === 0 ? 'modal-no-buttons' : '';
var verticalButtons = params.verticalButtons ? 'modal-buttons-vertical' : '';
modalHTML = '';
_modalTemplateTempDiv.innerHTML = modalHTML;
var modal = $(_modalTemplateTempDiv).children();
$(defaults.modalContainer).append(modal[0]);
// Add events on buttons
modal.find('.modal-button').each(function (index, el) {
$(el).on('click', function (e) {
if (params.buttons[index].close !== false) $.closeModal(modal);
if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);
if (params.onClick) params.onClick(modal, index);
});
});
$.openModal(modal);
return modal[0];
};
$.alert = function (text, title, callbackOk) {
if (typeof title === 'function') {
callbackOk = arguments[1];
title = undefined;
}
return $.modal({
text: text || '',
title: typeof title === 'undefined' ? defaults.modalTitle : title,
buttons: [ {text: defaults.modalButtonOk, bold: true, onClick: callbackOk} ]
});
};
$.confirm = function (text, title, callbackOk, callbackCancel) {
if (typeof title === 'function') {
callbackCancel = arguments[2];
callbackOk = arguments[1];
title = undefined;
}
return $.modal({
text: text || '',
title: typeof title === 'undefined' ? defaults.modalTitle : title,
buttons: [
{text: defaults.modalButtonCancel, onClick: callbackCancel},
{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}
]
});
};
$.prompt = function (text, title, callbackOk, callbackCancel) {
if (typeof title === 'function') {
callbackCancel = arguments[2];
callbackOk = arguments[1];
title = undefined;
}
return $.modal({
text: text || '',
title: typeof title === 'undefined' ? defaults.modalTitle : title,
afterText: '',
buttons: [
{
text: defaults.modalButtonCancel
},
{
text: defaults.modalButtonOk,
bold: true
}
],
onClick: function (modal, index) {
if (index === 0 && callbackCancel) callbackCancel($(modal).find('.modal-text-input').val());
if (index === 1 && callbackOk) callbackOk($(modal).find('.modal-text-input').val());
}
});
};
$.modalLogin = function (text, title, callbackOk, callbackCancel) {
if (typeof title === 'function') {
callbackCancel = arguments[2];
callbackOk = arguments[1];
title = undefined;
}
return $.modal({
text: text || '',
title: typeof title === 'undefined' ? defaults.modalTitle : title,
afterText: '',
buttons: [
{
text: defaults.modalButtonCancel
},
{
text: defaults.modalButtonOk,
bold: true
}
],
onClick: function (modal, index) {
var username = $(modal).find('.modal-text-input[name="modal-username"]').val();
var password = $(modal).find('.modal-text-input[name="modal-password"]').val();
if (index === 0 && callbackCancel) callbackCancel(username, password);
if (index === 1 && callbackOk) callbackOk(username, password);
}
});
};
$.modalPassword = function (text, title, callbackOk, callbackCancel) {
if (typeof title === 'function') {
callbackCancel = arguments[2];
callbackOk = arguments[1];
title = undefined;
}
return $.modal({
text: text || '',
title: typeof title === 'undefined' ? defaults.modalTitle : title,
afterText: '',
buttons: [
{
text: defaults.modalButtonCancel
},
{
text: defaults.modalButtonOk,
bold: true
}
],
onClick: function (modal, index) {
var password = $(modal).find('.modal-text-input[name="modal-password"]').val();
if (index === 0 && callbackCancel) callbackCancel(password);
if (index === 1 && callbackOk) callbackOk(password);
}
});
};
$.showPreloader = function (title) {
$.hidePreloader();
$.showPreloader.preloaderModal = $.modal({
title: title || defaults.modalPreloaderTitle,
text: ''
});
return $.showPreloader.preloaderModal;
};
$.hidePreloader = function () {
$.showPreloader.preloaderModal && $.closeModal($.showPreloader.preloaderModal);
};
$.showIndicator = function () {
if ($('.preloader-indicator-modal')[0]) return;
$(defaults.modalContainer).append('
');
};
$.hideIndicator = function () {
$('.preloader-indicator-overlay, .preloader-indicator-modal').remove();
};
// Action Sheet
$.actions = function (params) {
var modal, groupSelector, buttonSelector;
params = params || [];
if (params.length > 0 && !$.isArray(params[0])) {
params = [params];
}
var modalHTML;
var buttonsHTML = '';
for (var i = 0; i < params.length; i++) {
for (var j = 0; j < params[i].length; j++) {
if (j === 0) buttonsHTML += '';
var button = params[i][j];
var buttonClass = button.label ? 'actions-modal-label' : 'actions-modal-button';
if (button.bold) buttonClass += ' actions-modal-button-bold';
if (button.color) buttonClass += ' color-' + button.color;
if (button.bg) buttonClass += ' bg-' + button.bg;
if (button.disabled) buttonClass += ' disabled';
buttonsHTML += '' + button.text + '';
if (j === params[i].length - 1) buttonsHTML += '
';
}
}
modalHTML = '' + buttonsHTML + '
';
_modalTemplateTempDiv.innerHTML = modalHTML;
modal = $(_modalTemplateTempDiv).children();
$(defaults.modalContainer).append(modal[0]);
groupSelector = '.actions-modal-group';
buttonSelector = '.actions-modal-button';
var groups = modal.find(groupSelector);
groups.each(function (index, el) {
var groupIndex = index;
$(el).children().each(function (index, el) {
var buttonIndex = index;
var buttonParams = params[groupIndex][buttonIndex];
var clickTarget;
if ($(el).is(buttonSelector)) clickTarget = $(el);
// if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);
if (clickTarget) {
clickTarget.on('click', function (e) {
if (buttonParams.close !== false) $.closeModal(modal);
if (buttonParams.onClick) buttonParams.onClick(modal, e);
});
}
});
});
$.openModal(modal);
return modal[0];
};
$.popup = function (modal, removeOnClose) {
if (typeof removeOnClose === 'undefined') removeOnClose = true;
if (typeof modal === 'string' && modal.indexOf('<') >= 0) {
var _modal = document.createElement('div');
_modal.innerHTML = modal.trim();
if (_modal.childNodes.length > 0) {
modal = _modal.childNodes[0];
if (removeOnClose) modal.classList.add('remove-on-close');
$(defaults.modalContainer).append(modal);
}
else return false; //nothing found
}
modal = $(modal);
if (modal.length === 0) return false;
modal.show();
modal.find(".content").scroller("refresh");
if (modal.find('.' + defaults.viewClass).length > 0) {
$.sizeNavbars(modal.find('.' + defaults.viewClass)[0]);
}
$.openModal(modal);
return modal[0];
};
$.pickerModal = function (pickerModal, removeOnClose) {
if (typeof removeOnClose === 'undefined') removeOnClose = true;
if (typeof pickerModal === 'string' && pickerModal.indexOf('<') >= 0) {
pickerModal = $(pickerModal);
if (pickerModal.length > 0) {
if (removeOnClose) pickerModal.addClass('remove-on-close');
$(defaults.modalContainer).append(pickerModal[0]);
}
else return false; //nothing found
}
pickerModal = $(pickerModal);
if (pickerModal.length === 0) return false;
pickerModal.show();
$.openModal(pickerModal);
return pickerModal[0];
};
$.loginScreen = function (modal) {
if (!modal) modal = '.login-screen';
modal = $(modal);
if (modal.length === 0) return false;
modal.show();
if (modal.find('.' + defaults.viewClass).length > 0) {
$.sizeNavbars(modal.find('.' + defaults.viewClass)[0]);
}
$.openModal(modal);
return modal[0];
};
//显示一个消息,会在2秒钟后自动消失
$.toast = function(msg, duration, extraclass) {
var $toast = $('').appendTo(document.body);
$.openModal($toast, function(){
setTimeout(function() {
$.closeModal($toast);
}, duration || 2000);
});
};
$.openModal = function (modal, cb) {
modal = $(modal);
var isModal = modal.hasClass('modal'),
isNotToast = !modal.hasClass('toast');
if ($('.modal.modal-in:not(.modal-out)').length && defaults.modalStack && isModal && isNotToast) {
$.modalStack.push(function () {
$.openModal(modal, cb);
});
return;
}
var isPopup = modal.hasClass('popup');
var isLoginScreen = modal.hasClass('login-screen');
var isPickerModal = modal.hasClass('picker-modal');
var isToast = modal.hasClass('toast');
if (isModal) {
modal.show();
modal.css({
marginTop: - Math.round(modal.outerHeight() / 2) + 'px'
});
}
if (isToast) {
modal.css({
marginLeft: - Math.round(modal.outerWidth() / 2 / 1.185) + 'px' //1.185 是初始化时候的放大效果
});
}
var overlay;
if (!isLoginScreen && !isPickerModal && !isToast) {
if ($('.modal-overlay').length === 0 && !isPopup) {
$(defaults.modalContainer).append('');
}
if ($('.popup-overlay').length === 0 && isPopup) {
$(defaults.modalContainer).append('');
}
overlay = isPopup ? $('.popup-overlay') : $('.modal-overlay');
}
//Make sure that styles are applied, trigger relayout;
var clientLeft = modal[0].clientLeft;
// Trugger open event
modal.trigger('open');
// Picker modal body class
if (isPickerModal) {
$(defaults.modalContainer).addClass('with-picker-modal');
}
// Classes for transition in
if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('modal-overlay-visible');
modal.removeClass('modal-out').addClass('modal-in').transitionEnd(function (e) {
if (modal.hasClass('modal-out')) modal.trigger('closed');
else modal.trigger('opened');
});
// excute callback
if (typeof cb === 'function') {
cb.call(this);
}
return true;
};
$.closeModal = function (modal) {
modal = $(modal || '.modal-in');
if (typeof modal !== 'undefined' && modal.length === 0) {
return;
}
var isModal = modal.hasClass('modal'),
isPopup = modal.hasClass('popup'),
isToast = modal.hasClass('toast'),
isLoginScreen = modal.hasClass('login-screen'),
isPickerModal = modal.hasClass('picker-modal'),
removeOnClose = modal.hasClass('remove-on-close'),
overlay = isPopup ? $('.popup-overlay') : $('.modal-overlay');
if (isPopup){
if (modal.length === $('.popup.modal-in').length) {
overlay.removeClass('modal-overlay-visible');
}
}
else if (!(isPickerModal || isToast)) {
overlay.removeClass('modal-overlay-visible');
}
modal.trigger('close');
// Picker modal body class
if (isPickerModal) {
$(defaults.modalContainer).removeClass('with-picker-modal');
$(defaults.modalContainer).addClass('picker-modal-closing');
}
modal.removeClass('modal-in').addClass('modal-out').transitionEnd(function (e) {
if (modal.hasClass('modal-out')) modal.trigger('closed');
else modal.trigger('opened');
if (isPickerModal) {
$(defaults.modalContainer).removeClass('picker-modal-closing');
}
if (isPopup || isLoginScreen || isPickerModal) {
modal.removeClass('modal-out').hide();
if (removeOnClose && modal.length > 0) {
modal.remove();
}
}
else {
modal.remove();
}
});
if (isModal && defaults.modalStack ) {
$.modalStackClearQueue();
}
return true;
};
function handleClicks(e) {
/*jshint validthis:true */
var clicked = $(this);
var url = clicked.attr('href');
//Collect Clicked data- attributes
var clickedData = clicked.dataset();
// Popup
var popup;
if (clicked.hasClass('open-popup')) {
if (clickedData.popup) {
popup = clickedData.popup;
}
else popup = '.popup';
$.popup(popup);
}
if (clicked.hasClass('close-popup')) {
if (clickedData.popup) {
popup = clickedData.popup;
}
else popup = '.popup.modal-in';
$.closeModal(popup);
}
// Close Modal
if (clicked.hasClass('modal-overlay')) {
if ($('.modal.modal-in').length > 0 && defaults.modalCloseByOutside)
$.closeModal('.modal.modal-in');
if ($('.actions-modal.modal-in').length > 0 && defaults.actionsCloseByOutside)
$.closeModal('.actions-modal.modal-in');
}
if (clicked.hasClass('popup-overlay')) {
if ($('.popup.modal-in').length > 0 && defaults.popupCloseByOutside)
$.closeModal('.popup.modal-in');
}
}
$(document).on('click', ' .modal-overlay, .popup-overlay, .close-popup, .open-popup, .close-picker', handleClicks);
var defaults = $.modal.prototype.defaults = {
modalStack: true,
modalButtonOk: '确定',
modalButtonCancel: '取消',
modalPreloaderTitle: '加载中',
modalContainer : document.body ? document.body : 'body'
};
}(Zepto);