/*!
 * jQuery UI 1.8.2
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */
(function(c){c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.2",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==
"hidden")return false;b=b&&b=="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,f,g){return c.ui.isOverAxis(a,d,f)&&c.ui.isOverAxis(b,e,g)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,
NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect",
"none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",
1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==undefined)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");return(/input|select|textarea|button|object/.test(b)?
!a.disabled:"a"==b||"area"==b?a.href||!isNaN(d):!isNaN(d))&&!c(a)["area"==b?"parents":"closest"](":hidden").length},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}})(jQuery);
;

/*!
 * jQuery UI Widget 1.8.2
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Widget
 */
(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype=
b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g=
b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();
this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f,
h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=
b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
;


(function($){ // start $=jQuery encapsulation

	/* $.ui.ntgallery */

	$.widget('ui.ntgallery', {
		options:{
			browser: null,
			selector_thumbnail: 'div.nav div.thumbnails',
			selector_thumbnails: 'div.nav div.thumbnails a',
			selector_archives: 'div.nav div.archives',
			selector_viewer: 'div.viewer',
			selector_display: 'div.display',
			selector_scrollable: 'div.widget-scrollable-y',
			selectedClass: 'selected'
		},
		_archive:		null, // 2010.html
		_thumbnail:		null, // seleced 'li a'
		_article:		null, // 1.html
		_create: function(){
			this._setupArchives();
			this._setupLoadding();
			this._setupScrollable();
			this._eventify();
		},
		_setupArchives: function(){
			if( $(this.options.selector_archives, this.element).length ){
				var initial = this._archive,
					archive = this.options.selector_archives,
					label = archive +' .label',
					list = archive +' ul',
					item =  archive +' ul li',
					count = $(item, this.element).length,
					selectName = $(list, this.element).attr('class');
					labelText = $(label, this.element).text();

					menu = '<label for="'+ selectName +'">'+ labelText +'</label><select name="'+ selectName +'">';
	
				$(archive, this.element).hide();
	
				$(item, this.element).each(function(i){
					var label = $(this).text();
					var url = $(this).find('A').attr('href');
					menu += '<option value="'+ url +'">'+ label +'</option>';
					if(i === 0) {
						initial = url;
					} else if(count === (i+1)) {
						menu += '</select>';
					} 
				});
				//生成した要素を追加
				this._archive = initial;
				$(label, this.element).remove();
				$(list, this.element).remove();
				$(archive, this.element).append(menu).show();
			}
		},
		_setupLoadding: function(){
			// 先に作っておいて必要になったら表示する方がよい
			var viewer = this.options.selector_viewer;
			$(viewer, this.element).append('<div class="loading"><h3 class="title">&nbsp;</h3><div class="dummy">&nbsp;</div><p class="message">Now Loading...</p></div>');
			$(viewer +' div.loading', this.element).hide();
			
			if( $(this.options.selector_archives, this.element).length ){
				var thumbnail = this.options.selector_thumbnail;
				$(thumbnail, this.element).append('<div class="loading"><div class="dummy">&nbsp;</div><p class="message">Now Loading...</p></div>');
				$(thumbnail +' div.loading', this.element).hide();
			}
		},
		_setupScrollable: function(){
			if(this.options.browser === 'webkit'){
				var widgetEl = $(this.options.selector_scrollable, this.element);
				$(widgetEl).each(function(){
					if($(this).children('.widget-container').length === 0){
						var s = $(this).html();
						var n = '<div class="widget-container"><div class="widget-body"><div class="widget-inner">'+ s +'</div></div><div class="scrollbarY"><div class="positioner"><div class="shrinker"></div></div></div></div>';
						$(this).html(n);
					}
				});
				$('.widget-scrollable-y .widget-container').touchscrollable({
					xScrollable: false,
					yScrollable: true
				});
			}
		},
		_eventify: function(){
			var element_container = this.element;
			var element_thumbnails = $(this.options.selector_thumbnails, element_container);

			// $.proxy を使って bind すると this が変化しなくなる
			// this が変わらないので パラメータを記録／共有するには便利になるが、逆に bind された要素の指定が $(this) ではなくなるので注意
			element_thumbnails.live('click', $.proxy(this._clickHandler, this), false);
			
			if(this._archive !== null) {
				var element_archive = $(this.options.selector_archives +' select', element_container);
				element_archive.bind('change', $.proxy(this._changeHandler, this), false);
			}
		},
		_clickHandler: function(event){
			this._thumbnail = event.currentTarget; // クリックされた要素は event.currentTarget
			this._article = $(this._thumbnail).attr('href');
			this.selectThumbnail(this._thumbnail);
			this.loadResource(this._article);
			event.preventDefault();
		},
		_changeHandler: function(event){
			this._archive = $(event.currentTarget).val();
			this.loadArchive(this._archive);
			event.preventDefault();
		},
		selectThumbnail: function( e ){
			var selectedClass = this.options.selectedClass;
			$(this.options.selector_thumbnails, this.element).removeClass(selectedClass); // 選択スタイルを初期化
			$(e).addClass(selectedClass);
		},
		loadArchive: function( link ){
			var thumbnailEl = this.options.selector_thumbnail;
			var loadingEl = thumbnailEl +' div.loading';
			var listEl = thumbnailEl;
			var loadTarget = link;
			var preload = this.preloadImages;
			var fixover = this.fixOverImage;
			var newArchive = $('<div />');
			var section = this.element;
			var cHeight = $(thumbnailEl, section).height();
			var nHeight = 0;

			$(loadingEl +' .message', section).show();
			$(loadingEl, section).fadeIn(200, function(){
				$.ajax({
					url: loadTarget,
					context: $('div.thumbnails ul li'),
					dataType: 'html',
					timeout: 2000, // 単位はms
					dataFilter:  function(data) {
						var allImages = [];
						var reg = new RegExp("<img [^>]*src\s*=\s*[\"']?([^\"]+)?[^>]*>", "ig");
						var rep = new RegExp('\.\.\/images', 'i');
						var matched;
						while( matched = reg.exec(data) ){
							allImages.push(matched[1].replace(rep, "images")); // "../" を外してから配列に追加
						}
						preload(allImages);
						
						// 改良前のコード
						// パスを変える前に jQuery object にすると エラーが出てしまうため先にパスを変えてから追加
						var rgexp = new RegExp('src="\.\.\/images', 'g');
						newArchive.html(data.replace(rgexp, 'src="images')); // 受信結果をコピー
						return newArchive.html();
					},
					success: function(data, status, xhr) {
						var r = new RegExp("<meta.*?[^>]*>|<title.*?[^>]*>.*</title.*?[^>]*>", "ig");
						var s = $(data.replace(r,'')).html();
						console.log(s);
						$('div.nav', section).height($('div.nav', section).height()); //高さを縛る
						$('div.thumbnails ul', section).html(s); //ローディングが消えないように気をつける
					},
					complete: function(xhr, status) {
						if (status == 'success') {
							nHeight = $('div.thumbnails', section).height();
							if(cHeight === nHeight){
								$('div.nav', section).height('auto');
								$(loadingEl, section).delay(200).fadeOut(200);
							} else if(cHeight > nHeight) {
								var h = $('div.nav', section).height() - (cHeight - nHeight);
								$('div.nav', section).animate({height: h },200, function(){
									$(loadingEl, section).delay(200).fadeOut(200);
								});
							} else if(cHeight < nHeight) {
								var h = $('div.nav', section).height() + (nHeight - cHeight);
								$('div.nav', section).animate({height: h },200, function(){
									$(loadingEl, section).delay(200).fadeOut(200);
								});
							}
							//console.log('リクエスト成功');
						} else if (status == 'error') {
							// リクエスト失敗
							console.log('リクエスト失敗');
						} else if (status == 'timeout') {
							// タイムアウト
							console.log('タイムアウト');
						}
					}
				});
			});
		},
		loadResource: function( link ){
			var browser = this.options.browser;
			var viewerEl = this.options.selector_viewer;
			var loadingEl = viewerEl +' div.loading';
			var displayEl = viewerEl +' '+ this.options.selector_display;
			var loadTarget = link;
			var scrollable = this.enableScrollable;
			var preload = this.preloadImages;
			var fixover = this.fixOverImage;
			var newArticle = $('<div />');
			var section = this.element;

			$(loadingEl, section).fadeIn(200, function(){
				$.ajax({
					url: loadTarget,
					context: $('div.article'),
					dataType: 'html',
					timeout: 2000, // 単位はms
					beforeSend: function() {
						// 通信前にやること
					},
					dataFilter:  function(data) {
						// 画像のプリロード (先読み)
						// 後方参照 () や $x を複数のターゲットに対しておこなう
						// ループでgオプション付きの正規表現を使うときは正規表現リテラルを使わず、new RegExp()を使うとよい (ブラウザ互換)
						// src属性値だけをひっぱる正規表現 -> "<img [^>]*src\s*=\s*[\"']?([^\"]+)?[^>]*>", "ig"
						var allImages = [];
						var reg = new RegExp("<img [^>]*src\s*=\s*[\"']?([^\"]+)?[^>]*>", "ig");
						var rep = new RegExp('\.\.\/images', 'i');
						var matched;
						while( matched = reg.exec(data) ){
							allImages.push(matched[1].replace(rep, "images")); // "../" を外してから配列に追加
						}
						//console.log(all);
						preload(allImages);
						
						// 改良前のコード
						// パスを変える前に jQuery object にすると エラーが出てしまうため先にパスを変えてから追加
						var rgexp = new RegExp('src="\.\.\/images', 'g');
						newArticle.html(data.replace(rgexp, 'src="images')); // 受信結果をコピー
						return newArticle.html();
					},
					success: function(data, status, xhr) {
						$(displayEl, section).html(data);
						scrollable( $(displayEl, section) , browser);
						//console.log('success');
					},
					complete: function(xhr, status) {
						if (status == 'success') {
							// リクエスト成功
							//console.log('complete:success');
							$(loadingEl, section).delay(200).fadeOut(200);
						} else if (status == 'error') {
							// リクエスト失敗
						} else if (status == 'timeout') {
							// タイムアウト
						}
					}
				});
			});
		},
		enableScrollable: function( e, b ){
			var engine = b;
			var widgetEl = $('.widget-scrollable-y', e);
			$('.widget-scrollable-y', e).each(function(){
				if($(this).children('.widget-container').length === 0){
					var s = $(this).html();
					var n = '<div class="widget-container"><div class="widget-body"><div class="widget-inner">'+ s +'</div></div><div class="scrollbarY"><div class="positioner"><div class="shrinker"></div></div></div></div>';
					$(this).html(n);
				}
			});
			if(engine === 'webkit'){
				$('.widget-scrollable-y .widget-container', e).touchscrollable({
					xScrollable: false,
					yScrollable: true
				});
			}
		},
		fixOverImage: function (path){
			var reg = new RegExp('^..\/'), rex = reg.exec(path);
			if(rex) path = path.replace(rex[0], '');
			return path;
		},
		preloadImages: function (a){
			var objArray = [];
			var count = 0;
			$(a).each(function(){
				$('<img/>')[0].src = this;
				objArray.push($('<img/>')[0]);
			});
			for(var i = 0; i < objArray.length; i++){
				if(objArray[i].complete || objArray[i].readyState ==='complete') count++;
				//console.log(count);
				//if(count == objArray.length) console.log('画像読込み完了');
			}
		}
	});

})(jQuery);
