﻿/*
** Create : 2009-05-17
** Author : Jonllen
** Update : 2009-11-22
*/
var Popup = {
		maxZindex : 1000,
		list : new Array(),
		settings: {
			target : null,
			autoOpen : false,
			overlay : undefined,
			overlayClass : "popup-overlay",
			openButton : undefined,
			closeButton : undefined,
			isOpen : false,
			drag : false,
			resize : false 
		},
		init: function (settings) {
			
			var isExist = false;
			for (var i=0;i<this.list.length;i++)
			{
				if (this.list[i].target==settings.target)
				{
					isExist = true;
					this.settings = this.list[i];
					break;
				}
			}
			if (!isExist)
			{
			    if ( typeof(settings.target)=='string' )
			        settings.target = document.getElementById(settings.target);
				this.list.push(settings);
				this.settings = settings;
			}
			if (this.settings.closeButton)
			{
			    global.$(this.settings.closeButton).onclick = function (){ Popup.close(); };
			}
			if (this.settings.openButton)
			{
			    global.$(this.settings.openButton).onclick = function (){ Popup.open(); };
			}
			if (this.settings.autoOpen) this.open();
		},
		getInstanceById : function (id)
		{
			for(var i=0;i<this.list.length;i++)
			{
				var settings = this.list[i];
				if ( settings.target.id == id )
				{
					this.settings = settings;
				}
			}
			return this;
		},
		overlay : function (){
			var overlay = this.settings.overlay;
			if(overlay==undefined)
			{
				overlay = document.createElement("div");
				overlay.title = "点击层关闭";
				overlay.className = this.settings.overlayClass ? this.settings.overlayClass : "popup-overlay";
				overlay.style.position = "absolute";
				overlay.style.zIndex = ++this.maxZindex;
				overlay.onclick = function (){ Popup.getInstanceById(Popup.settings.target.id).close(); };
				document.body.insertBefore(overlay,document.body.childNodes[0]);
				//this.settings.target.parentNode.insertBefore(overlay, this.settings.target);
			}
			//alert(global.width());
			overlay.style.width = global.width()+"px";
			overlay.style.height = global.height()+"px";
			overlay.style.display = "block";
			return overlay;
		},
		open : function (){
		
			var self = this;
			var target = this.settings.target;
			
			if( target.parentNode != document.body )
			{
			    //移动target位置，使之与overlay同级以修复ie的z-index问题
			    document.body.insertBefore(target, document.body.childNodes[0]);
			}
			
			//must be set overlay then target(Zindex)
			this.settings.overlay = this.overlay();
			
			//must be set position then Zindex
			target.style.position = "absolute";
			target.style.zIndex =  ++this.maxZindex;
			
			target.style.tabindex = -1;
			target.style.display = "block";
			
			target.style.left = (global.objProperty(window,"Width")-global.objProperty(target,"Width"))/2+"px";
			target.style.top = (( global.objProperty(window,"Height") - global.objProperty(target,"Height") )/2+global.scrollTop())+"px";
			
			var selectList = document.getElementsByTagName("select");
			for(var i=0;i<selectList.length;i++) selectList[i].style.visibility = "hidden";

			if (this.opened()==null)
			{
				
				global.addEvent(window,"resize",this.eResize);
				global.addEvent(document,"keydown",this.eKeydown );
				
				if (this.settings.closeButton) this.settings.closeButton.focus();
			}
			this.settings.isOpen = true;
			
			//drag
			if (this.settings.drag==true)
			{
			    var dragHandle = target;
			    var titlebar = target.getElementsByTagName("div")[0];
			    if( typeof(titlebar) != 'undefined' && titlebar.className.indexOf("titlebar")>-1)
			    {
			        dragHandle = titlebar;
			    }
			    else if( typeof(titlebar) != 'undefined' && typeof(titlebar.getElementsByTagName("div")[0]) != 'undefined' )
			    {
			        titlebar = titlebar.getElementsByTagName("div")[0];
			        if( titlebar.className.indexOf("titlebar")>-1 )
			            dragHandle = titlebar;
			    }
				dragHandle.onmousedown = function (e){
					Popup.eDrag(target,e);
				};
				
			}
			//resize
			if( this.settings.resize==true)
			{
			    target.onselectstart = function (e){ return false;};
			    var resizeHandle = this.settings.target.lastChild;
			    if( resizeHandle== null || resizeHandle.className.indexOf('popup-resize')== -1 )
			    {
			        resizeHandle = document.createElement('div');
			        resizeHandle.className = 'popup-resize';

			        resizeHandle.innerHTML = '<div title="点击缩放大小">▲</div>';
			        resizeHandle.childNodes[0].onmousedown = function (e){
			            e = window.event || e;
			            var _xy = parseInt( global.objProperty(target,'Height') ) - e.clientY;
			            var _xx = parseInt( global.objProperty(target,'Width') ) - e.clientX;
			            var iframe = target.getElementsByTagName('iframe')[0];
			            document.onmouseup = function(){
				            this.onmousemove = null;
				            this.onmouseup=null;
				            if( typeof(iframe) != 'undefined')
			                {
			                    iframe.style.display = 'block';
			                }
			            }  
			            if(e.preventDefault){
				            e.preventDefault();
			            }
			            document.onmousemove = function(e){
				            var e = window.event || e;
				            target.style.height = "auto";
				            target.style.width = _xx + e.clientX + "px";
				            
				            if( typeof(iframe) != 'undefined')
				            {
				                iframe.style.display = 'none';
				                var content = iframe.parentNode,titlebar = content.previousSibling;
                                var titleHeight = global.objProperty(titlebar,'Height');
                                content.style.height = _xy + e.clientY - titleHeight + 'px';
                                iframe.height = _xy + e.clientY - titleHeight + 'px';
                                iframe.width = _xx + e.clientX + 'px';
				            }
			            }
			            window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
			        };
			        this.settings.target.appendChild(resizeHandle);
			    }
			}
		},
		close : function (){
			if(this.settings.overlay==undefined) return;
			this.settings.isOpen = false;
			this.settings.target.style.display = "none";
			this.settings.overlay.style.display = "none";
			global.removeEvent(window,"resize",this.eResize);
			global.removeEvent(document,"keydown",this.eKeydown);
			
			var selectList = document.getElementsByTagName("select");
			for(var i=0;i<selectList.length;i++) selectList[i].style.visibility = "visible";

			if ( this.opened()!=null)
			{
				
				this.settings = this.opened();
				global.addEvent(window,"resize",this.eResize);
				global.addEvent(document,"keydown",this.eKeydown );
				
				if (this.settings.closeButton) this.settings.closeButton.focus();
			}

		},
		opened : function (){
			for(var i=0;i<this.list.length;i++)
			{
				if(this.list[i].isOpen) return this.list[i];
			}
			return null;
		},
		create : function (containerId,title,content,width,height){
		    if( document.getElementById(containerId) != null)
		    {
		        return document.getElementById(containerId);
		    }
			var container = document.createElement("div");
			container.id = containerId;
			container.className = "popup-container";
			container.style.display = "none";
			container.style.width = width+"px";
			container.innerHTML = "<div class=\"popup-titlebar\" title=\"点击拖拽\">"
				+"<a class=\"close\" href=\"javascript:Popup.getInstanceById('"+containerId+"').close();\" title=\"关闭\">&nbsp;</a>"
				+"<span class=\"title\">"+title+"</span>"
			+"</div>"
			+"<div class=\"popup-content\">"
			+ ( width && height ? "<iframe allowtransparency=\"true\" frameborder=\"0\" scrolling=\"no\" src=\""+content+"\" width=\""+width+"\" height=\""+height+"\"></iframe>" : content)
			+"</div>";
			document.body.insertBefore(container,document.body.childNodes[0]);
			return container;
		},
		eResize : function (e){
			
			for(var i=0;i<Popup.list.length;i++)
			{
				var overlay = Popup.list[i].overlay;
				if (overlay==undefined) continue;
				
				overlay.style.width = 0;
				overlay.style.height = 0;
				overlay.style.width = global.width()+"px";
				overlay.style.height = global.height()+"px";
				var target = Popup.list[i].target;
				target.style.left = (global.objProperty(window,"Width")-global.objProperty( target,"Width"))/2+"px";
				target.style.top = ( ( global.objProperty(window,"Height") - global.objProperty(target,"Height") )/2+global.scrollTop())+"px";
			}
		},
		eDrag : function (target,e)
		{
			e = window.event || e;
			var _xy = parseInt(target.offsetTop) - e.clientY;
			var _xx = parseInt(target.offsetLeft) - e.clientX;
			document.onmouseup = function(){
				this.onmousemove = null;
				this.onmouseup=null;
			}
			if(e.preventDefault){
				e.preventDefault();
			}
			document.onmousemove = function(e){
				var e = window.event || e;
				target.style.top = _xy + e.clientY + "px";
				target.style.left = _xx + e.clientX + "px";
			}
			window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
		},
		eKeydown : function (e){
			
			var num = e.which?e.which:e.keyCode;
			if(num==27) Popup.close();
		}
	};
		
var global = {
		userAgent : navigator.userAgent.toLowerCase(),
		browser : {
			version: (navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
			safari: /webkit/.test( navigator.userAgent.toLowerCase() ),
			opera: /opera/.test( navigator.userAgent.toLowerCase() ),
			msie: /msie/.test( navigator.userAgent.toLowerCase() ) && !/opera/.test( navigator.userAgent.toLowerCase() ),
			mozilla: /mozilla/.test( navigator.userAgent.toLowerCase() ) && !/(compatible|webkit)/.test( navigator.userAgent.toLowerCase() )
		},
		addEvent : function(target,eventType,func){
			if(target.attachEvent)
			{
				target.attachEvent("on"+eventType,func);
				
			}else if(target.addEventListener)
			{
				target.addEventListener(eventType,func,false);
			}
			return this;
		},
		removeEvent : function(target,eventType,func){
			if(target.detachEvent)
			{
				target.detachEvent("on"+eventType,func);
				
			}else if(target.removeEventListener)
			{
				target.removeEventListener(eventType,func,false);
			}
			return this;
		},
		scrollTop: function(){
		 return this.browser.msie ? ((document.compatMode && document.compatMode!="BackCompat")? document.documentElement.scrollTop : document.body.scrollTop) : window.pageYOffset;
		},
		height : function() {
			if ( global.browser.msie && global.browser.version < 7) {
				var scrollHeight = Math.max(
					document.documentElement.scrollHeight,
					document.body.scrollHeight
				);
				var offsetHeight = Math.max(
					document.documentElement.offsetHeight,
					document.body.offsetHeight
				);
				
				if (scrollHeight < offsetHeight) {
					return this.objProperty(window,"Height");
				} else {
					return scrollHeight;
				}
			} else {
				//alert(version)
				//return document.documentElement.scrollHeight ;
				return this.objProperty(document,"Height");
			}
		},
		width : function() {
			if ( global.browser.msie && global.browser.version <7 ) {
				var scrollWidth = Math.max(
					document.documentElement.scrollWidth,
					document.body.scrollWidth
				);
				var offsetWidth = Math.max(
					document.documentElement.offsetWidth,
					document.body.offsetWidth
				);
				
				if (scrollWidth < offsetWidth) {
					//return document.documentElement[ "clientWidth"];
					return this.objProperty(window,"Width");
				} else {
					return scrollWidth;
				}
			} else {
                
				return this.objProperty(document,"Width");
			}
		},
		objProperty : function( target,name ) {
			// Get window width or height
			return target == window ?
				// Opera reports document.body.client[Width/Height] properly in both quirks and standards
				//Fix opera Height
				this.browser.opera && ( name == "Height" ? document.documentElement.clientHeight : document.body[ "client" + name ]) ||

				// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
				this.browser.safari && window[ "inner" + name ] ||
	
				// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
				document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
	
				// Get document width or height
				target == document ?
					// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
					//Fix opera Width
					this.browser.opera && name=="Width" ? 
					    document.documentElement["client" + name]
					    : Math.max(
					    document.documentElement["client" + name],
						Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
						Math.max(document.body["offset" + name], document.documentElement["offset" + name])
					) : target["client"+name];
		},
		ajax: function()
	    {
	        var len=arguments.length;
	        var type,url,postdata,fn;
	        if(len<2)
	        {
	            alert('没有2个一下参数的重载,至少必须指定请求类型(type)和url地址!');
	            return;
	        }
	        type=arguments[0];
	        url=arguments[1];
	        if(len>2)
	        {
	            var args=arguments[2];
	            if(typeof(args)=="string")
	            {
	                postdata=args;
	            }
	        }
	        var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
	        xhr.open(type,url,true);
	        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	        fn = arguments[len-1];
	        xhr.onreadystatechange = function (){
				if(xhr.readyState==4)
				{
				   if(xhr.status==200)
				   {
						if(typeof(fn)=="function")
							fn(xhr.responseText);
				   }
				   else
				   {
					 alert("你所请求的页面有异常");
				   }
				}
	        };
	        xhr.send(postdata);
	     },
	     $ : function (id)
	     {
	        if( typeof(id) == 'string')
	     	    return document.getElementById(id);
	     	return id;
	     }
	};