| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863 | 
							- /*! jQuery-Impromptu - v6.0.0 - 2014-12-27
 - * http://trentrichardson.com/Impromptu
 - * Copyright (c) 2014 Trent Richardson; Licensed MIT */
 - (function(root, factory) {
 - 	if (typeof define === 'function' && define.amd) {
 - 		define(['jquery'], factory);
 - 	} else {
 - 		factory(root.jQuery);
 - 	}
 - }(this, function($) {
 - 	'use strict';
 - 
 - 	// ########################################################################
 - 	// Base object
 - 	// ########################################################################
 - 
 - 	/**
 - 	* Imp - Impromptu object - passing no params will not open, only return the instance
 - 	* @param message String/Object - String of html or Object of states
 - 	* @param options Object - Options to set the prompt
 - 	* @return Imp - the instance of this Impromptu object
 - 	*/
 - 	var Imp = function(message, options){
 - 		var t = this;
 - 		t.id = Imp.count++;
 - 
 - 		Imp.lifo.push(t);
 - 
 - 		if(message){
 - 			t.open(message, options);
 - 		}
 - 		return t;
 - 	};
 - 
 - 	// ########################################################################
 - 	// static properties and methods
 - 	// ########################################################################
 - 
 - 	/**
 - 	* defaults - the default options
 - 	*/
 - 	Imp.defaults = {
 - 		prefix:'jqi',
 - 		classes: {
 - 			box: '',
 - 			fade: '',
 - 			prompt: '',
 - 			form: '',
 - 			close: '',
 - 			title: '',
 - 			message: '',
 - 			buttons: '',
 - 			button: '',
 - 			defaultButton: ''
 - 		},
 - 		title: '',
 - 		closeText: '×',
 - 		buttons: {
 - 			Ok: true
 - 		},
 - 		loaded: function(e){},
 - 		submit: function(e,v,m,f){},
 - 		close: function(e,v,m,f){},
 - 		statechanging: function(e, from, to){},
 - 		statechanged: function(e, to){},
 - 		opacity: 0.6,
 - 		zIndex: 999,
 - 		overlayspeed: 'slow',
 - 		promptspeed: 'fast',
 - 		show: 'fadeIn',
 - 		hide: 'fadeOut',
 - 		focus: 0,
 - 		defaultButton: 0,
 - 		useiframe: false,
 - 		top: '15%',
 - 		position: {
 - 			container: null,
 - 			x: null,
 - 			y: null,
 - 			arrow: null,
 - 			width: null
 - 		},
 - 		persistent: true,
 - 		timeout: 0,
 - 		states: {},
 - 		state: {
 - 			name: null,
 - 			title: '',
 - 			html: '',
 - 			buttons: {
 - 				Ok: true
 - 			},
 - 			focus: 0,
 - 			defaultButton: 0,
 - 			position: {
 - 				container: null,
 - 				x: null,
 - 				y: null,
 - 				arrow: null,
 - 				width: null
 - 			},
 - 			submit: function(e,v,m,f){
 - 				return true;
 - 			}
 - 		}
 - 	};
 - 
 - 	/**
 - 	* setDefaults - Sets the default options
 - 	* @param o Object - Options to set as defaults
 - 	* @return void
 - 	*/
 - 	Imp.setDefaults = function(o) {
 - 		Imp.defaults = $.extend({}, Imp.defaults, o);
 - 	};
 - 
 - 	/**
 - 	* setStateDefaults - Sets the default options for a state
 - 	* @param o Object - Options to set as defaults
 - 	* @return void
 - 	*/
 - 	Imp.setStateDefaults = function(o) {
 - 		Imp.defaults.state = $.extend({}, Imp.defaults.state, o);
 - 	};
 - 
 - 	/**
 - 	* @var Int - A counter used to provide a unique ID for new prompts
 - 	*/
 - 	Imp.count = 0;
 - 
 - 	/**
 - 	* @var Array - An array of Impromptu intances in a LIFO queue (last in first out)
 - 	*/
 - 	Imp.lifo = [];
 - 
 - 	/**
 - 	* getLast - get the last element from the queue (doesn't pop, just returns)
 - 	* @return Imp - the instance of this Impromptu object or false if queue is empty
 - 	*/
 - 	Imp.getLast = function(){
 - 		var l = Imp.lifo.length;
 - 		return (l > 0)? Imp.lifo[l-1] : false;
 - 	};
 - 
 - 	/**
 - 	* removeFromStack - remove an element from the lifo stack by its id
 - 	* @param id int - id of the instance to remove
 - 	* @return api - The api of the element removed from the stack or void
 - 	*/
 - 	Imp.removeFromStack = function(id){
 - 		for(var i=Imp.lifo.length-1; i>=0; i--){
 - 			if(Imp.lifo[i].id === id){
 - 				return Imp.lifo.splice(i,1)[0];
 - 			}
 - 		}
 - 	};
 - 
 - 	// ########################################################################
 - 	// extend our object instance properties and methods
 - 	// ########################################################################
 - 	Imp.prototype = {
 - 
 - 		/**
 - 		* @var Int - A unique id, simply an autoincremented number
 - 		*/
 - 		id: null,
 - 
 - 		/**
 - 		* open - Opens the prompt
 - 		* @param message String/Object - String of html or Object of states
 - 		* @param options Object - Options to set the prompt
 - 		* @return Imp - the instance of this Impromptu object
 - 		*/
 - 		open: function(message, options) {
 - 			var t = this;
 - 
 - 			t.options = $.extend({},Imp.defaults,options);
 - 
 - 			// Be sure any previous timeouts are destroyed
 - 			if(t.timeout){
 - 				clearTimeout(t.timeout);
 - 			}
 - 			t.timeout = false;
 - 
 - 			var opts = t.options,
 - 				$body = $(document.body),
 - 				$window = $(window);
 - 
 - 			//build the box and fade
 - 			var msgbox = '<div class="'+ opts.prefix +'box '+ opts.classes.box +'">';
 - 			if(opts.useiframe && ($('object, applet').length > 0)) {
 - 				msgbox += '<iframe src="javascript:false;" style="display:block;position:absolute;z-index:-1;" class="'+ opts.prefix +'fade '+ opts.classes.fade +'"></iframe>';
 - 			} else {
 - 				msgbox += '<div class="'+ opts.prefix +'fade '+ opts.classes.fade +'"></div>';
 - 			}
 - 			msgbox += '<div class="'+ opts.prefix +' '+ opts.classes.prompt +'">'+
 - 						'<form action="javascript:false;" onsubmit="return false;" class="'+ opts.prefix +'form '+ opts.classes.form +'">'+
 - 							'<div class="'+ opts.prefix +'close '+ opts.classes.close +'">'+ opts.closeText +'</div>'+
 - 							'<div class="'+ opts.prefix +'states"></div>'+
 - 						'</form>'+
 - 					'</div>'+
 - 				'</div>';
 - 
 - 			t.jqib = $(msgbox).appendTo($body);
 - 			t.jqi = t.jqib.children('.'+ opts.prefix);
 - 			t.jqif = t.jqib.children('.'+ opts.prefix +'fade');
 - 
 - 			//if a string was passed, convert to a single state
 - 			if(message.constructor === String){
 - 				message = {
 - 					state0: {
 - 						title: opts.title,
 - 						html: message,
 - 						buttons: opts.buttons,
 - 						position: opts.position,
 - 						focus: opts.focus,
 - 						defaultButton: opts.defaultButton,
 - 						submit: opts.submit
 - 					}
 - 				};
 - 			}
 - 
 - 			//build the states
 - 			t.options.states = {};
 - 			var k,v;
 - 			for(k in message){
 - 				v = $.extend({},Imp.defaults.state,{name:k},message[k]);
 - 				t.addState(v.name, v);
 - 
 - 				if(t.currentStateName === ''){
 - 					t.currentStateName = v.name;
 - 				}
 - 			}
 - 
 - 			//Events
 - 			t.jqi.on('click', '.'+ opts.prefix +'buttons button', function(e){
 - 				var $t = $(this),
 - 					$state = $t.parents('.'+ opts.prefix +'state'),
 - 					stateobj = t.options.states[$state.data('jqi-name')],
 - 					msg = $state.children('.'+ opts.prefix +'message'),
 - 					clicked = stateobj.buttons[$t.text()] || stateobj.buttons[$t.html()],
 - 					forminputs = {};
 - 
 - 				// if for some reason we couldn't get the value
 - 				if(clicked === undefined){
 - 					for(var i in stateobj.buttons){
 - 						if(stateobj.buttons[i].title === $t.text() || stateobj.buttons[i].title === $t.html()){
 - 							clicked = stateobj.buttons[i].value;
 - 						}
 - 					}
 - 				}
 - 
 - 				//collect all form element values from all states.
 - 				$.each(t.jqi.children('form').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];
 - 					}
 - 				});
 - 
 - 				// trigger an event
 - 				var promptsubmite = new $.Event('impromptu:submit');
 - 				promptsubmite.stateName = stateobj.name;
 - 				promptsubmite.state = $state;
 - 				$state.trigger(promptsubmite, [clicked, msg, forminputs]);
 - 
 - 				if(!promptsubmite.isDefaultPrevented()){
 - 					t.close(true, clicked,msg,forminputs);
 - 				}
 - 			});
 - 
 - 			// if the fade is clicked blink the prompt
 - 			var fadeClicked = function(){
 - 				if(opts.persistent){
 - 					var offset = (opts.top.toString().indexOf('%') >= 0? ($window.height()*(parseInt(opts.top,10)/100)) : parseInt(opts.top,10)),
 - 						top = parseInt(t.jqi.css('top').replace('px',''),10) - offset;
 - 
 - 					//$window.scrollTop(top);
 - 					$('html,body').animate({ scrollTop: top }, 'fast', function(){
 - 						var i = 0;
 - 						t.jqib.addClass(opts.prefix +'warning');
 - 						var intervalid = setInterval(function(){
 - 							t.jqib.toggleClass(opts.prefix +'warning');
 - 							if(i++ > 1){
 - 								clearInterval(intervalid);
 - 								t.jqib.removeClass(opts.prefix +'warning');
 - 							}
 - 						}, 100);
 - 					});
 - 				}
 - 				else {
 - 					t.close(true);
 - 				}
 - 			};
 - 
 - 			// listen for esc or tab keys
 - 			var keyDownEventHandler = function(e){
 - 				var key = (window.event) ? event.keyCode : e.keyCode;
 - 
 - 				//escape key closes
 - 				if(key === 27) {
 - 					fadeClicked();
 - 				}
 - 
 - 				//enter key pressed trigger the default button if its not on it, ignore if it is a textarea
 - 				if(key === 13){
 - 					var $defBtn = t.getCurrentState().find('.'+ opts.prefix +'defaultbutton');
 - 					var $tgt = $(e.target);
 - 
 - 					if($tgt.is('textarea,.'+opts.prefix+'button') === false && $defBtn.length > 0){
 - 						e.preventDefault();
 - 						$defBtn.click();
 - 					}
 - 				}
 - 
 - 				//constrain tabs, tabs should iterate through the state and not leave
 - 				if (key === 9){
 - 					var $inputels = $('input,select,textarea,button',t.getCurrentState());
 - 					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;
 - 					}
 - 				}
 - 			};
 - 
 - 			t.position();
 - 			t.style();
 - 
 - 			// store copy of the window resize function for interal use only
 - 			t._windowResize = function(e){
 - 				t.position(e);
 - 			};
 - 			$window.resize({ animate: false }, t._windowResize);
 - 
 - 			t.jqif.click(fadeClicked);
 - 			t.jqi.find('.'+ opts.prefix +'close').click(function(){ t.close(); });
 - 			t.jqib.on("keydown",keyDownEventHandler)
 - 						.on('impromptu:loaded', opts.loaded)
 - 						.on('impromptu:close', opts.close)
 - 						.on('impromptu:statechanging', opts.statechanging)
 - 						.on('impromptu:statechanged', opts.statechanged);
 - 
 - 			// Show it
 - 			t.jqif[opts.show](opts.overlayspeed);
 - 			t.jqi[opts.show](opts.promptspeed, function(){
 - 
 - 				var $firstState = t.jqi.find('.'+ opts.prefix +'states .'+ opts.prefix +'state').eq(0);
 - 				t.goToState($firstState.data('jqi-name'));
 - 
 - 				t.jqib.trigger('impromptu:loaded');
 - 			});
 - 
 - 			// Timeout
 - 			if(opts.timeout > 0){
 - 				t.timeout = setTimeout(function(){ t.close(true); },opts.timeout);
 - 			}
 - 
 - 			return t;
 - 		},
 - 
 - 		/**
 - 		* close - Closes the prompt
 - 		* @param callback Function - called when the transition is complete
 - 		* @param clicked String - value of the button clicked (only used internally)
 - 		* @param msg jQuery - The state message body (only used internally)
 - 		* @param forvals Object - key/value pairs of all form field names and values (only used internally)
 - 		* @return Imp - the instance of this Impromptu object
 - 		*/
 - 		close: function(callCallback, clicked, msg, formvals){
 - 			var t = this;
 - 			Imp.removeFromStack(t.id);
 - 
 - 			if(t.timeout){
 - 				clearTimeout(t.timeout);
 - 				t.timeout = false;
 - 			}
 - 
 - 			if(t.jqib){
 - 				t.jqib[t.options.hide]('fast',function(){
 - 					
 - 					t.jqib.trigger('impromptu:close', [clicked,msg,formvals]);
 - 					
 - 					t.jqib.remove();
 - 					
 - 					$(window).off('resize', t._windowResize);
 - 
 - 					if(typeof callCallback === 'function'){
 - 						callCallback();
 - 					}
 - 				});
 - 			}
 - 			t.currentStateName = "";
 - 
 - 			return t;
 - 		},
 - 
 - 		/**
 - 		* addState - Injects a state into the prompt
 - 		* @param statename String - Name of the state
 - 		* @param stateobj Object - options for the state
 - 		* @param afterState String - selector of the state to insert after
 - 		* @return jQuery - the newly created state
 - 		*/
 - 		addState: function(statename, stateobj, afterState) {
 - 			var t = this,
 - 				state = '',
 - 				$state = null,
 - 				arrow = '',
 - 				title = '',
 - 				opts = t.options,
 - 				$jqistates = $('.'+ opts.prefix +'states'),
 - 				buttons = [],
 - 				showHtml,defbtn,k,v,l,i=0;
 - 
 - 			stateobj = $.extend({},Imp.defaults.state, {name:statename}, stateobj);
 - 
 - 			if(stateobj.position.arrow !== null){
 - 				arrow = '<div class="'+ opts.prefix + 'arrow '+ opts.prefix + 'arrow'+ stateobj.position.arrow +'"></div>';
 - 			}
 - 			if(stateobj.title && stateobj.title !== ''){
 - 				title = '<div class="lead '+ opts.prefix + 'title '+ opts.classes.title +'">'+  stateobj.title +'</div>';
 - 			}
 - 
 - 			showHtml = stateobj.html;
 - 			if (typeof stateobj.html === 'function') {
 - 				showHtml = 'Error: html function must return text';
 - 			}
 - 
 - 			state += '<div class="'+ opts.prefix + 'state" data-jqi-name="'+ statename +'" style="display:none;">'+
 - 						arrow + title +
 - 						'<div class="'+ opts.prefix +'message '+ opts.classes.message +'">' + showHtml +'</div>'+
 - 						'<div class="'+ opts.prefix +'buttons '+ opts.classes.buttons +'"'+ ($.isEmptyObject(stateobj.buttons)? 'style="display:none;"':'') +'>';
 - 
 - 			// state buttons may be in object or array, lets convert objects to arrays
 - 			if($.isArray(stateobj.buttons)){
 - 				buttons = stateobj.buttons;
 - 			}
 - 			else if($.isPlainObject(stateobj.buttons)){
 - 				for(k in stateobj.buttons){
 - 					if(stateobj.buttons.hasOwnProperty(k)){
 - 						buttons.push({ title: k, value: stateobj.buttons[k] });
 - 					}
 - 				}
 - 			}
 - 
 - 			// iterate over each button and create them
 - 			for(i=0, l=buttons.length; i<l; i++){
 - 				v = buttons[i],
 - 				defbtn = stateobj.focus === i || (isNaN(stateobj.focus) && stateobj.defaultButton === i) ? (opts.prefix + 'defaultbutton ' + opts.classes.defaultButton) : '';
 - 
 - 				state += '<button class="'+ opts.classes.button +' '+ opts.prefix + 'button '+ defbtn;
 - 
 - 				if(typeof v.classes !== "undefined"){
 - 					state += ' '+ ($.isArray(v.classes)? v.classes.join(' ') : v.classes) + ' ';
 - 				}
 - 
 - 				state += '" name="' + opts.prefix + '_' + statename + '_button' + v.title.replace(/[^a-z0-9]+/gi,'') + '" value="' + v.value + '">' + v.title + '</button>';
 - 			}
 - 			
 - 			state += '</div></div>';
 - 
 - 			$state = $(state);
 - 
 - 			$state.on('impromptu:submit', stateobj.submit);
 - 
 - 			if(afterState !== undefined){
 - 				$jqistates.find('[data-jqi-name="'+afterState+'"]').after($state);
 - 			}
 - 			else{
 - 				$jqistates.append($state);
 - 			}
 - 
 - 			t.options.states[statename] = stateobj;
 - 
 - 			return $state;
 - 		},
 - 
 - 		/**
 - 		* removeState - Removes a state from the prompt
 - 		* @param state String - Name of the state
 - 		* @param newState String - Name of the state to transition to
 - 		* @return Boolean - returns true on success, false on failure
 - 		*/
 - 		removeState: function(state, newState) {
 - 			var t = this,
 - 				$state = t.getState(state),
 - 				rm = function(){ $state.remove(); };
 - 
 - 			if($state.length === 0){
 - 				return false;
 - 			}
 - 
 - 			// transition away from it before deleting
 - 			if($state.css('display') !== 'none'){
 - 				if(newState !== undefined && t.getState(newState).length > 0){
 - 					t.goToState(newState, false, rm);
 - 				}
 - 				else if($state.next().length > 0){
 - 					t.nextState(rm);
 - 				}
 - 				else if($state.prev().length > 0){
 - 					t.prevState(rm);
 - 				}
 - 				else{
 - 					t.close();
 - 				}
 - 			}
 - 			else{
 - 				$state.slideUp('slow', rm);
 - 			}
 - 
 - 			return true;
 - 		},
 - 
 - 		/**
 - 		* getApi - Get the api, so you can extract it from $.prompt stack
 - 		* @return jQuery - the prompt
 - 		*/
 - 		getApi: function() {
 - 			return this;
 - 		},
 - 
 - 		/**
 - 		* getBox - Get the box containing fade and prompt
 - 		* @return jQuery - the prompt
 - 		*/
 - 		getBox: function() {
 - 			return this.jqib;
 - 		},
 - 
 - 		/**
 - 		* getPrompt - Get the prompt
 - 		* @return jQuery - the prompt
 - 		*/
 - 		getPrompt: function() {
 - 			return this.jqi;
 - 		},
 - 
 - 		/**
 - 		* getState - Get the state by its name
 - 		* @param statename String - Name of the state
 - 		* @return jQuery - the state
 - 		*/
 - 		getState: function(statename) {
 - 			return this.jqi.find('[data-jqi-name="'+ statename +'"]');
 - 		},
 - 
 - 		/**
 - 		* getCurrentState - Get the current visible state
 - 		* @return jQuery - the current visible state
 - 		*/
 - 		getCurrentState: function() {
 - 			return this.getState(this.getCurrentStateName());
 - 		},
 - 
 - 		/**
 - 		* getCurrentStateName - Get the name of the current visible state/substate
 - 		* @return String - the current visible state's name
 - 		*/
 - 		getCurrentStateName: function() {
 - 			return this.currentStateName;
 - 		},
 - 
 - 		/**
 - 		* position - Repositions the prompt (Used internally)
 - 		* @return void
 - 		*/
 - 		position: function(e){
 - 			var t = this,
 - 				restoreFx = $.fx.off,
 - 				$state = t.getCurrentState(),
 - 				stateObj = t.options.states[$state.data('jqi-name')],
 - 				pos = stateObj? stateObj.position : undefined,
 - 				$window = $(window),
 - 				bodyHeight = document.body.scrollHeight, //$(document.body).outerHeight(true),
 - 				windowHeight = $(window).height(),
 - 				documentHeight = $(document).height(),
 - 				height = bodyHeight > windowHeight ? bodyHeight : windowHeight,
 - 				top = parseInt($window.scrollTop(),10) + (t.options.top.toString().indexOf('%') >= 0?
 - 						(windowHeight*(parseInt(t.options.top,10)/100)) : parseInt(t.options.top,10));
 - 
 - 			// when resizing the window turn off animation
 - 			if(e !== undefined && e.data.animate === false){
 - 				$.fx.off = true;
 - 			}
 - 
 - 			t.jqib.css({
 - 				position: "absolute",
 - 				height: height,
 - 				width: "100%",
 - 				top: 0,
 - 				left: 0,
 - 				right: 0,
 - 				bottom: 0
 - 			});
 - 			t.jqif.css({
 - 				position: "fixed",
 - 				height: height,
 - 				width: "100%",
 - 				top: 0,
 - 				left: 0,
 - 				right: 0,
 - 				bottom: 0
 - 			});
 - 
 - 			// tour positioning
 - 			if(pos && pos.container){
 - 				var offset = $(pos.container).offset();
 - 
 - 				if($.isPlainObject(offset) && offset.top !== undefined){
 - 					t.jqi.css({
 - 						position: "absolute"
 - 					});
 - 					t.jqi.animate({
 - 						top: offset.top + pos.y,
 - 						left: offset.left + pos.x,
 - 						marginLeft: 0,
 - 						width: (pos.width !== undefined)? pos.width : null
 - 					});
 - 					top = (offset.top + pos.y) - (t.options.top.toString().indexOf('%') >= 0? (windowHeight*(parseInt(t.options.top,10)/100)) : parseInt(t.options.top,10));
 - 					$('html,body').animate({ scrollTop: top }, 'slow', 'swing', function(){});
 - 				}
 - 			}
 - 			// custom state width animation
 - 			else if(pos && pos.width){
 - 				t.jqi.css({
 - 						position: "absolute",
 - 						left: '50%'
 - 					});
 - 				t.jqi.animate({
 - 						top: pos.y || top,
 - 						left: pos.x || '50%',
 - 						marginLeft: ((pos.width/2)*-1),
 - 						width: pos.width
 - 					});
 - 			}
 - 			// standard prompt positioning
 - 			else{
 - 				t.jqi.css({
 - 					position: "absolute",
 - 					top: top,
 - 					left: '50%',//$window.width()/2,
 - 					marginLeft: ((t.jqi.outerWidth(false)/2)*-1)
 - 				});
 - 			}
 - 
 - 			// restore fx settings
 - 			if(e !== undefined && e.data.animate === false){
 - 				$.fx.off = restoreFx;
 - 			}
 - 		},
 - 
 - 		/**
 - 		* style - Restyles the prompt (Used internally)
 - 		* @return void
 - 		*/
 - 		style: function(){
 - 			var t = this;
 - 			
 - 			t.jqif.css({
 - 				zIndex: t.options.zIndex,
 - 				display: "none",
 - 				opacity: t.options.opacity
 - 			});
 - 			t.jqi.css({
 - 				zIndex: t.options.zIndex+1,
 - 				display: "none"
 - 			});
 - 			t.jqib.css({
 - 				zIndex: t.options.zIndex
 - 			});
 - 		},
 - 
 - 		/**
 - 		* goToState - Goto the specified state
 - 		* @param state String - name of the state to transition to
 - 		* @param subState Boolean - true to be a sub state within the currently open state
 - 		* @param callback Function - called when the transition is complete
 - 		* @return jQuery - the newly active state
 - 		*/
 - 		goToState: function(state, subState, callback) {
 - 			var t = this,
 - 				$jqi = t.jqi,
 - 				jqiopts = t.options,
 - 				$state = t.getState(state),
 - 				stateobj = jqiopts.states[$state.data('jqi-name')],
 - 				promptstatechanginge = new $.Event('impromptu:statechanging'),
 - 				opts = t.options;
 - 
 - 			if(stateobj !== undefined){
 - 
 - 
 - 				if (typeof stateobj.html === 'function') {
 - 					var contentLaterFunc = stateobj.html;
 - 					$state.find('.' + opts.prefix +'message ').html(contentLaterFunc());
 - 				}
 - 
 - 				// subState can be ommitted
 - 				if(typeof subState === 'function'){
 - 					callback = subState;
 - 					subState = false;
 - 				}
 - 
 - 				t.jqib.trigger(promptstatechanginge, [t.getCurrentStateName(), state]);
 - 
 - 				if(!promptstatechanginge.isDefaultPrevented() && $state.length > 0){
 - 					t.jqi.find('.'+ opts.prefix +'parentstate').removeClass(opts.prefix +'parentstate');
 - 
 - 					if(subState){ // hide any open substates
 - 						// get rid of any substates
 - 						t.jqi.find('.'+ opts.prefix +'substate').not($state)
 - 							.slideUp(jqiopts.promptspeed)
 - 							.removeClass('.'+ opts.prefix +'substate')
 - 							.find('.'+ opts.prefix +'arrow').hide();
 - 
 - 						// add parent state class so it can be visible, but blocked
 - 						t.jqi.find('.'+ opts.prefix +'state:visible').addClass(opts.prefix +'parentstate');
 - 
 - 						// add substate class so we know it will be smaller
 - 						$state.addClass(opts.prefix +'substate');
 - 					}
 - 					else{ // hide any open states
 - 						t.jqi.find('.'+ opts.prefix +'state').not($state)
 - 							.slideUp(jqiopts.promptspeed)
 - 							.find('.'+ opts.prefix +'arrow').hide();
 - 					}
 - 					t.currentStateName = stateobj.name;
 - 
 - 					$state.slideDown(jqiopts.promptspeed,function(){
 - 						var $t = $(this);
 - 
 - 						// if focus is a selector, find it, else its button index
 - 						if(typeof(stateobj.focus) === 'string'){
 - 							$t.find(stateobj.focus).eq(0).focus();
 - 						}
 - 						else{
 - 							$t.find('.'+ opts.prefix +'defaultbutton').focus();
 - 						}
 - 
 - 						$t.find('.'+ opts.prefix +'arrow').show(jqiopts.promptspeed);
 - 
 - 						if (typeof callback === 'function'){
 - 							t.jqib.on('impromptu:statechanged', callback);
 - 						}
 - 						t.jqib.trigger('impromptu:statechanged', [state]);
 - 						if (typeof callback === 'function'){
 - 							t.jqib.off('impromptu:statechanged', callback);
 - 						}
 - 					});
 - 					if(!subState){
 - 						t.position();
 - 					}
 - 				} // end isDefaultPrevented()	
 - 			}// end stateobj !== undefined
 - 
 - 			return $state;
 - 		},
 - 
 - 		/**
 - 		* nextState - Transition to the next state
 - 		* @param callback Function - called when the transition is complete
 - 		* @return jQuery - the newly active state
 - 		*/
 - 		nextState: function(callback) {
 - 			var t = this,
 - 				$next = t.getCurrentState().next();
 - 			if($next.length > 0){
 - 				t.goToState( $next.data('jqi-name'), callback );
 - 			}
 - 			return $next;
 - 		},
 - 
 - 		/**
 - 		* prevState - Transition to the previous state
 - 		* @param callback Function - called when the transition is complete
 - 		* @return jQuery - the newly active state
 - 		*/
 - 		prevState: function(callback) {
 - 			var t = this,
 - 				$prev = t.getCurrentState().prev();
 - 			if($prev.length > 0){
 - 				t.goToState( $prev.data('jqi-name'), callback );
 - 			}
 - 			return $prev;
 - 		}
 - 
 - 	};
 - 
 - 	// ########################################################################
 - 	// $.prompt will manage a queue of Impromptu instances
 - 	// ########################################################################
 - 
 - 	/**
 - 	* $.prompt create a new Impromptu instance and push it on the stack of instances
 - 	* @param message String/Object - String of html or Object of states
 - 	* @param options Object - Options to set the prompt
 - 	* @return jQuery - the jQuery object of the prompt within the modal
 - 	*/
 - 	$.prompt = function(message, options){
 - 		var api = new Imp(message, options);
 - 		return api.jqi;
 - 	};
 - 
 - 	/**
 - 	* Copy over static methods
 - 	*/
 - 	$.each(Imp, function(k,v){
 - 		$.prompt[k] = v;
 - 	});
 - 
 - 	/**
 - 	* Create a proxy for accessing all instance methods. The close method pops from queue.
 - 	*/
 - 	$.each(Imp.prototype, function(k,v){
 - 		$.prompt[k] = function(){
 - 			var api = Imp.getLast(); // always use the last instance on the stack
 - 
 - 			if(api && typeof api[k] === "function"){
 - 				return api[k].apply(api, arguments);
 - 			}
 - 		};
 - 	});
 - 
 - 	// ########################################################################
 - 	// jQuery Plugin and public access
 - 	// ########################################################################
 - 
 - 	/**
 - 	* Enable using $('.selector').prompt({});
 - 	* This will grab the html within the prompt as the prompt message
 - 	*/
 - 	$.fn.prompt = function(options){
 - 		if(options === undefined){
 - 			options = {};
 - 		}
 - 		if(options.withDataAndEvents === undefined){
 - 			options.withDataAndEvents = false;
 - 		}
 - 
 - 		$.prompt($(this).clone(options.withDataAndEvents).html(),options);
 - 	};
 - 
 - 	/**
 - 	* Export it as Impromptu and $.prompt
 - 	* Can be used from here forth as new Impromptu(states, opts)
 - 	*/
 - 	window.Impromptu = Imp;
 - 
 - }));
 
 
  |