;(function($) {
/* mienbox
 * mienbox - simple jQuery plugin for image zooming
 * Examples and documentation at: http://www.p58.net/
 * Version: 1.0.0 (2008-11-18)
 * Copyright (c) 2008 LuckyMien
 * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
 * Requires: jQuery v1.2.1 or later
*/

// 关于参数 :
// M 覆盖 S, S又会覆盖D
// G 会全局性的修改D
// 此处:
// M 为 <a>标签的metadata
// S 为 $.fn.mienbox()(或$.mienbox.set) 的settings参数
// D 为 $.mienbox.defaults
// G 为 $.mienbox.setSettings

var opts = {};

/* fixPng */
$.fn.fixPng = function(settings) {
	// Settings
	var settings = $.extend({ blankgif: "/js/mienbox/blank.gif" }, settings);

	if ($.browser.msie && ($.browser.version == "5.5" || $.browser.version == "6.0"))
	{
		// fix css background pngs
		this.find("*").each(function(){
			var z = $(this);
			var bgIMG = z.css("background-image");
			if(bgIMG != "none")
			{
				// 匹配url("path/image.png")格式，其中单引号或双引号由\1作后向引用
				var regex = new RegExp("url\\((['\"])(\\S+\\.png)\\1\\)", "i");
				if(bgIMG.match(regex)){
					bgIMG = RegExp.$2;
					z.css('background-image', 'none');
					z.get(0).runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + bgIMG + "',sizingMethod='scale')";
				}
			}
		});
	}

	return this;
};

/* mienbox */
$.mienbox = {
	imgPreloader : new Image,
	imgTypes : ['png', 'jpg', 'jpeg', 'gif'],
	loadingTimer : null,
	loadingFrame : 1,
		
	set : function(elements, settings) {
		opts.settings = $.extend({}, this.defaults, settings);
		
		this.init();

		return elements.each(function() {
			var $this = $(this);

			var o = $.metadata ? $.extend({}, opts.settings, $this.metadata()) : opts.settings;
			
			// 绑定触发imagebox的事件
			$this.unbind(o.startBindType).bind(o.startBindType, function() {
				$.mienbox.start(this, o); return false;
			});
			
			// 绑定关闭imagebox的事件
			if(o.closeBindType)
			{
				$this.unbind(o.closeBindType).bind(o.closeBindType, $.mienbox.close);
			}
		});
	},

	SPStart : function(el, settings)
	{
		this.init();
		
		var o = $.extend({}, this.defaults, settings);
		
		if (opts.animating) return false;

		if (o.overlayShow) {
			if($("#mien_overlay").length <= 0)
			{
				$("#mien_wrap").prepend('<div id="mien_overlay"></div>');
				$("#mien_overlay").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': o.overlayOpacity});

				if ($.browser.msie) {
					$("#mien_wrap").prepend('<iframe id="mien_bigIframe" scrolling="no" frameborder="0"></iframe>');
					$("#mien_bigIframe").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': 0});
				}
			}
			$("#mien_overlay").click($.mienbox.close);
		}
		
		opts.itemArray	= [];
		opts.itemNum	= 0;
		
		var item = {url: o.url, title: o.title, o: o};
		if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0)
		{
			var c = $(el);
			item.orig = {'width': c.width(), 'height': c.height(), 'pos': this.getPosition(c)}
		}
				
		opts.itemArray.push(item);
		this.changeItem(opts.itemNum);
	}, 
	
	start : function(el, o) {
		if (opts.animating) return false;

		if (o.overlayShow) {
			$("#mien_wrap").prepend('<div id="mien_overlay"></div>');
			$("#mien_overlay").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': o.overlayOpacity});

			if ($.browser.msie) {
				$("#mien_wrap").prepend('<iframe id="mien_bigIframe" scrolling="no" frameborder="0"></iframe>');
				$("#mien_bigIframe").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': 0});
			}

			$("#mien_overlay").click($.mienbox.close);
		}

		opts.itemArray	= [];
		opts.itemNum	= 0;

		if ($.isFunction(o.itemLoadCallback)) {
		   o.itemLoadCallback.apply(this, [this.opts]);
		   
		   // 取A或A包含的第一个IMG的尺寸及位置
			var c	= $(el).children("img:first").length ? $(el).children("img:first") : $(el);
			var tmp	= {'width': c.width(), 'height': c.height(), 'pos': this.getPosition(c)}

		   for (var i = 0; i < opts.itemArray.length; i++) {
				opts.itemArray[i].o = $.extend({}, o, opts.itemArray[i].o);
				
				if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) {
					opts.itemArray[i].orig = tmp;
				}
		   }

		}
		else
		{
			if (!$(el).attr("group") || $(el).attr("group") == '')
			{
				var item = {url: el.href, title: el.title, o: o};
				if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0)
				{
					var c = $(el).children("img:first").length ? $(el).children("img:first") : $(el);
					item.orig = {'width': c.width(), 'height': c.height(), 'pos': this.getPosition(c)}
				}
				opts.itemArray.push(item);

			}
			else
			{
				var arr	= $("a[group='" + $(el).attr("group") + "']").get();

				for (var i = 0; i < arr.length; i++)
				{
					var tmp		= $.metadata ? $.extend({}, o, $(arr[i]).metadata()) : o;
   					var item	= {url: arr[i].href, title: arr[i].title, o: tmp};

   					if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0)
   					{
						var c = $(arr[i]).children("img:first").length ? $(arr[i]).children("img:first") : $(arr[i]);
						item.orig = {'width': c.width(), 'height': c.height(), 'pos': this.getPosition(c)}
					}

					if (arr[i].href == el.href) opts.itemNum = i;

					opts.itemArray.push(item);
				}
			}
		}

		this.changeItem(opts.itemNum);
	},

	changeItem : function(n) {
		this.showLoading();
		opts.itemNum = n;

		$("#mien_nav").empty();
		$("#mien_outer").stop();
		$("#mien_title").hide();
		$(document).unbind("keydown");

		var imgRegExp = new RegExp('\.(' + this.imgTypes.join('|') + ')$', 'i');
		var url = opts.itemArray[n].url;
		
		// 图片
		if (url.match(imgRegExp)) {
			$(this.imgPreloader).unbind('load').bind('load', function() {
				$("#mien_loading").hide();
				opts.itemArray[n].o.frameWidth	= $.mienbox.imgPreloader.width;
				opts.itemArray[n].o.frameHeight	= $.mienbox.imgPreloader.height;
				$.mienbox.showItem('<img id="mien_img" src="' + $.mienbox.imgPreloader.src + '" />');
			}).attr('src', url + '?rand=' + Math.floor(Math.random() * 999999999) );
		}
		// #abc形式或#id:abc 形式，复制并显示id为abc的对象的html内容
		else if ( (/#([a-z0-9_]+)$/i).exec(url) || (/#id:([a-z0-9_]+)$/i).exec(url) )
		{
	        this.showItem('<div id="mien_div">' + $("#" + RegExp.$1).html() + '</div>');
	        $("#mien_loading").hide();
		}
		// #var:abc 形式，复制并显示名为abc的变量的值
		else if ((/#var:([a-z0-9_]+)$/i).exec(url)) {
	        this.showItem('<div id="mien_div">' + eval(RegExp.$1) + '</div>');
	        $("#mien_loading").hide();
		}
		// #ajax:url 形式，通过ajax访问url，取其html
		else if ((/#ajax:([_a-z0-9\.\/:\?#&\=\-]+)$/i).exec(url)) {
			$.ajax({
				type : "get",
				url : RegExp.$1,
				cache : false,
				success : function(html) {
			        $.mienbox.showItem('<div id="mien_div">' + html + '</div>');
			        $("#mien_loading").hide();
		        },
		        error : function() {
			        $("#mien_loading").hide();
		        }
			});
		}
		// 建立iframe,访问url
		else {
			this.showItem('<iframe id="mien_frame" onload="$.mienbox.showIframe()" name="mien_iframe' + Math.round(Math.random()*1000) + '" frameborder="0" hspace="0" src="' + url + '" scrolling="no"></iframe>');
		}
	},

	showIframe : function() {
		$("#mien_loading").hide();
		$("#mien_frame").show();
	},

	showItem : function(val) {
		// 此处其实没用，因为每次显示图片其地址都加了个随机的参数
		//this.preloadNeighborImages();

		// 设置边框
		$("#mien_inner").css({
			borderWidth : opts.itemArray[opts.itemNum].o.frameBorderWidth,
			borderColor : opts.itemArray[opts.itemNum].o.frameBorderColor
		});
		
		// [window宽度, window高度, 页面ScrollLeft, 页面ScrollTop]
		var viewportPos	= this.getViewport();
		
		// 参见getBorder的注释
		var border		= this.getBorder();

		// 如果"图片尺寸"大于"屏幕去除总边框的尺寸"，则按比例缩放
		var itemSize	= this.getMaxSize(viewportPos[0] - border[0], viewportPos[1] - border[1], opts.itemArray[opts.itemNum].o.frameWidth, opts.itemArray[opts.itemNum].o.frameHeight);

		// 设定图片位置
		var itemLeft	= ( opts.itemArray[opts.itemNum].o.frameLeft != null )
						  ?	opts.itemArray[opts.itemNum].o.frameLeft
						  : viewportPos[2] + Math.round((viewportPos[0] - itemSize[0] - border[0]) / 2);
		
		var itemTop		= ( opts.itemArray[opts.itemNum].o.frameTop != null )
						  ?	opts.itemArray[opts.itemNum].o.frameTop
						  : viewportPos[3] + Math.round((viewportPos[1] - itemSize[1] - border[1]) / 2);

		var itemOpts = {
			'left':		itemLeft + border[4],	// 校正X坐标
			'top':		itemTop + border[5],	// 校正Y坐标
			'width':	itemSize[0] + border[2] + 'px',	// 校正宽度
			'height':	itemSize[1] + border[3] + 'px'	// 校正高度
		}

		if (opts.active)
		{
			$('#mien_content').fadeOut("normal", function() {
				$("#mien_content").empty();
				$("#mien_outer").animate(itemOpts, "normal", function() {
					$("#mien_content").append($(val)).fadeIn("normal");
					$.mienbox.updateDetails();
				});
			});

		}
		else
		{
			opts.active = true;

			$("#mien_content").empty();

			//if ($("#mien_content").is(":animated")) {
			//	console.info('animated!');
			//}

			if (opts.itemArray[opts.itemNum].o.zoomSpeedIn > 0)
			{
				opts.animating	= true;
				itemOpts.opacity	= "show";
				
				// 初始位置为链接或缩略图片位置
				$("#mien_outer").css({
					'top':		opts.itemArray[opts.itemNum].orig.pos.top - 18,
					'left':		opts.itemArray[opts.itemNum].orig.pos.left - 18,
					'height':	opts.itemArray[opts.itemNum].orig.height,
					'width':	opts.itemArray[opts.itemNum].orig.width
				});

				$("#mien_content").append($(val)).show();
				$("#mien_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedIn, function() {
					opts.animating = false;
					$.mienbox.updateDetails();
				});
			}
			else
			{
				$("#mien_content").append($(val)).show();
				$("#mien_outer").css(itemOpts).show();
				this.updateDetails();
			}
		 }
	},

	updateDetails : function() {
		$("#mien_bg").show();
		
		// 是否显示关闭按钮
		if(opts.itemArray[opts.itemNum].o.closeButtonShow)
			$("#mien_close").show();
		else
			$("#mien_close").hide();
		
		// 标题
		if (opts.itemArray[opts.itemNum].title !== undefined && opts.itemArray[opts.itemNum].title !== '') {
			$('#mien_title div').html(opts.itemArray[opts.itemNum].title);
			$('#mien_title').show();
		}
		
		// 点击内容是否关闭
		if (opts.itemArray[opts.itemNum].o.hideOnContentClick)
		{
			$("#mien_content").click($.mienbox.close);
		} else {
			$("#mien_content").unbind('click');
		}
		
		// 向前的箭头
		if (opts.itemNum != 0) {
			$("#mien_nav").append('<a id="mien_left" href="#"></a>');

			$('#mien_left').click(function() {
				$.mienbox.changeItem(opts.itemNum - 1); return false;
			});
		}
		
		// 向后的箭头
		if (opts.itemNum != (opts.itemArray.length - 1)) {
			$("#mien_nav").append('<a id="mien_right" href="#"></a>');
			
			$('#mien_right').click(function(){
				$.mienbox.changeItem(opts.itemNum + 1); return false;
			});
		}
		
		// 按键
		$(document).keydown(function(event) {
			if (event.keyCode == 27) {
            	$.mienbox.close();

			} else if(event.keyCode == 37 && opts.itemNum != 0) {
            	$.mienbox.changeItem(opts.itemNum - 1);

			} else if(event.keyCode == 39 && opts.itemNum != (opts.itemArray.length - 1)) {
            	$.mienbox.changeItem(opts.itemNum + 1);
			}
		});
	},

	preloadNeighborImages : function() { // 此处应该是图片、引用的#id内容 或 iframe之url,不能一概视为image
		if ((opts.itemArray.length - 1) > opts.itemNum) {
			preloadNextImage = new Image();
			preloadNextImage.src = opts.itemArray[opts.itemNum + 1].url;
		}

		if (opts.itemNum > 0) {
			preloadPrevImage = new Image();
			preloadPrevImage.src = opts.itemArray[opts.itemNum - 1].url;
		}
	},

	close : function() {
		if (opts.animating) return false;

		$(this.imgPreloader).unbind('load');
		$(document).unbind("keydown");

		$("#mien_loading,#mien_title,#mien_close,#mien_bg").hide();
		$("#mien_nav").empty();

		opts.active	= false;

		if (opts.itemArray[opts.itemNum].o.zoomSpeedOut > 0) {
			var itemOpts = {
				'top':		opts.itemArray[opts.itemNum].orig.pos.top - 18,
				'left':		opts.itemArray[opts.itemNum].orig.pos.left - 18,
				'height':	opts.itemArray[opts.itemNum].orig.height,
				'width':	opts.itemArray[opts.itemNum].orig.width,
				'opacity':	'hide'
			};

			opts.animating = true;

			$("#mien_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedOut, function() {
				$("#mien_content").hide().empty();
				$("#mien_overlay,#mien_bigIframe").remove();
				opts.animating = false;
			});

		} else {
			$("#mien_outer").hide();
			$("#mien_content").hide().empty();
			$("#mien_overlay,#mien_bigIframe").fadeOut("fast").remove();
		}
	},

	showLoading : function() {
		clearInterval(this.loadingTimer);

		var pos = this.getViewport();

		$("#mien_loading").css({'left': ((pos[0] - 40) / 2 + pos[2]), 'top': ((pos[1] - 40) / 2 + pos[3])}).show();
		$("#mien_loading").bind('click', $.mienbox.close);
		
		this.loadingTimer = setInterval(this.animateLoading, 66);
	},

	animateLoading : function(el, o) {
		if (!$("#mien_loading").is(':visible')){
			clearInterval($.mienbox.loadingTimer);
			return;
		}

		$("#mien_loading > div").css('top', ($.mienbox.loadingFrame * -40) + 'px');
		$.mienbox.loadingFrame = ($.mienbox.loadingFrame + 1) % 12;
	},

	init : function() {
		if (!$('#mien_wrap').length) {
			$('<div id="mien_wrap"><div id="mien_loading"><div></div></div><div id="mien_outer"><div id="mien_inner"><div id="mien_nav"></div><div id="mien_close"></div><div id="mien_content"></div><div id="mien_title"></div></div></div></div>').appendTo("body");
			$('<div id="mien_bg"><div class="mien_bg mien_bg_n"></div><div class="mien_bg mien_bg_ne"></div><div class="mien_bg mien_bg_e"></div><div class="mien_bg mien_bg_se"></div><div class="mien_bg mien_bg_s"></div><div class="mien_bg mien_bg_sw"></div><div class="mien_bg mien_bg_w"></div><div class="mien_bg mien_bg_nw"></div></div>').prependTo("#mien_inner");
			$('<table cellspacing="0" cellpadding="0" border="0"><tr><td id="mien_title_left"></td><td id="mien_title_main"><div></div></td><td id="mien_title_right"></td></tr></table>').appendTo('#mien_title');

			if ($.browser.msie) {
				$("#mien_inner").prepend('<iframe id="mien_freeIframe" scrolling="no" frameborder="0"></iframe>');
			}

			if ($.fn.fixPng) $(document).fixPng();

	    	$("#mien_close").click($.mienbox.close);
		}
	},

	getPosition : function(el) {
		var pos = el.offset();

		pos.top	+= this.num(el, 'paddingTop');
		pos.top	+= this.num(el, 'borderTopWidth');

 		pos.left += this.num(el, 'paddingLeft');
		pos.left += this.num(el, 'borderLeftWidth');

		return pos;
	},
	
	// aw, ah:
	// IMG与#mien_outer的宽度差、高度差(计算#mien_outer,#mien_inner的所有margin,border,padding)
	// w, h :
	// IMG与#mien_outer的宽度差、高度差(不计算#mien_outer的margin)
	// l, t :
	// #mien_outer的marginLeft、marginTop,用于修正坐标
	// (firefox中宽和高虽不包含padding,坐标却从padding开始, 所以一律返回margin即可正确计算)
	getBorder : function() {
		var aw = ah = w = h = l = t = 0;
		
		var o = [$("#mien_outer"), $("#mien_inner")];
		var pW = ["marginLeft", "marginRight", "paddingLeft", "paddingRight", "borderLeftWidth", "borderRightWidth"];
		var pH = ["marginTop", "marginBottom", "paddingTop", "paddingBottom", "borderTopWidth", "borderBottomWidth"];
		
		for(var i = 0; i < o.length; i++)
		{
			for(var j = 0; j < pW.length; j++)
				aw += this.num(o[i], pW[j]);
			
			for(var j = 0; j < pH.length; j++)
				ah += this.num(o[i], pH[j]);
		}
		
		w = aw;
		h = ah;
		
		// firefox的width和height不包含padding, IE包含，其他浏览器不确定，所以碰上其他浏览器此处判断不一定准确
		//if($.browser.mozilla) 
		if(true) 
		{
			for(var j = 3; j >= 0; j--)
				w -= this.num(o[0], pW[j]);
			
			for(var j = 3; j >= 0; j--)
				h -= this.num(o[0], pH[j]);
		}
		else
		{
			for(var j = 1; j >= 0; j--)
				w -= this.num(o[0], pW[j]);
			
			for(var j = 1; j >= 0; j--)
				h -= this.num(o[0], pH[j]);
		}
			
		l = this.num(o[0], pW[0]);
		t = this.num(o[0], pH[0]);

		return [aw, ah, w, h, l, t];
	},

	num : function (el, prop) {
		return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;
	},

	getPageScroll : function() {
		var xScroll, yScroll;

		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop) {
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;	
		}

		return [xScroll, yScroll]; 
	},

	getViewport : function() {
		var scroll = this.getPageScroll();
		return [$(window).width(), $(window).height(), scroll[0], scroll[1]];
	},

	getMaxSize : function(maxWidth, maxHeight, imageWidth, imageHeight) {
		var r = Math.min(Math.min(maxWidth, imageWidth) / imageWidth, Math.min(maxHeight, imageHeight) / imageHeight);
		return [Math.round(r * imageWidth), Math.round(r * imageHeight)];
	},
	
	// 全局性的修改defaults设置
	setSettings : function(settings)
	{
		$.extend(this.defaults, settings);
	},
	
	defaults : {
		startBindType:		"click", // 显示MienBox的事件
		closeBindType:		null,	 // 关闭MienBox的事件
		closeButtonShow:	true,	 // 是否显示关闭按钮
		
		hideOnContentClick:	false,	 // 点击内容时是否关闭
		
		zoomSpeedIn:		500,	 // 动态显入的时间
		zoomSpeedOut:		500,	 // 动态关闭的时间
		
		frameLeft:			null,	 // 左边位置(整型，非字符串)
		frameTop:			null,	 // 顶部位置(整型，非字符串)
		
		frameWidth:			600,	 // 宽度(整型，非字符串)
		frameHeight:		400,	 // 高度(整型，非用符串)
		
		frameBorderWidth:	"1px",	 // 边框宽度
		frameBorderColor:	"#999",	 // 边框颜色
		
		overlayShow:		false,	 // 是否显示遮蔽层
		overlayOpacity:		0.4,	 // 遮蔽层的透明度
		
		itemLoadCallback:	null	 // 回调函数
	}
};

$.fn.mienbox = function(settings)
{
	$.mienbox.set(this, settings);
}
/* end of mienbox */
})(jQuery);
