/* * jQuery Impromptu * By: Trent Richardson [http://trentrichardson.com] * Version 3.0 * Last Modified: 2/15/2010 * * Copyright 2010 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); options.classes = $.trim(options.classes); if (options.classes != '') options.classes = ' ' + options.classes; var msgbox = '
'; 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 += ' '; }); $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 || typeof forminputs[obj.name] == 'object') { 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) { fadeClicked(); } 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(); if (options.timeout > 0) setTimeout($.prompt.close, options.timeout); return $jqib; }; $.prompt.defaults = { prefix : 'jqi', classes : '', 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, timeout : 0, 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.getCurrentState = function() { return $('.' + $.prompt.currentPrefix + '_state:visible'); }; $.prompt.getCurrentStateName = function() { var stateid = $.prompt.getCurrentState().attr('id'); return stateid.replace($.prompt.currentPrefix + '_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(); }); }; $.fn.prompt = function(options) { if (options == undefined) options = {}; if (options.withDataAndEvents == undefined) options.withDataAndEvents = false; $.prompt($(this).clone(withDataAndEvents).html(), options); } })(jQuery);