var MyModal = Class.create(); MyModal.prototype = { initialize: function(options) { this.options = { overlay: 50, overlayCss: {}, containerCss: {}, close: true, closeTitle: 'Close', onOpen: null, onShow: null, onClose: null, onBeforeClose: null, type: 'string', width: '630', buttons: '', title: '', formId: 'modal_form', }; Object.extend(this.options, options || {}); this.generateModal(); }, displayModal: function(data) { // handle ACP session timeout and other error if(data == "login") { window.location = "./index.php"; return; } this.hideLoader(); modalContent = ''; // Doesn't work in IE6 or below modalContent = '
'; if(data.indexOf('ModalTitle') > 0 && data.indexOf('ModalContent') > 0) { modalContent += '
'+data+'
'; } else { modalContent += '
'+this.options.title+'
'+data+'
'+this.options.buttons+'
'; } // Doesn't work in IE6 or below cssPosition = 'fixed'; var container = document.createElement('div'); container.id = 'ModalContainer'; container.className = 'ModalContainer'; container.style.width = this.options.width+'px'; container.style.position = cssPosition; container.style.zIndex = 3100; container.style.marginLeft = '-'+(this.options.width/2)+'px'; var modalData = document.createElement('div'); modalData.className = 'modalData'; modalData.innerHTML = modalContent; container.appendChild(modalData); // Insert into the body owner = document.getElementsByTagName("body").item(0); owner.appendChild(container); // Observe the escape buttons! Event.observe("modalClose", 'click', this.close.bind(this)); Event.observe("modalCancel", 'click', this.close.bind(this)); Event.observe("modalSubmit", 'click', this.submit.bind(this)); if(MyBB.browser == "ie" || MyBB.browser == "opera" || MyBB.browser == "safari" || MyBB.browser == "chrome") { var scripts = data.extractScripts(); scripts.each(function(script) { eval(script); }); } else { data.evalScripts(); } $('ModalContainer').show(); }, showLoader: function() { this.loader = document.createElement('div'); this.loader.id = 'ModalLoadingIndicator'; // Insert into the body Element.insert(document.body, { 'after': this.loader }); }, showOverlayLoader: function() { this.overlayLoader = document.createElement('div'); this.overlayLoader.id = 'ModalOverlay'; this.overlayLoader.className = 'ModalOverlay'; this.overlayLoader.style.height = '100%'; this.overlayLoader.style.width = '100%'; this.overlayLoader.style.position = 'fixed'; this.overlayLoader.style.left = 0; this.overlayLoader.style.top = 0; this.overlayLoader.style.zIndex = 3000; Element.insert(document.body, { 'after': this.overlayLoader }); // Insert into the body // Opacity if(MyBB.browser != "ie") { $("ModalOverlay").style.opacity = this.options.overlay / 100; } else { // IE 8 and IE 9 does this nicely - IE 7 ignores $("ModalOverlay").setStyle( { opacity: this.options.overlay / 100 }); } this.showLoader(); }, hideOverlayLoader: function() { $('ModalLoadingIndicator').remove(); $('ModalOverlay').remove(); }, hideLoader: function() { $('ModalLoadingIndicator').remove(); }, generateModal: function() { this.showOverlayLoader(); Event.observe(document, 'keypress', this.closeListener.bindAsEventListener(this)); if(this.options.type == 'ajax') { new Ajax.Request(this.options.url, { method: 'get', parameters: { time: new Date().getTime() }, onComplete: function(request) { this.displayModal(request.responseText); }.bind(this) }); } else { this.displayModal(this.options.data); } }, submit: function(e) { Event.stop(e); this.showOverlayLoader(); var postData = $(this.options.formId).serialize(); this.postData = $(this.options.formId).serialize(true); new Ajax.Request(this.options.url, { method: 'post', postBody: postData+"&ajax=1&time=" + new Date().getTime(), onComplete: this.onComplete.bind(this), }); }, onComplete: function(request) { var data = request.responseText; if(MyBB.browser == "ie" || MyBB.browser == "opera" || MyBB.browser == "safari" || MyBB.browser == "chrome") { var scripts = data.extractScripts(); scripts.each(function(script) { eval(script); }); } else { data.evalScripts(); } this.hideOverlayLoader(); this.close(); }, closeListener: function(e) { if(e.keyCode == 27) { this.close(); } return false; }, close: function(e) { if(e) { Event.stop(e); } $('ModalContainer').remove(); if($('ModalLoadingIndicator')) { $('ModalLoadingIndicator').remove(); } // ModalContentContainer if($('ModalOverlay')) { $('ModalOverlay').remove(); } } };