﻿/*
 *	jquery.msgbox 2.0 - 2009-09-30
 *
 *	All the stuff written by pwwang (pwwang.com)	
 *	Feel free to do whatever you want with this file
 *
 */
(function($) {
	$.msgbox = function(options) {
		options = options || {};
		options.width 			= options.width 		|| 360;  
		options.height 			= options.height 		|| 200, 
		options.closeAfter 		= options.closeAfter 	|| 0;
		options.title 			= options.title 		|| '提示', // title of alert
		options.wrapperClass	= options.wrapperClass	|| 'alert_wrapper';
		options.titleClass 		= options.titleClass 	|| 'alert_title';
		options.mainClass 		= options.mainClass 	|| 'alert_main';
		options.bgClass 		= options.bgClass 		|| 'alert_bg';
		options.type 			= options.type 			|| 'text'; // support  text url(=get) iframe
		options.content 		= options.content 		|| 'Hello, world!';
		options.closeEvent 		= options.closeEvent 	|| function(){};
		options.closeImg		= options.closeImg		|| 'images/close.gif';
		options.bgOpacity		= options.bgOpacity		|| 0.6;   // from 0 to 1
		options.afterAjaxEvent	= options.afterAjaxEvent|| function(){};
		
		var dragFlag = false;
		var startX = 0;
		var startY = 0;
		
		var $background = $(document.createElement("div"))
			.css({
				 'position'	: 'absolute',
				 'top'		: '0',
				 'left'		: '0',
				 'z-index'	: '9999'
			})
			.addClass(options.bgClass)
			.appendTo('body')
			.animate({opacity:0.6})
			.mouseup(function(e){
				dragEnd(e);	
				// if the mouse lost in the background, end dragging if mouseup
			});
			
		// help IE users if possible
		try {
			$background.bgiframe();
		} catch(e) { }	
		
		var $wrapper = $(document.createElement("div"))
			.css({
				'width' 	: options.width + 'px',
				'height' 	: options.height + 'px',
				'position' 	: 'absolute',
				'z-index'	: '10000'
			})
			.addClass(options.wrapperClass)
			.appendTo('body')
			.mouseup(function(e){
				dragEnd(e);						  
			});	
		
		var $titleWrapper = $(document.createElement("div"))
			.css({
				 'cursor' : 'move',
				 'display' : 'block',
				 'vertical-align' : 'middle'			 
			})
			.addClass(options.titleClass)
			.appendTo($wrapper)
			.select(function(e){
				if(e.preventDefault)
					e.preventDefault(); 
				if(e.stopPropagation())
					e.stopPropagation();
				return false;				 
			})
			.mousedown(function(e){
				dragStart(e);					
			})
			.mousemove(function(e){
				if(dragFlag)
					dragTo(startX, startY, e);				
			})
			.mouseout(function(e){
				if(dragFlag)
					dragTo(startX, startY, e);			   
			})
			.mouseup(function(e){
				dragEnd(e);				  
			});
			
		var $title = $(document.createElement("span"))
			.css({
				 'float' : 'left',
				 'width' : (options.width - 30) + 'px', 
				 // 30 is to be modified if closeImg changed
				 'display' : 'block'
			})
			.html(options.title)
			.appendTo($titleWrapper)
			.select(function(e){
				if(e.preventDefault)
					e.preventDefault(); 
				if(e.stopPropagation())
					e.stopPropagation();
				return false
			});
		
		var $close = $(document.createElement("img"))
			.attr("src", options.closeImg)
			.css({
				'cursor' : 'pointer',
				'vertical-align' : 'middle'
			})
			.appendTo($titleWrapper)
			.mousedown(function(){
				closeMe();						  
			});	

		var $main = $(document.createElement("div"))
			.addClass(options.mainClass)
			.appendTo($wrapper);
				
		function closeMe(){
			$background.fadeOut();
			$wrapper.fadeOut();
		}
		
		function isVisible(){
			return	$background.is(":visible") &&
					$wrapper.is(":visible");
		}

		function autoCloseMe(closeAfter){			
			if( closeAfter > 0 && isVisible() ){ // prevent manually closing
				autoCloseStr = closeAfter + " 秒后关闭 ...";
				$title.html(options.title + " &nbsp; " + autoCloseStr);		
				closeAfter --;
				if( closeAfter == 0 ) 
					closeMe();	
			}
			setTimeout(function(){ autoCloseMe(closeAfter) }, 1000);			
		}
		
		function dragStart(e){			
			if(e.preventDefault)
				e.preventDefault(); 
			if(e.stopPropagation())
				e.stopPropagation();			
			dragFlag = true;
			var offset = $wrapper.offset();
			startX = e.pageX - offset.left;
			startY = e.pageY - offset.top;				
		}
		
		function dragTo(x, y, e){		
			if(e.preventDefault)
				e.preventDefault(); 
			if(e.stopPropagation())
				e.stopPropagation();			
			ensureMoveInScreen(e.pageX-x, e.pageY-y);
		}
		
		function ensureMoveInScreen(x,y){		
			var offset = $wrapper.offset();
			if( x < 0 ) boxMoveTo(0, y);
			if( y < 0 ) boxMoveTo(x, 0);
			if( offset.left > $(window).width() - options.width ) 
				boxMoveTo($(window).width() - options.width, y);
			if( offset.top > $(window).height() - options.height )
				boxMoveTo(x, $(window).height() - options.height);
			if( x>=0 && x<=$(window).width()-options.width &&
				y>=0 && y<=$(window).height()-options.height)
				boxMoveTo(x,y);		
		}
		
		function boxMoveTo(x,y){
			$wrapper.css({
				'top'  : y + 'px',
				'left' : x + 'px'
			});		
		}
		
		function dragEnd(e){		
			if(e.preventDefault)
				e.preventDefault(); 
			if(e.stopPropagation())
				e.stopPropagation();			
			var offset = $wrapper.offset();
			ensureMoveInScreen(offset.left, offset.top);	
			dragFlag = false;
		}
		
		function resetPosition() {
			$background.css({
				 'width'	: $(document).width() + 'px',
				 'height'	: $(document).height() + 'px'
			});
			$wrapper.css({
				'top'		: ($(window).height() - options.height)/2 + 'px',
				'left'	 	: ($(window).width() - options.width)/2 + 'px'			 
			});	
		}
		
		function msgbox(){		
			switch(options.type){
				case 'text':
					$main.text(options.content);
					break;			
				case 'get':
				case 'ajax':
				case 'url':
					$main.text("Loading ...").load(
						options.content,
						'',
						function(data){
							(options.afterAjaxEvent)(data);	
						}
					);
					break;			
				case 'iframe':	
					$(document.createElement("iframe"))
						.attr({
							'width'			: '100%',
							'height'		: '100%',
							'scrolling' 	: 'auto',
							'frameborder' 	: '0',
							'marginheight' 	: '0',
							'marginwidth' 	: '0',
							'src'			: options.content
						})
						.appendTo($main);
					break;
			}	
		}
		
		resetPosition();
		$(window)
			.load(resetPosition)		// just in case user is changing size of page while loading
			.resize(resetPosition);		
		msgbox();	   // show content
		if( options.closeAfter > 0 ) 
			autoCloseMe(options.closeAfter);
			
		return this;
	}			
})(jQuery);

