/**
 * 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.0.js
 * @author wokamoto - http://dogmap.jp
 * @version 0.8.0
 * @date June 16, 2009
 * @category jQuery plugin
 * @copyright (c) 2007-2009 wokamoto (dogmap.jp)
 * @license  Released under the GPL license (http://www.gnu.org/copyleft/gpl.html)
 * @example http://dogmap.jp/lightpop_sample/sample.html
 */
(function(jQuery){
	jQuery.browser = jQuery.extend(
		{chrome: /chrome/.test(navigator.userAgent.toLowerCase())} ,
		jQuery.browser
	);

	jQuery.fn.lightpop = function(settings, fileTypes, plugin_name, image_path, pre_image, pre_icon){
		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' ,
			flvplayer:		'mediaplayer.swf' ,
			iconAdd:		true ,
			detailsEnabled:		true ,
			initSize:		250 ,
			defaultLater:		1500 ,
			grouping:		true ,
			Image:			{enabled: true,	icon: pre_icon + 'image.png', param: {}, size: new Array(0, 0)} ,
			Contents:		{enabled: true,	icon: pre_icon + 'contents.png', param: {}, size: new Array(0, 0), iframeEnabled: true} ,
			Video:			{enabled: true,	icon: pre_icon + 'video.png', param: {}, size: new Array(320, 240)} ,
			YouTube:		{enabled: true,	icon: pre_icon + 'youtube.png', param: {hl:'ja'}, size: new Array(425, 355)} ,
			Metacafe:		{enabled: true,	icon: pre_icon + 'metacafe.png', param: {}, size: new Array(400, 345)} ,
			LiveLeak:		{enabled: true,	icon: pre_icon + 'liveleak.png', param: {}, size: new Array(450, 370)} ,
			GoogleVideo:		{enabled: true,	icon: pre_icon + 'googlevideo.png', param: {hl:'ja'}, size: new Array(400, 326)} ,
			ifilm:			{enabled: true,	icon: pre_icon + 'ifilm.png', param: {}, size: new Array(448, 365)} ,
			Dailymotion:		{enabled: true,	icon: pre_icon + 'dailymotion.png', param: {}, size: new Array(420, 330)} ,
			superdeluxe:		{enabled: true,	icon: pre_icon + 'superdeluxe.png', param: {}, size: new Array(400, 350)} ,
			nicovideo:		{enabled: true,	icon: pre_icon + 'nicovideo.png', param: {}, size: new Array(312, 176)}
		}, settings);
		if (settings.imageMaxWidth || settings.imageMaxHeight) {
			settings = jQuery.extend( true, settings, {
				Image: {size: new Array((settings.imageMaxWidth || 0), (settings.imageMaxHeight || 0))}
			});
		}
		var frameBorder = /^border$/i.test(settings.contentFrameType);

		var arrContent = new Array();
		arrContent.length = 0;

		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;

		fileTypes = jQuery.extend( true, {
			Image:{
				match: function(strUrl){return (settings.Image.enabled && /\.(jpe?g|gif|png|bmp)$/i.test(strUrl));} ,
				base: '/' ,
				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;
						strSrc = settings.flvplayer + '?file=' + strSrc;
					case 'swf':
						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: 'http://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: 'http://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: 'http://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: 'http://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: 'http://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: 'http://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: 'http://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: 'http://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>';
					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);
					var strSizes = 'width="' + arrSizes[0] + '" height="' + arrSizes[1] + '"';
					if (settings.Contents.iframeEnabled) {
						strSrc = '<iframe ' + strSizes + ' src="' + arrContent[contentNo].href + '" scrolling="no" style="border:solid 1px #CCC;" 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' ,
				content:  plugin_name + '-content' ,
				nav:      plugin_name + '-nav' ,
				data:     plugin_name + '-data' ,
				details:  plugin_name + '-details' ,
				loading:  plugin_name + '-loading'
			} ,
			csspath = {};
/*
			csspath = {
				overlay:  '#' + Elements_ID.overlay ,
				lightpop: '#' + Elements_ID.lightpop ,
				box:      '#' + Elements_ID.box ,
				content:  '#' + Elements_ID.content ,
				nav:      '#' + Elements_ID.nav ,
				data:     '#' + Elements_ID.data ,
				details:  '#' + Elements_ID.details ,
				loading:  '#' + Elements_ID.loading
			};
*/
		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 || new Array();
			var intImage = 0;
			jQueryObj.filter('a').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 ? 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.data + '-wrap"><div id="' + Elements_ID.data + '"><div id="' + Elements_ID.details + '"><div id="' + Elements_ID.details + '-caption" /><div id="' + Elements_ID.details + '-number" /></div><div id="' + Elements_ID.data + '-nav"><a href="#" id="' + Elements_ID.data + '-nav-close"><img src="' + settings.imageBtnClose + '" /></a></div></div></div>' : '');
			navi_htm     = navi_htm || '<div id="' + Elements_ID.nav + '"><a href="#" id="' + Elements_ID.nav + '-prev" /><a href="#" id="' + Elements_ID.nav + '-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.box + '-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').append(jQuery(lightpop_htm).hide());

			// set interface CSS
			var pageSizes  = 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
			jQuery(csspath.overlay).css({top:0, left:0, backgroundColor:settings.overlayBgColor, opacity:settings.overlayOpacity, width:pageSizes.page.width, height:pageSizes.page.height, zIndex:90});
			jQuery(csspath.lightpop).css({top:pageScroll.top + Math.round(pageSizes.window.height / 10), left:pageScroll.left, width:'100%', height:0, overflow:'visible', textAlign:'center', lineHeight:0, border:'none', zIndex:100});
			jQuery(csspath.lightpop + ' a img').css({border:'none'});

			// container
			jQuery(csspath.box).css({width:settings.initSize, height:settings.initSize, top:0, margin:'0 auto', padding:0, backgroundColor:settings.contentBgColor, border:settings.contentBorder, overflow:(frameBorder ? 'hidden' : 'visible')});
			jQuery(csspath.box + '-inner').css({width:settings.initSize, height:settings.initSize, backgroundColor:'transparent', margin:'0 auto', padding:(frameBorder ? containerBorderSize : 0), overflow:(frameBorder ? 'hidden' : 'visible')});
			jQuery(csspath.content + '-wrap').css({backgroundColor:'transparent'});
			jQuery(csspath.content).css({margin:(frameBorder ? 0 : '0 auto'), padding:(frameBorder ? 0 : containerBorderSize + 'px 0'), zIndex:110});
			if (!frameBorder) {
				var boxBorderSize = settings.boxBorderSize;
				set_box_css(false).css({position:'relative'}).hide();
				jQuery(csspath.box + '-hd'  + ',' + csspath.box + '-hdc').css({height:boxBorderSize, top:0});
				jQuery(csspath.box + '-ft'  + ',' + csspath.box + '-ftc').css({height:boxBorderSize, bottom:0});
				jQuery(csspath.box + '-hd'  + ',' + csspath.box + '-ft' ).css({margin:'0 ' + boxBorderSize + 'px 0 0'});
				jQuery(csspath.box + '-hdc' + ',' + csspath.box + '-ftc').css({margin:'0 ' + boxBorderSize*-1 + 'px 0 ' + boxBorderSize + 'px'});
			}

			// navigation
			jQuery(csspath.nav).css({top:0, left:0, height:'10px', width:'100%', padding:0, margin:(frameBorder ? '0' : settings.boxBorderSize + 'px') + ' auto', zIndex:10});
			jQuery(csspath.nav + ' a').css({display:'block', height:'100%', zoom:1, margin:(frameBorder ? 0 : '0 ' + settings.boxBorderSize + 'px'), outline:'none'});
			jQuery(csspath.nav + '-prev').css(settings.grouping ? {width:settings.imageBtnPrevWidth, left:0, styleFloat:'left'}   : {display:'none'});
			jQuery(csspath.nav + '-next').css(settings.grouping ? {width:settings.imageBtnNextWidth, right:0, styleFloat:'right'} : {display:'none'});

			// loading image
			jQuery(csspath.loading).css({top:'40%', left:0, height:'20%', width:'100%', margin:'0 auto', textAlign:'center', lineHeight:0});

			// details
			if (settings.detailsEnabled) {
				jQuery(csspath.data + '-wrap').css({font:'10px Verdana, Helvetica, sans-serif', backgroundColor:settings.contentBgColor, lineHeight:'1.4em', width:'100%', margin:'0 auto', padding:'0 ' + containerBorderSize + 'px 0', overflow:'hidden'}).hide();
				jQuery(csspath.data).css({padding:'0 ' + containerBorderSize + 'px', color:'#666', left:0, bottom:0});
				jQuery(csspath.details).css({width:'70%', styleFloat:'left', textAlign:'left'});
				jQuery(csspath.details + '-caption').css({styleFloat:'left', 'font-weight':'bold', width:'100%'});
				jQuery(csspath.details + '-number').css({styleFloat:'left', clear:'left', width:'100%', 'padding-bottom':'1em'});
				jQuery(csspath.data + '-nav-close').css({styleFloat:'right', width:settings.imageBtnCloseWidth, 'padding':'.35em 0'});
			}

			// bind event
			jQuery(csspath.overlay).fadeIn(settings.containerResizeSpeed, function(){jQuery(csspath.lightpop).show();});
			jQuery(csspath.overlay + ',' + csspath.loading + '-link,' + csspath.data + '-nav-close').click(function(){finish_lightpop(); return false;});
			window_resize(true);

			// set content
			set_content(intClickedContent);
		};

		// set content
		var set_content = function(contentNo){
			set_visibility(jQuery(csspath.data + ',' + csspath.details + ',' + csspath.details + '-caption,' + csspath.details + '-number,' + csspath.data + '-nav-close'), false);
			jQuery(csspath.nav + ',' + csspath.nav + '-prev,' + csspath.nav + '-next').hide();
			jQuery(csspath.content).hide().children().remove();
			jQuery(csspath.loading + ',' + csspath.box + ',' + csspath.box + '-inner').show();
			set_box_css(false);
			if(settings.detailsEnabled && !frameBorder && webkit){jQuery(csspath.data + '-wrap').height('auto');}
			set_content_to_view(contentNo);
		};

		// set content to view
		var set_content_to_view = function(contentNo){
			(arrContent[contentNo].content
			? function(n){jQuery(csspath.content).append(jQuery(arrContent[n].content)); setTimeout(function(){show_container(n);}, arrContent[n].later);}
			: (fileTypes[arrContent[contentNo].type].set ? fileTypes[arrContent[contentNo].type].set : (function(contentNo){set_video_info(contentNo); set_content_to_view(contentNo);}))
			)(contentNo);
		};

		// show data box
		var show_data_box = function(data_box, intWidth, intHeight, intDataboxHeight){
			if(settings.detailsEnabled) {
				intDataboxHeight = (intDataboxHeight < 28 ? 28 : intDataboxHeight);
				intHeight += intDataboxHeight;
			}
			(frameBorder
			? (function(d){jQuery(csspath.box).animate({width:intWidth, height:intHeight}, 'fast', function(){set_visibility(d, true);});})
			: (function(d){if(settings.detailsEnabled && webkit){jQuery(csspath.data + '-wrap').height(intDataboxHeight);}set_visibility(d, true);})
			)(data_box);
		};

		// show container
		var show_container = function(contentNo){
			var	containerBorderSize = settings.containerBorderSize ,
				boxBorderSize = settings.boxBorderSize ,
				contentInfo = arrContent[contentNo] ,
				pageSizes  = page_size() ,
				pageScroll = page_scroll();
			var	intWidth  = contentInfo.width  + (containerBorderSize + (frameBorder ? 0 : boxBorderSize)) * 2 ,
				intHeight = contentInfo.height + containerBorderSize * 2;

			jQuery(csspath.lightpop).animate({top:pageScroll.top + Math.round(pageSizes.window.height / 10), left:pageScroll.left}, settings.containerResizeSpeed, function(){
				jQuery(csspath.box).animate({width:intWidth, height:intHeight}, settings.containerResizeSpeed, function(){
					var fyletype = fileTypes[contentInfo.type];

					// resize content and data
					jQuery(csspath.box + '-inner').css({width:(frameBorder ? contentInfo.width : intWidth), height:contentInfo.height});
					jQuery(csspath.content).css({width:contentInfo.width, height:contentInfo.height});
					if (settings.detailsEnabled) {jQuery(csspath.data + '-wrap').css({width:contentInfo.width});}

					// set content css
					if (fyletype.content_css) {jQuery(csspath.content).children().css(fyletype.content_css);}

					// show content
					jQuery(csspath.loading).hide();
					if (/<object.*>/i.test(contentInfo.content)) {jQuery(csspath.content).show();} else {jQuery(csspath.content).fadeIn();}
					set_box_css(true);

					// set content data
					jQuery(csspath.details + '-caption').html(
						(settings.setLinkToTitle
						? '<a href="' + contentInfo.href + '" title="' + contentInfo.title + '">' + contentInfo.title + '</a>'
						: contentInfo.title
						)
					);
					jQuery(csspath.details + '-number').html(
						(settings.txtImage || contentInfo.type) +
						(settings.grouping && arrContent.length > 1
						? ' ' + (contentNo + 1) + ' ' + settings.txtOf + ' ' + arrContent.length
						: ''
						)
					);
				//	var data_box = set_visibility(jQuery(csspath.data + ',' + csspath.details + ',' + csspath.details + '-caption,' + csspath.details + '-number,' + csspath.data + '-nav-close'), false).show();
					var data_box = set_visibility(jQuery(csspath.data + ',' + csspath.details + ',' + csspath.details + '-caption,' + csspath.data + '-nav-close'), false).show();
					(settings.detailsEnabled
					? function(d,w,h){jQuery(csspath.data + '-wrap').slideDown('fast', function(){show_data_box(d, w, h, (!webkit ? jQuery(this).height() : this.scrollHeight));});}
					: function(d,w,h){show_data_box(d, w, h);}
					)(data_box, intWidth, intHeight);

					// set navigation
					jQuery(csspath.nav).css({width:intWidth}).show(function(){
						if(settings.grouping){
							jQuery(csspath.nav + '-prev,' + csspath.nav + '-next').css({height:Math.round(intHeight / 3), background:'transparent url(' + settings.imageBlank + ') no-repeat'}).unbind();
							if(contentNo != 0){
								jQuery(csspath.nav + '-prev').hover(
									function(){jQuery(this).css({background:'url(' + settings.imageBtnPrev + ') left 30% no-repeat'});} ,
									function(){jQuery(this).css({background:'transparent url(' + settings.imageBlank + ') no-repeat'});}
								).show().click((function(i){return function(){set_content(i); return false;}})(contentNo - 1));
							}
							if(contentNo != (arrContent.length - 1)){
								jQuery(csspath.nav + '-next').hover(
									function(){jQuery(this).css({background:'url(' + settings.imageBtnNext + ') right 30% no-repeat'});} ,
									function(){jQuery(this).css({background:'transparent url(' + settings.imageBlank + ') no-repeat'});}
								).show().click((function(i){return function(){set_content(i); return false;}})(contentNo + 1));
							}
						}
						keyboard_navigation(true, contentNo);
					});

					// preload contents
					if(arrContent.length - 1 > contentNo){preload(contentNo + 1);}
					if(contentNo > 0){preload(contentNo - 1);}
				});
			});
		};

		// preload
		var preload = function(contentNo){
			if(!arrContent[contentNo].content) {
				(fileTypes[arrContent[contentNo].type].preload
				? fileTypes[arrContent[contentNo].type].preload
				: (function(n){set_video_info(n);})
				)(contentNo);
			}
		};

		// get content information
		var get_sizes_from_str = function(strText, defaultSizes, maxSizes){
			var numWidth = 0, numHeight = 0;
			var arrText = strText.toLowerCase().replace(/[\r\n]/g,'').replace(/["']/g,'').match(/(width|height)=(\d+)/ig);
			if (arrText) {
				jQuery.each(arrText, function(){
					if (/^width=\d+$/i.test(this))  {numWidth  = Number(this.replace(/^width=(\d+)$/, '$1'));}
					if (/^height=\d+$/i.test(this)) {numHeight = Number(this.replace(/^height=(\d+)$/,'$1'));}
				});
			}
			if (numWidth === 0 || numHeight === 0) {
				if (defaultSizes) {
					numWidth  = defaultSizes[0];
					numHeight = defaultSizes[1];
				} else {
					var pageSizes = page_size();
					numWidth  = pageSizes.page.width / 4;
					numHeight = pageSizes.page.height / 4;
				}
			}
			if (maxSizes) {
				if (maxSizes[0] != 0 && numWidth > maxSizes[0]) {
					numHeight = numHeight * (maxSizes[0] / numWidth);
					numWidth  = maxSizes[0];
				}
				if (maxSizes[1] != 0 && numHeight > maxSizes[1]) {
					numWidth  = numWidth * (maxSizes[1] / numHeight);
					numHeight = maxSizes[1];
				}
			}
			return new Array(Math.round(numWidth), Math.round(numHeight));
		};

		var set_video_info = function(contentNo, vid, strSrc) {
			var 	arrSizes ,
				arrUrlParam = {} ,
				contentInfo = arrContent[contentNo];
			var	filetype_option = settings[contentInfo.type] ,
				fyletype = fileTypes[contentInfo.type] ,
				strUrl = contentInfo.href.replace(/&.*$/i,'');
			if (/\?.*$/.test(contentInfo.href)) {
				var arrParams = contentInfo.href.replace(/^.*\?/,'').split("&");
				if (arrParams.length > 0) {
					jQuery.each(arrParams, function(){
						var wk_matched, wk_str = this.toString();
						if (!/^(width|height|v|i|docid|id)\=.*$/i.test(wk_str)) {
							wk_matched = (wk_str).match(/^([^=]*)=(.*)$/i);
							if (wk_matched.length > 2) arrUrlParam[wk_matched[1]] = wk_matched[2];
						}
					});
				}
			}
			arrUrlParam = jQuery.extend(arrUrlParam, filetype_option.param);
			arrSizes = get_sizes_from_str(contentInfo.href, fyletype.defaultSize);

			arrContent[contentNo] = jQuery.extend(contentInfo, fyletype.getInfo(strUrl, arrSizes[0], arrSizes[1], arrUrlParam, contentInfo));
		}

		var flash_src = function(url, width, height, param, url_param, strSrc) {
			if (typeof url_param === 'object') {
				jQuery.each(url_param, function(key){
					url += (url.indexOf(key + '=') < 0
						? (url.indexOf('?') < 0 ? '?' : '&') + key + '=' + this
						: ''
						);
				});
			}
			var wkParam = {movie: url, wmode: 'transparent'};
			param = (param ? jQuery.extend(wkParam, param) : wkParam);
			strSrc = strSrc || '<object width="' + width + '" height="' + height + '"' + ' data="' + url + '" wmode="' + param.wmode + '" type="application/x-shockwave-flash">';
			jQuery.each(param, function(key){
				strSrc += '<param name="' + key + '" value="' + this + '" />';
			});
			strSrc += '</object>';
			return strSrc;
		};

		var embed_src = function(url, clsid, apl_type, width, height, param, url_param, obj_option, embed_option, flg_noembed) {
			var	strSrc = '' ,
				strEmb = '' ,
				wkParam = {src: url, width: width, height: height, type: apl_type};
			param = (param ? jQuery.extend(wkParam, param) : wkParam);
			strSrc += '<object width="' + width + '" height="' + height + '"' + (clsid != ' ' ? 'classid="clsid:' + clsid + '"' : '') + ' type="' + apl_type + '" ' + obj_option + '>';
			jQuery.each(param, function(key){
				strSrc += '<param name="' + key + '" value="' + this + '" />';
			});
			strEmb += '<embed ' +
				(embed_option !== false 
				? embed_option 
				: 'width="' + width + '" height="' + height + '"'
				);
			if (embed_option === false) {
				jQuery.each(param, function(key){strEmb += ' ' + key + '="' + this + '"';});
			}
			strEmb += '>' +
				(flg_noembed 
				? '<noembed><a href="' + url + '">' + url + '</a></noembed>'
				: ''
				) +
				'</embed>';
			strSrc += strEmb + '</object>';
			return strSrc;
		};

		// set box css
		var set_box_css = function(enable, jQueryObj, bg_transparent) {
			if (!frameBorder) {
				jQueryObj = jQuery(csspath.box + '-hd, ' + csspath.box + '-hdc, ' + csspath.box + '-bd, ' + csspath.box + '-bdc, ' + csspath.box + '-ft, ' + csspath.box + '-ftc');
				bg_transparent = 'transparent';
				if (enable) {
					jQuery(csspath.box).css({backgroundColor:bg_transparent});
					jQuery(csspath.box + '-hd').css({background:bg_transparent + ' url(' + settings.imageBox + ') left top no-repeat'});
					jQuery(csspath.box + '-hdc').css({background:bg_transparent + ' url(' + settings.imageBox + ') right top no-repeat'});
					jQuery(csspath.box + '-bd').css({background:settings.contentBgColor + ' url(' + settings.imageBorderL + ') left top repeat-y'});
					jQuery(csspath.box + '-bdc').css({background:bg_transparent + ' url(' + settings.imageBorderR + ') right top repeat-y'});
					jQuery(csspath.box + '-ft').css({background:bg_transparent + ' url(' + settings.imageBox + ') left bottom no-repeat'});
					jQuery(csspath.box + '-ftc').css({background:bg_transparent + ' url(' + settings.imageBox + ') right bottom no-repeat'});
					jQueryObj.show();
				} else {
					jQuery(csspath.box).css({backgroundColor:settings.contentBgColor});
					jQueryObj.css({background:bg_transparent});
				}
				return jQueryObj;
			}
		};

		// get Image true size
		var image_size = function(image){
			var	w = image.width ,
				h = image.height ;

			if ( typeof image.naturalWidth !== 'undefined' ) {	// for Firefox, Safari, Chrome
				w = image.naturalWidth;
				h = image.naturalHeight;

			} else if ( typeof image.runtimeStyle !== 'undefined' ) {	 // for IE
				var run = image.runtimeStyle;
				var mem = { w: run.width, h: run.height };	// keep runtimeStyle
				run.width  = "auto";
				run.height = "auto";
				w = image.width;
				h = image.height;
				run.width  = mem.w;
				run.height = mem.h;

			} else {		 // for Opera
				var mem = { w: image.width, h: image.height };	// keep original style
				image.removeAttribute("width");
				image.removeAttribute("height");
				w = image.width;
				h = image.height;
				image.width  = mem.w;
				image.height = mem.h;
			}

			return {width:w, height:h, src:image.src};
		}

		var image_set = function(contentNo, setFlag){
			image_load(arrContent[contentNo].href, (function(n, f){return function(img){
				var arrSizes = get_sizes_from_str(img.src, new Array(img.width, img.height), settings.Image.size);
				arrContent[n] = jQuery.extend(arrContent[n], {
					content:'<img src="' + img.src.replace(/\?.*$/, '') + '" width="' + arrSizes[0] + '" height="' + arrSizes[1] + '" />' ,
					width:arrSizes[0] ,
					height:arrSizes[1] ,
					later:(msie ? 250 : 100)
				});
				if (f) set_content_to_view(n);
			}})(contentNo, setFlag));
		}

		// image loader
		var image_load = function(src, onLoad, onError, delay, timeout) {
			onLoad  = onLoad  || function(){};
			onError = onError || function(){};
			delay   = delay   || 10;
			timeout = timeout || 2000;
			for (var i = 0, sz = images.length; i < sz; ++i) {
				if (images[i].src === src && images[i].complete) {
					onLoad(image_size(images[i]));
					return;
				}
			}
			var img = new Image(), tick = 0;

			img.finish = false;
			img.onabort = img.onerror = function() {
				if (img.finish) { return; }
				img.finish = true;
				onError(src);
			};
			img.onload  = function() {
				img.finish = true;
				if (opera && !img.complete) {
					onError(src);
					return;
				}
				onLoad(image_size(img));
			};
			img.src = src;
			if (!img.finish && timeout) {
				setTimeout(function() {
					if (img.finish) { return; }
					if (img.complete) {
						img.finish = true;
						if (img.width) { return; }
						onError(src);
						return;
					}
					if ((tick += delay) > timeout) {
						img.finish = true;
						onError(src);
						return;
					}
					setTimeout(arguments.callee, delay);
				}, 0);
			}
		}

		// set visibility
		var set_visibility = function(jQueryObj, enable){
			return jQueryObj.css({visibility:(enable ? 'visible' : 'hidden')});
		}

		// set keydown event
		var keyboard_navigation = function(enable, contentNo){
			jQuery(d).unbind('keydown');
			if (enable) {
				jQuery(d).keydown(function(objEvent){
					var keycode = (objEvent || event).keyCode;
					var escapeKey = (objEvent ? objEvent.DOM_VK_ESCAPE : 27);
					var key = String.fromCharCode(keycode).toLowerCase();
					if ((key == settings.keyToClose) || (key == 'x') || (keycode == escapeKey)) {
						finish_lightpop();
					} else if (settings.grouping) {
						if (((key == settings.keyToPrev) || (keycode == 37)) && contentNo != 0) {
							set_content(contentNo - 1);
						} else if (((key == settings.keyToNext) || (keycode == 39)) && contentNo != (arrContent.length - 1)) {
							set_content(contentNo + 1);
						}
					}
				});
			}
		};

		// set window resize event
		var window_resize = function(enable){
			jQuery(w).unbind('resize');
			if (enable) {
				jQuery(w).resize(function(pageSizes, pageScroll){
					pageSizes  = page_size();
					pageScroll = page_scroll();
					jQuery(csspath.overlay).css(pageSizes.page);
					jQuery(csspath.lightpop).css({top:pageScroll.top + Math.round(pageSizes.window.height / 10), left:pageScroll.left});
				});
			}
		};

		// get page sizes
		var page_size = function(pageWidth, pageHeight, windowWidth, windowHeight){
			var back_compat = !(d.compatMode && d.compatMode !== "BackCompat");
			pageWidth  = (e && e.scrollWidth  ? e : b).scrollWidth;
			pageHeight = (e && e.scrollHeight ? e : b).scrollHeight;
			windowWidth  = (back_compat ? b : e).clientWidth;
			windowHeight = (back_compat ? b : e).clientHeight;
			pageWidth  = (pageWidth  < windowWidth  ? pageWidth : windowWidth);
			pageHeight = (pageHeight < windowHeight ? windowHeight : pageHeight);
			return {
				page:   {width: pageWidth,   height: pageHeight} ,
				window: {width: windowWidth, height: windowHeight}
			};
		};

		// get page scroll
		var page_scroll = function(){
			return {
				left: (e && e.scrollLeft ? e : b).scrollLeft ,
				top:  (e && e.scrollTop  ? e : b).scrollTop
			};
		};

		// finish!
		var finish_lightpop = function(){
			set_visibility(jQuery('object',jQuery(csspath.lightpop)), false).remove();
			jQuery(csspath.lightpop).height(jQuery(csspath.box).height()).slideUp(function(){
				jQuery(this).remove();
				jQuery(csspath.overlay).fadeOut(function(){
					jQuery(this).remove();
					set_visibility(jQuery('embed, object, select'), true);	// show embed, object, select element
				});
			});
			keyboard_navigation(false);
			window_resize(false);
		};

		return init(this);
};})(jQuery);
