/*
* jQuery Impromptu
* By: Trent Richardson [http://trentrichardson.com]
* Version 2.6
* Last Modified: 5/26/2009
* 
* Copyright 2009 Trent Richardson
* Dual licensed under the MIT and GPL licenses.
* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
* 
*/
(function($) { $.prompt = function(message, options) { options = $.extend({}, $.prompt.defaults, options); $.prompt.currentPrefix = options.prefix; var ie6 = ($.browser.msie && $.browser.version < 7); var $body = $(document.body); var $window = $(window); var msgbox = '<div class="' + options.prefix + 'box" id="' + options.prefix + 'box">'; if (options.useiframe && (($('object, applet').length > 0) || ie6)) { msgbox += '<iframe src="javascript:false;" style="display:block;position:absolute;z-index:-1;" class="' + options.prefix + 'fade" id="' + options.prefix + 'fade"></iframe>'; } else { if (ie6) { $('select').css('visibility', 'hidden'); } msgbox += '<div class="' + options.prefix + 'fade" id="' + options.prefix + 'fade"></div>'; } msgbox += '<div class="' + options.prefix + '" id="' + options.prefix + '"><div class="' + options.prefix + 'container"><div class="'; msgbox += options.prefix + 'close">X</div><div id="' + options.prefix + 'states"></div>'; msgbox += '</div></div></div>'; var $jqib = $(msgbox).appendTo($body); var $jqi = $jqib.children('#' + options.prefix); var $jqif = $jqib.children('#' + options.prefix + 'fade'); if (message.constructor == String) { message = { state0: { html: message, buttons: options.buttons, focus: options.focus, submit: options.submit} }; } var states = ""; $.each(message, function(statename, stateobj) { stateobj = $.extend({}, $.prompt.defaults.state, stateobj); message[statename] = stateobj; states += '<div id="' + options.prefix + '_state_' + statename + '" class="' + options.prefix + '_state" style="display:none;"><div class="' + options.prefix + 'message">' + stateobj.html + '</div><div class="' + options.prefix + 'buttons">'; $.each(stateobj.buttons, function(k, v) { states += '<button name="' + options.prefix + '_' + statename + '_button' + k + '" id="' + options.prefix + '_' + statename + '_button' + k + '" value="' + v + '">' + k + '</button>'; }); states += '</div></div>'; }); $jqi.find('#' + options.prefix + 'states').html(states).children('.' + options.prefix + '_state:first').css('display', 'block'); $jqi.find('.' + options.prefix + 'buttons:empty').css('display', 'none'); $.each(message, function(statename, stateobj) { var $state = $jqi.find('#' + options.prefix + '_state_' + statename); $state.children('.' + options.prefix + 'buttons').children('button').click(function() { var msg = $state.children('.' + options.prefix + 'message'); var clicked = stateobj.buttons[$(this).text()]; var forminputs = {}; $.each($jqi.find('#' + options.prefix + 'states :input').serializeArray(), function(i, obj) { if (forminputs[obj.name] === undefined) { forminputs[obj.name] = obj.value; } else if (typeof forminputs[obj.name] == Array) { forminputs[obj.name].push(obj.value); } else { forminputs[obj.name] = [forminputs[obj.name], obj.value]; } }); var close = stateobj.submit(clicked, msg, forminputs); if (close === undefined || close) { removePrompt(true, clicked, msg, forminputs); } }); $state.find('.' + options.prefix + 'buttons button:eq(' + stateobj.focus + ')').addClass(options.prefix + 'defaultbutton'); }); var ie6scroll = function() { $jqib.css({ top: $window.scrollTop() }); }; var fadeClicked = function() { if (options.persistent) { var i = 0; $jqib.addClass(options.prefix + 'warning'); var intervalid = setInterval(function() { $jqib.toggleClass(options.prefix + 'warning'); if (i++ > 1) { clearInterval(intervalid); $jqib.removeClass(options.prefix + 'warning'); } }, 100); } else { removePrompt(); } }; var keyPressEventHandler = function(e) { var key = (window.event) ? event.keyCode : e.keyCode; if (key == 27) { removePrompt(); } if (key == 9) { var $inputels = $(':input:enabled:visible', $jqib); var fwd = !e.shiftKey && e.target == $inputels[$inputels.length - 1]; var back = e.shiftKey && e.target == $inputels[0]; if (fwd || back) { setTimeout(function() { if (!$inputels) return; var el = $inputels[back === true ? $inputels.length - 1 : 0]; if (el) el.focus(); }, 10); return false; } } }; var positionPrompt = function() { $jqib.css({ position: (ie6) ? "absolute" : "fixed", height: $window.height(), width: "100%", top: (ie6) ? $window.scrollTop() : 0, left: 0, right: 0, bottom: 0 }); $jqif.css({ position: "absolute", height: $window.height(), width: "100%", top: 0, left: 0, right: 0, bottom: 0 }); $jqi.css({ position: "absolute", top: options.top, left: "50%", marginLeft: (($jqi.outerWidth() / 2) * -1) }); }; var stylePrompt = function() { $jqif.css({ zIndex: options.zIndex, display: "none", opacity: options.opacity }); $jqi.css({ zIndex: options.zIndex + 1, display: "none" }); $jqib.css({ zIndex: options.zIndex }); }; var removePrompt = function(callCallback, clicked, msg, formvals) { $jqi.remove(); if (ie6) { $body.unbind('scroll', ie6scroll); } $window.unbind('resize', positionPrompt); $jqif.fadeOut(options.overlayspeed, function() { $jqif.unbind('click', fadeClicked); $jqif.remove(); if (callCallback) { options.callback(clicked, msg, formvals); } $jqib.unbind('keypress', keyPressEventHandler); $jqib.remove(); if (ie6 && !options.useiframe) { $('select').css('visibility', 'visible'); } }); }; positionPrompt(); stylePrompt(); if (ie6) { $window.scroll(ie6scroll); } $jqif.click(fadeClicked); $window.resize(positionPrompt); $jqib.bind("keydown keypress", keyPressEventHandler); $jqi.find('.' + options.prefix + 'close').click(removePrompt); $jqif.fadeIn(options.overlayspeed); $jqi[options.show](options.promptspeed, options.loaded); $jqi.find('#' + options.prefix + 'states .' + options.prefix + '_state:first .' + options.prefix + 'defaultbutton').focus(); return $jqib; }; $.prompt.defaults = { prefix: 'jqi', buttons: { Ok: true }, loaded: function() { }, submit: function() { return true; }, callback: function() { }, opacity: 0.6, zIndex: 999, overlayspeed: 'slow', promptspeed: 'fast', show: 'fadeIn', focus: 0, useiframe: false, top: "15%", persistent: true, state: { html: '', buttons: { Ok: true }, focus: 0, submit: function() { return true; } } }; $.prompt.currentPrefix = $.prompt.defaults.prefix; $.prompt.setDefaults = function(o) { $.prompt.defaults = $.extend({}, $.prompt.defaults, o); }; $.prompt.setStateDefaults = function(o) { $.prompt.defaults.state = $.extend({}, $.prompt.defaults.state, o); }; $.prompt.getStateContent = function(state) { return $('#' + $.prompt.currentPrefix + '_state_' + state); }; $.prompt.goToState = function(state) { $('.' + $.prompt.currentPrefix + '_state').slideUp('slow'); $('#' + $.prompt.currentPrefix + '_state_' + state).slideDown('slow', function() { $(this).find('.' + $.prompt.currentPrefix + 'defaultbutton').focus(); }); }; $.prompt.nextState = function() { var $next = $('.' + $.prompt.currentPrefix + '_state:visible').next(); $('.' + $.prompt.currentPrefix + '_state').slideUp('slow'); $next.slideDown('slow', function() { $next.find('.' + $.prompt.currentPrefix + 'defaultbutton').focus(); }); }; $.prompt.prevState = function() { var $next = $('.' + $.prompt.currentPrefix + '_state:visible').prev(); $('.' + $.prompt.currentPrefix + '_state').slideUp('slow'); $next.slideDown('slow', function() { $next.find('.' + $.prompt.currentPrefix + 'defaultbutton').focus(); }); }; $.prompt.close = function() { $('#' + $.prompt.currentPrefix + 'box').fadeOut('fast', function() { $(this).remove(); }); }; })(jQuery);
