/**
 * jQuery lightpop plugin
 * This jQuery plugin was inspired on jQuery lightBox plugin by Leandro Vieira Pinho (http://leandrovieira.com/projects/jquery/lightbox/)
 * @name jquery.lightpop-0.8.5.js
 * @author wokamoto - http://dogmap.jp
 * @version 0.8.5
 * @date June 8, 2010
 * @category jQuery plugin
 * @copyright (c) 2007-2010 wokamoto (dogmap.jp)
 * @license  Released under the GPL license (http://www.gnu.org/copyleft/gpl.html)
 * @example http://dogmap.jp/lightpop_sample/
 */
(function(jQuery){
	jQuery.browser = jQuery.extend(
		{chrome: /chrome/i.test(navigator.userAgent)} ,
		jQuery.browser
	);

	jQuery.fn.lightpop = function(settings, fileTypes, plugin_name, image_path, pre_image, pre_icon){
		document._write = document.write;

		plugin_name = plugin_name || 'lightpop';
		image_path  = image_path  || 'images/';
		pre_image   = pre_image   || image_path + plugin_name + '-';
		pre_icon    = pre_icon    || image_path + 'icon-';

		settings = jQuery.extend( true, {
			overlayBgColor:		'#000' ,
			overlayOpacity:		0.7 ,
			contentFrameType:	'border' ,
			contentBorder:		'none' ,
			boxBorderSize:		6 ,
			containerBorderSize:	10 ,
			containerResizeSpeed:	'normal' ,
			contentBgColor:		'#FFF' ,
			imageBox:			pre_image + 'box.gif' ,
			imageBorderL:		pre_image + 'border-l.gif' ,
			imageBorderR:		pre_image + 'border-r.gif' ,
			imageLoading:		pre_image + 'ico-loading.gif' ,
			imageBtnPrev:		pre_image + 'btn-prev.gif' ,
			imageBtnNext:		pre_image + 'btn-next.gif' ,
			imageBtnClose:		pre_image + 'btn-close.gif' ,
			imageBlank:			pre_image + 'blank.gif' ,
			imageBtnPrevWidth:	63 ,
			imageBtnNextWidth:	63 ,
			imageBtnCloseWidth:	66 ,
			txtImage:			null ,
			txtOf:				'of' ,
			setLinkToTitle:		false ,
			keyToClose:			'c' ,
			keyToPrev:			'p' ,
			keyToNext:			'n' ,
			filter:				'a,area' ,
			flvplayer:			'flvplayer.swf' ,
			iconAdd:			true ,
			detailsEnabled:		true ,
			initSize:			250 ,
			defaultLater:		1500 ,
			grouping:			true ,
			Image:				{enabled: true,	icon: pre_icon + 'image.png', param: {}, size: [0, 0]} ,
			Contents:			{enabled: true,	icon: pre_icon + 'contents.png', param: {}, size: [0, 0], iframeEnabled: true, scrolling:'no', style:'border:solid 1px #CCC;'} ,
			Video:				{enabled: true,	icon: pre_icon + 'video.png', param: {}, size: [320, 240]} ,
			YouTube:			{enabled: true,	icon: pre_icon + 'youtube.png', param: {hl:'ja'}, size: [425, 355]} ,
			Metacafe:			{enabled: true,	icon: pre_icon + 'metacafe.png', param: {}, size: [400, 345]} ,
			LiveLeak:			{enabled: true,	icon: pre_icon + 'liveleak.png', param: {}, size: [450, 370]} ,
			GoogleVideo:		{enabled: true,	icon: pre_icon + 'googlevideo.png', param: {hl:'ja'}, size: [400, 326]} ,
//			ifilm:				{enabled: true,	icon: pre_icon + 'ifilm.png', param: {}, size: [448, 365]} ,
			Dailymotion:		{enabled: true,	icon: pre_icon + 'dailymotion.png', param: {}, size: [420, 330]} ,
			superdeluxe:		{enabled: true,	icon: pre_icon + 'superdeluxe.png', param: {}, size: [400, 350]} ,
			nicovideo:			{enabled: true,	icon: pre_icon + 'nicovideo.png', param: {}, size: [485, 385]}
		}, settings);
		if (settings.imageMaxWidth || settings.imageMaxHeight) {
			settings = jQuery.extend( true, settings, {
				Image: {size: [(settings.imageMaxWidth || 0), (settings.imageMaxHeight || 0)]}
			});
		}
		var frameBorder = /^border$/i.test(settings.contentFrameType);

		var arrContent = [];

		var	d = document ,
			w = window;
		var	b = d.body ,
			e = d.documentElement ,
			images = d.images;
		var	msie   = jQuery.browser.msie ,
			gecko  = jQuery.browser.mozilla ,
			opera  = jQuery.browser.opera ,
			webkit = jQuery.browser.safari || jQuery.browser.chrome;
		var boxModel = jQuery.support.boxModel;

		fileTypes = jQuery.extend( true, {
			Image:{
				match: function(strUrl){
					return (settings.Image.enabled && /\.(jpe?g|gif|png|bmp)$/i.test(strUrl));
				} ,
				defaultSize: settings.Image.size ,
				set: function(contentNo){image_set(contentNo, true);} ,
				preload: function(contentNo){image_set(contentNo, false);}
			} ,
			Video:{
				match: function(strUrl){
					return (settings.Video.enabled && /\.(flv|swf|rm|mov|3gp|mp4|asf|avi|mpg|wmv)$/i.test(strUrl));
				} ,
				defaultSize: settings.Video.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, strSrc){
					strSrc = strSrc || strUrl.replace(/\?.*$/, '');
					var arrParam = {};
					var playerAutoPlay = 'true';
					var playerEmbedOption = false;
					var embed_param = {
						rm:  {id:'CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA', type:'audio/x-pn-realaudio-plugin'} ,
						mp4: {id:'02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', type:'video/quicktime', url:'http://www.apple.com/qtactivex/qtplugin.cab'} ,
						wmv: {id:'6BF52A52-394A-11d3-B153-00C04F79FAA6', type:'application/x-oleobject', url:'http://www.microsoft.com/windows/windowsmedia'}
					};

					var video_type = strSrc.toLowerCase().match(/\.(flv|swf|rm|mov|3gp|mp4|asf|avi|mpg|wmv)$/i)[1];
					switch( video_type ){
					case 'flv':
						intHeight += 22;
						arrParam = {flashvars:'movieURL=' + strSrc + '&autoStart=' + playerAutoPlay};
						strSrc = settings.flvplayer + '?file=' + strSrc;
					case 'swf':
						arrParam = jQuery.extend( true, arrParam, {quality:'high',bgcolor:'#000'});
						strSrc = flash_src(strSrc, intWidth, intHeight, arrParam);
						break;
					case 'rm':
						arrParam = {autostart: playerAutoPlay ,controls: 'imagewindow,controlpanel'};
						strSrc = embed_src(strSrc, embed_param.rm.id, embed_param.rm.type, intWidth, intHeight, arrParam, '', '', playerEmbedOption, true);
						break;
					case 'mov':
					case 'mp4':
					case '3gp':
						intHeight += 20;
						arrParam = {
							href: strSrc ,
							controller: 'true' ,
							pluginspage: 'http://www.apple.com/quicktime/download/' ,
							autoplay: playerAutoPlay ,
							bgcolor: '000000'
						};
						strSrc = embed_src(strSrc, embed_param.mp4.id, embed_param.mp4.type, intWidth, intHeight, arrParam, ' codebase="' + embed_param.mp4.url + '"', '', playerEmbedOption, true);
						break;
					case 'wmv':
					default:
						intHeight += 20;
						if ( video_type == 'wmv' ) {
							arrParam = {
								URL: strSrc ,
								AutoStart: playerAutoPlay ,
								uiMode: 'full'
							};
							playerEmbedOption = 
								'src="' + strSrc + '" ' +
								'name="player" ' + 
								'width="' + intWidth + '" ' +
								'height="' + intHeight + '" ' +
								'type="' + embed_param.wmv.type + '" ' +
								'pluginurl="' + embed_param.wmv.url + '" ' +
								'allowchangedisplaysize="1" autosize="1" displaysize="1" showcontrols="1" showstatusbar="0" autorewind="1" ' +
								'autostart="' + (playerAutoPlay == 'false' ? '0' : '1') + '"';
						} else {
							arrParam = {
								href: strSrc ,
								autostart: playerAutoPlay ,
								uiMode: 'full'
							};
						}
						strSrc = embed_src(strSrc, embed_param.wmv.id, embed_param.wmv.type, intWidth, intHeight, arrParam, '', '', playerEmbedOption, false);
						break;
					}
					return {
						content:strSrc ,
						width:intWidth ,
						height:intHeight ,
						later:Math.round(settings.defaultLater * 2 / 3)
					}
				}
			} ,
			YouTube:{
				match: function(strUrl){
					return (settings.YouTube.enabled && /\.youtube\.com\/watch/i.test(strUrl));
				} ,
				base: 'www.youtube.com/v/' ,
				defaultSize:  settings.YouTube.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
					vid = vid || strUrl.replace(/^.*\?v=(.*)$/i, '$1');
					strSrc = strSrc || arrInfo.base + vid;
					var arrParam = {allowFullScreen:'true'};
					for (var key in arrUrlParam) {
						if (/^fmt$/i.test(key)) {
							strSrc += '&ap=%2526fmt%3D' + arrUrlParam[key];
						} else {
							strSrc += '&' + key + '=' + arrUrlParam[key];
							if (!/^hl$/i.test(key)) arrParam[key] = arrUrlParam[key];
							if (!/^fs$/i.test(key)) arrParam['allowFullScreen'] = ( arrUrlParam[key] == '1' ? 'true' : 'false' );
						}
					}
					strSrc = flash_src(strSrc, intWidth, intHeight, arrParam);
					return {content:strSrc, width:intWidth, height:intHeight, later:settings.defaultLater}
				}
			} ,
			Metacafe:{
				match: function(strUrl){
					return (settings.Metacafe.enabled && /\.metacafe\.com\/watch/i.test(strUrl));
				} ,
				base: 'www.metacafe.com/fplayer/' ,
				defaultSize: settings.Metacafe.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
					vid = vid || strUrl.replace(/^.*\/watch\/([\d]+\/[^\/]*)\/?.*$/i, '$1');
					strSrc = strSrc || arrInfo.base + vid + '.swf';
					var arrParam = {};
					strSrc = flash_src(strSrc, intWidth, intHeight, arrParam, arrUrlParam);
					return {content:strSrc, width:intWidth, height:intHeight, later:settings.defaultLater}
				}
			} ,
			LiveLeak:{
				match: function(strUrl){
					return (settings.LiveLeak.enabled && /\.liveleak\.com\/view/i.test(strUrl));
				} ,
				base: 'www.liveleak.com/player.swf?autostart=false&amp;token=' ,
				defaultSize: settings.LiveLeak.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
					vid = vid || strUrl.replace(/^.*\?i=(.*)$/i, '$1');
					strSrc = strSrc || arrInfo.base + vid;
					var arrParam = {quality:'high'};
					strSrc = flash_src(strSrc, intWidth, intHeight, arrParam, arrUrlParam);
					return {content:strSrc, width:intWidth, height:intHeight, later:settings.defaultLater}
				}
			} ,
			GoogleVideo:{
				match: function(strUrl){
					return (settings.GoogleVideo.enabled && /video\.google\.com\/videoplay/i.test(strUrl));
				} ,
				base: 'video.google.com/googleplayer.swf?docId=' ,
				defaultSize: settings.GoogleVideo.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
					vid = vid || strUrl.replace(/^.*\?docid=([a-z\d\-]+).*$/i, '$1');
					strSrc = strSrc || arrInfo.base + vid;
					var arrParam = {flashvars:''};
					strSrc = flash_src(strSrc, intWidth, intHeight, arrParam, arrUrlParam);
					return {content:strSrc, width:intWidth, height:intHeight, later:settings.defaultLater}
				}
			} ,
//			ifilm:{
//				match: function(strUrl){
//					return (settings.ifilm.enabled && /\.ifilm\.com\/video/i.test(strUrl));
//				} ,
//				base: 'www.ifilm.com/efp' ,
//				defaultSize: settings.ifilm.size ,
//				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
//					vid = vid || strUrl.replace(/\?.*$/, '').replace(/^.*\/video\/([^\/]*)[\/]?$/i, '$1');
//					strSrc = strSrc || arrInfo.base;
//					strSrc = flash_src(strSrc, intWidth, intHeight, arrParam, arrUrlParam);
//					var arrParam = {
//						flashvars: 'flvbaseclip=' + vid + '&' ,
//						quality: 'high' ,
//						bgcolor: '000000'
//					};
//					return {content:strSrc, width:intWidth, height:intHeight, later:settings.defaultLater}
//				}
//			} ,
			Dailymotion:{
				match: function(strUrl){
					return (settings.Dailymotion.enabled && /\.dailymotion\.com\/video/i.test(strUrl));
				} ,
				base: 'www.dailymotion.com/swf/' ,
				defaultSize: settings.Dailymotion.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
					vid = vid || strUrl.replace(/^.*\/video\/([^_]*).*$/i, '$1');
					strSrc = strSrc || arrInfo.base + vid;
					var arrParam = {
						allowFullScreen: 'true' ,
						allowScriptAccess: 'always'
					};
					strSrc = flash_src(strSrc, intWidth, intHeight, arrParam, arrUrlParam);
					return {content:strSrc, width:intWidth, height:intHeight, later:settings.defaultLater}
				}
			} ,
			superdeluxe:{
				match: function(strUrl){
					return (settings.superdeluxe.enabled && /\.superdeluxe\.com\/sd/i.test(strUrl));
				} ,
				base: 'i.cdn.turner.com/sdx/static/swf/share_vidplayer.swf' ,
				defaultSize: settings.superdeluxe.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
					vid = vid || strUrl.replace(/^.*\?id=(.*)$/i, '$1');
					strSrc = strSrc || arrInfo.base;
					var arrParam = {
						allowFullScreen: 'true' ,
						FlashVars: 'id=' + vid
					};
					strSrc = flash_src(strSrc, intWidth, intHeight, arrParam, arrUrlParam);
					return {content:strSrc, width:intWidth, height:intHeight, later:settings.defaultLater}
				}
			} ,
			nicovideo:{
				match: function(strUrl){
					return (settings.nicovideo.enabled && /\.nicovideo\.jp\/watch/i.test(strUrl));
				} ,
				base: 'www.nicovideo.jp/watch/' ,
				defaultSize: settings.nicovideo.size ,
				getInfo: function(strUrl, intWidth, intHeight, arrUrlParam, arrInfo, vid, strSrc){
					vid = vid || strUrl.replace(/^.*\/watch\/(.*)$/i, '$1');
					strSrc = strSrc || arrInfo.base + vid;
					strSrc = '<iframe width="' + intWidth + '" height="' + intHeight + '" src="http://www.nicovideo.jp/thumb/' + vid + '" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="' + strSrc + '">' + arrInfo.tytle + '</iframe>';
					var output = [];
					document.write = function(v){ output.push(v); }
					jQuery.getScript('http://ext.nicovideo.jp/thumb_watch/' + vid, function(){
						arrInfo.content = output.join('');;
						jQuery('#lightpop-content').html(arrInfo.content);
						output = [];
						document.write = document._write;
					});
					return {content:strSrc, width:intWidth, height:intHeight, later:Math.round(settings.defaultLater / 3)}
				}
			} ,
			Contents:{
				match: function(strUrl){
					return (settings.Contents.enabled && RegExp(w.location.host, 'i').test(strUrl) && !/\.(jpe?g|gif|png|bmp)$/i.test(strUrl));
				} ,
				defaultSize: settings.Contents.size ,
				set: function(contentNo, strSrc){
					var arrSizes = get_sizes_from_str(arrContent[contentNo].href, settings.Contents.size);
					var strSizes = 'width="' + arrSizes[0] + '" height="' + arrSizes[1] + '"';
					if (settings.Contents.iframeEnabled) {
						strSrc = '<iframe ' + strSizes + ' src="' + arrContent[contentNo].href + '" scrolling="' + settings.Contents.scrolling + '" style="' + settings.Contents.style + '" frameborder="0"><a href="' + arrContent[contentNo].href + '">' + arrContent[contentNo].tytle + '</a></iframe>';
						arrContent[contentNo] = jQuery.extend(arrContent[contentNo], {content:strSrc, width:arrSizes[0], height:arrSizes[1], later:500});
						set_content_to_view(contentNo);
					} else {
						jQuery.get(arrContent[contentNo].href, function(responseText, status){
							strSrc = '<div ' + strSizes + '>' + responseText.replace(/[\r\n]/g, '').replace(/.*<body.*?>(.*?)<\/body>.*$/, '$1').replace(/<script.*?>.*<\/script>/g, '') + '</div>';
							arrContent[contentNo] = jQuery.extend(arrContent[contentNo], {content:strSrc, width:arrSizes[0], height:arrSizes[1], later:500});
							set_content_to_view(contentNo);
						});
					}
				} ,
				preload: function(contentNo){} ,
				content_css: {textAlign:'left', lineHeight:'1.2em'}
			}
		}, fileTypes);

		// DOM Elements ID and CSS Path
		var	Elements_ID = {
				overlay: 'overlay' ,
				lightpop: plugin_name ,
				box:      plugin_name + '-box' ,
				inner:    plugin_name + '-box-inner' ,
				content:  plugin_name + '-content' ,
				nav:      plugin_name + '-nav' ,
				next:     plugin_name + '-nav-prev' ,
				prev:     plugin_name + '-nav-next' ,
				data:     plugin_name + '-data' ,
				wrap:     plugin_name + '-data-wrap' ,
				close:    plugin_name + '-data-close' ,
				details:  plugin_name + '-details' ,
				caption:  plugin_name + '-details-caption' ,
				number:   plugin_name + '-details-number' ,
				loading:  plugin_name + '-loading'
			} ,
			csspath = {};
		for (var key in Elements_ID) {
			csspath[key] = '#' + Elements_ID[key];
		}

		// initialize
		var init = function(jQueryObj, domMatchedObj){
			// image preload
			image_load(settings.imageBtnPrev,  function(img){
				settings.imageBtnPrevWidth  = (img.width > 0 ? img.width : settings.imageBtnPrevWidth);
				image_load(settings.imageBtnNext,  function(img){
					settings.imageBtnNextWidth  = (img.width > 0 ? img.width : settings.imageBtnNextWidth);
					image_load(settings.imageBtnClose, function(img){
						settings.imageBtnCloseWidth = (img.width > 0 ? img.width : settings.imageBtnCloseWidth);
						if (!frameBorder) {
							image_load(settings.imageBox, function(img){
								image_load(settings.imageBorderL, function(img){
									image_load(settings.imageBorderR, function(img){
										settings.contentBorder = 'none';
									});
								});
							});
						}
					});
				});
			});

			// get matched object
			domMatchedObj = domMatchedObj || [];
			var intImage = 0;
			jQueryObj.filter(settings.filter).each(function() {
				var location = w.location;
				var jQuery_this = jQuery(this);
				if (!/^https?:/i.test(jQuery_this.attr('href')) && /^https?:/i.test(location.protocol)) {
					jQuery_this.attr('href', (
						/^\//i.test(jQuery_this.attr('href'))
						? location.protocol + '//' + location.hostname + '/' + jQuery_this.attr('href')
						: location.href.replace(/^(.*\/).*$/i, '$1') + jQuery_this.attr('href').replace(/^\/?(.*)$/i, '$1')
					));
				}

				for (var key in fileTypes) {
					var filetype = fileTypes[key];
					if (filetype.match(jQuery_this.attr('href').replace(/\?.*$/, ''))) {
						var filetype_option = settings[key];
						// set icons to link
						if (settings.iconAdd && jQuery_this.children('img').length === 0)
							jQuery_this.css({background:'transparent url(' + filetype_option.icon + ') no-repeat scroll 1px 0pt', paddingLeft:'20px'});

						// content info
						arrContent.push({
							type:	key ,
							href:	jQuery_this.attr('href') ,
							title:	jQuery_this.attr('title') || jQuery_this.html().replace(/<[^>]*>/ig, '') ,
							base:	(filetype.base ? 'http://' + filetype.base : '/')
						});

						// bind click event
						jQuery_this.unbind('click').click(
							(function(i){return function(){start_lightpop(i); return false;}})(intImage)
						);

						// push array
						domMatchedObj.push(this);
						intImage++;
						break;
					}
				}
			});
			return new jQuery(domMatchedObj);
		};

		// start!
		var start_lightpop = function(intClickedContent, content_htm, data_htm, navi_htm, lightpop_htm){
			settings.grouping = (arrContent.length > 1 ? settings.grouping : false);

			// hide embed, object, select element
			set_visibility(jQuery('embed, object, select'), false);

			// set interface
			content_htm  = content_htm || '<div id="' + Elements_ID.content + '-wrap"><div id="' + Elements_ID.content + '" /></div>';
			data_htm     = data_htm || (settings.detailsEnabled ? '<div id="' + Elements_ID.wrap + '"><div id="' + Elements_ID.data + '"><div id="' + Elements_ID.details + '"><div id="' + Elements_ID.caption + '" /><div id="' + Elements_ID.number + '" /></div><div id="' + Elements_ID.data + '-nav"><a href="#" id="' + Elements_ID.close + '"><img src="' + settings.imageBtnClose + '" /></a></div></div></div>' : '');
			navi_htm     = navi_htm || '<div id="' + Elements_ID.nav + '"><a href="#" id="' + Elements_ID.prev + '" /><a href="#" id="' + Elements_ID.next + '" /></div><div id="' + Elements_ID.loading + '"><a href="#" id="' + Elements_ID.loading + '-link"><img src="' + settings.imageLoading + '" /></a></div>';
			lightpop_htm = lightpop_htm ||
				'<div id="' + Elements_ID.overlay +'" />' +
				'<div id="' + Elements_ID.lightpop + '"><div id="' + Elements_ID.box + '">' +
				'<div id="' + Elements_ID.inner + '">' +
				( frameBorder
				? content_htm + '</div>' + data_htm
				: '<div id="' + Elements_ID.box + '-hd"><div id="' + Elements_ID.box + '-hdc" /></div>' +
				  '<div id="' + Elements_ID.box + '-bd"><div id="' + Elements_ID.box + '-bdc">' + content_htm + data_htm + '</div></div>' +
				  '<div id="' + Elements_ID.box + '-ft"><div id="' + Elements_ID.box + '-ftc" /></div>' +
				  '</div>'
				) +
				navi_htm +
				'</div></div>';
			jQuery('body').children(':first').before(jQuery(lightpop_htm).hide());

			// set interface CSS
			var pageSize   = page_size();
			var pageScroll = page_scroll();
			var containerBorderSize = settings.containerBorderSize;

			// set position
			jQuery(csspath.overlay + ',' + csspath.lightpop + ',' + csspath.nav + ',' + csspath.loading).css({position:'absolute'});
			jQuery(csspath.box + ',' + csspath.data).css({position:'relative'});

			// overlay
			var lightpopPosition = get_popup_position(pageSize, pageScroll);
			jQuery(csspath.overlay)
				.css({top:0, left:0, backgroundColor:settings.overla
