/*
 * lanpopups.js
 * @Copyright (c) 2009 Bluelan <lan9203@163.com>
 * @Version 2.2
 * @Build 2009/09/17
 * @Modity 2010/09/20
 */
 /* exmaple
 	$.lanpopups.open(msg,{top:"12%", width:600});
 	$.lanpopups.confirm(data, callback, params, opts); //params is array; opts is object
 */
(function($){
	var is_ie6 = $.browser.msie && $.browser.version<7.0;
	var wdw=0, wdh=0;
	$.open_popups = function(data, opts){
		$.lanpopups.open(data, opts);
	};
	$.close_popups = function(name){
		$.lanpopups.close(name);
	};
	$.fn.open_popups = function(opts){
		$.lanpopups.open($(this).html(), opts);
	};
	$.lanpopups = {
		openeds : [],
		cwrap : null,
		opts : null,
		initopt : function(){
			var o = this;
			this.opts = {
				name : "landiv",
				width : null,
				height : null,
				zIndex : 30000,
				position : null,
				top : null,
				left : null,
				showoverlay : true,
				overlayClose : true,
				overlayBackgroundColor : "#000",
				overlayOpacity: "0.3",
				speed : null,
				escClose : true
			}
		},
		//显示
		open : function(data, opts){
			var o = this;
			o.initopt();
			o.opts = jQuery.extend(o.opts, opts);
			o.initvar();
			o.create(data);
			o.bindevent();
			return o;
		},
		//创建
		create : function(data){
			var o = this;
			var opts = o.opts;
			if(jQuery.inArray(opts.name, o.openeds)!=-1);{
				o.close(opts.name);
				$.each(o.openeds, function(k, v){
					if(v==opts.name) o.openeds.splice(k, 1);
				});
			}
			o.openeds.push(opts.name);
			if(o.openeds.length>1){
				var prename = o.openeds[o.openeds.length-2];
				if(Number($('#popups_'+prename).css("z-index"))>=Number(opts.zIndex)) opts = jQuery.extend(opts, {zIndex : Number($('#popups_'+prename).css("z-index"))+1000});
			}
			if(opts.showoverlay){ o.overlay(opts);}
			if(o.cwrap == null) o.cwrap = $('<div id="to_popups_pos"></div>').css({position:"fixed", top:0, left:0, display:"none", "z-index":opts.zIndex-2}).appendTo('body');
			var iframeid = 'iframe_'+opts.name;
			var popupsid = 'popups_'+opts.name;
			if(is_ie6){
				$("body").append('<iframe id="'+iframeid+'"></iframe>');
				$('#'+iframeid).css({"z-index":opts.zIndex-3, width:wdw, height:wdh, opacity:0});
				o.fixie6(iframeid, 0, 0);
				o.fixie6("to_popups_pos", 0, 0);
			}
			var container = $('<div id="'+popupsid+'" class="lanpupups_container">'+data+'</div>').css('display', 'none').appendTo("body");
			var pos = opts.position || "absolute";
			var ch = opts.height || $(container).outerHeight(true);
			var cw = opts.width || $(container).outerWidth(true);
			var pt = opts.top || ((pos=="absolute"? o.cwrap.position().top : 0)+(wdh-ch)/2);
			var pl = opts.left || ((pos=="absolute"? o.cwrap.position().left : 0)+(wdw-cw)/2);
			$(container).css({position:pos, "z-index":opts.zIndex, width:cw, height:ch, left:pl, top:pt});
			if(is_ie6 && pos=="fixed"){
				o.fixie6(popupsid, pt, pl);
			}
			if(o.opts.speed != null) $(container).show(o.opts.speed);
			else $(container).show();
		},
		//创建modal
		overlay : function(){
			var o = this;
			var opts = o.opts;
			var overlayid = 'overlay_'+opts.name;
			$("body").append('<div id="'+overlayid+'"></div>');
			$('#'+overlayid).css({position:"fixed", top:0, left:0, "z-index":opts.zIndex-1, width:wdw, height:wdh, background:opts.overlayBackgroundColor, opacity:opts.overlayOpacity});
			if(is_ie6){
				o.fixie6(overlayid, 0, 0);
			}
			if(opts.overlayClose){
				$('#'+overlayid).click(function(){o.close(opts.name)});
			}
		},
		//关闭
		close : function(name){
			var o = this;
			if(o.openeds.length>0){
				if(typeof(name)=="undefined"){
					name = o.openeds[o.openeds.length-1];
				}
				if(o.opts.speed != null){
					$('#popups_'+name).hide(o.opts.speed, function(){
						o.doclose(name);
					});
				}else{
					o.doclose(name);
				}
				
			}
			if(o.openeds.length == 0){
				o.unbindevent();
				if(o.cwrap != null){
					o.cwrap.remove();
					o.cwrap = null;
				}
			}
			return o;
		},
		doclose : function(name){
			var o = this;
			$('#popups_'+name).remove();
			$('#overlay_'+name).remove();
			$('#iframe_'+name).remove();
			$.each(o.openeds, function(k, v){
				if(v==name)	o.openeds.splice(k, 1);
			});
			return o;
		},
		//初始化全局变量
		initvar : function(){
			wdw = $(window).width(true);
			wdh = $(window).height();
		},
		fixie6 : function(oid, top, left){
			top = parseInt(top);
			left = parseInt(left);
			$('#'+oid).css({position:"absolute"});
			var ex = $('#'+oid)[0].style;
			ex.removeExpression('top');
			ex.removeExpression('left');
			ex.setExpression("top","(_=(document.body.scrollTop || document.documentElement.scrollTop + "+top+")) + 'px'");
			ex.setExpression("left", "(_=(document.body.scrollLeft || document.documentElement.scrollLeft + "+left+")) + 'px'");
		},
		//绑定事件
		bindevent : function(){
			var o = this;
			$(window).bind('resize', function(){
				var rate_rsw = (wdw - $(window).width(true)) / wdw;
				var rate_rsh = (wdh - $(window).height()) / wdh;
				if(rate_rsw==0 && rate_rsh==0) {return false;}
				o.initvar();
				$.each(o.openeds, function(k,v){
					$('#overlay_'+v+', #iframe_'+v).css({width:wdw, height:wdh});
					var pt = parseInt($('#popups_'+v).css("top"));
					var pl = parseInt($('#popups_'+v).css("left"));
					
					if(!o.opts.position && o.cwrap){
						pt = pt - (pt - o.cwrap.position().top) * rate_rsh;
						pl = pl - (pl - o.cwrap.position().left) * rate_rsw;
						if(!o.opts.top) $('#popups_'+v).css("top", pt);
						if(!o.opts.left) $('#popups_'+v).css("left", pl);
					}
					if(o.opts.position=="fixed"){
						pt = parseInt(pt - (pt * rate_rsh));
						pl = parseInt(pl - (pl * rate_rsw));
						$('#popups_'+v).css({top:pt, left:pl});
						if(is_ie6) o.fixie6('popups_'+v, pt, pl);
					}
				});
			});
			
			$(document).bind('keydown', function(e){
				if (o.opts.escClose && e.keyCode == 27) {
					o.close();
					return false;
				}
			});
			
			$(".lanpupups_container .close, .lanpupups_container .cancel").click(function(){o.close();});
		},
		//解除绑定
		unbindevent : function(){
			$(window).unbind('resize');
			$(document).unbind('keydown');
		},
		//模拟confirm窗口
		confirm : function(data, callback, params, opts){
			var o = this;
			o.open(data, opts);
			$(".lanpupups_container .yes, .lanpupups_container .ok").click(function(){
				if($.isFunction(callback)){
					callback.apply(this, params);
				}
				o.close();
			});
		}
	};
	
})(jQuery);
