/*
 * jQuery Impromptu
 * By: Trent Richardson [http://trentrichardson.com]
 * Version 2.8
 * Last Modified: 12/18/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 || 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)-400)
            //,marginLeft: (0)
});};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',buttons:{Ok:false},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();});};})(jQuery);
