/*====================================================== ************ 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 ? '' : ''; var textHTML = 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);