git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6485 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			319 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
 * 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 = '<div class="' + options.prefix + 'box' + options.classes + '" 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) * -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);
 |