if ( typeof JSON === "undefined" ) {
    // IE7でJSON.parseが使えないのでJSON2使う
    "object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(t){return 10>t?"0"+t:t}function this_value(){return this.valueOf()}function quote(t){return rx_escapable.lastIndex=0,rx_escapable.test(t)?'"'+t.replace(rx_escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var r,n,o,u,f,a=gap,i=e[t];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(t)),"function"==typeof rep&&(i=rep.call(e,t,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?i+"":"null";case"boolean":case"null":return i+"";case"object":if(!i)return"null";if(gap+=indent,f=[],"[object Array]"===Object.prototype.toString.apply(i)){for(u=i.length,r=0;u>r;r+=1)f[r]=str(r,i)||"null";return o=0===f.length?"[]":gap?"[\n"+gap+f.join(",\n"+gap)+"\n"+a+"]":"["+f.join(",")+"]",gap=a,o}if(rep&&"object"==typeof rep)for(u=rep.length,r=0;u>r;r+=1)"string"==typeof rep[r]&&(n=rep[r],o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));else for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));return o=0===f.length?"{}":gap?"{\n"+gap+f.join(",\n"+gap)+"\n"+a+"}":"{"+f.join(",")+"}",gap=a,o}}var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=this_value,Number.prototype.toJSON=this_value,String.prototype.toJSON=this_value);var gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(meta={"\b":"\\b","	":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(t,e,r){var n;if(gap="",indent="","number"==typeof r)for(n=0;r>n;n+=1)indent+=" ";else"string"==typeof r&&(indent=r);if(rep=e,e&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(t,e){var r,n,o=t[e];if(o&&"object"==typeof o)for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(n=walk(o,r),void 0!==n?o[r]=n:delete o[r]);return reviver.call(t,e,o)}var j;if(text+="",rx_dangerous.lastIndex=0,rx_dangerous.test(text)&&(text=text.replace(rx_dangerous,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),rx_one.test(text.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
}

var YTL = {};


// ---------------------------------------------- //
// YTL.Util

YTL.Util = (function() {
	return {
		isNull: function(obj) {
			if ( obj === null || typeof obj === 'undefined' ) {
				return true;
			}
			return false;
		},
		fillZero: function( number, size ) {
			var s = Math.log( number ) * Math.LOG10E;
			for( i=1,n=size-s,str="";i<n;i++ ) str += "0";
			return str+number;
		}
	};
}());


// ---------------------------------------------- //
// YTL.Screen

YTL.Screen = (function(window) {
	var SCREEN_TEMPLATE = '<div style="display:none;position:absolute;top:0;left:0;background:#000;opacity:0.5;filter:alpha(opacity=50);z-index:10001;"></div>';
	var s = null;
	var setting = null;
	
	var defaultOption = {
		clickHandler: null
	};
	
	return {
		init: function(option) {
			var _this = this;
			if ( YTL.Util.isNull(s) ) {
				setting = $.extend({}, defaultOption, option);
				
				s = $(SCREEN_TEMPLATE);
				
				if ( !YTL.Util.isNull(setting.clickHandler) ) {
					s.bind('click', function() {
						setting.clickHandler();
						return false;
					});
				}
				
				$('body').append(s);
			}
			return this;
		},
		show: function(callbackFunc) {
			this.adjustSize();
			s.fadeIn(400, callbackFunc);
		},
		hide: function(callbackFunc) {
			s.fadeOut(400, callbackFunc);
		},
		adjustSize: function() {
			var ww = $(window).width();
			var wh = $(window).height();
			var sw = $('body').prop('scrollWidth');
			var sh = $('body').prop('scrollHeight');
			
			var w = ( sw > ww ) ? sw : ww;
			var h = ( sh > wh ) ? sh : wh;
			
			s.width(w);
			s.height(h);
		}
	};
}(window));


// ---------------------------------------------- //
// YTL.YouTubeIframeAPI
// https://developers.google.com/youtube/iframe_api_reference

YTL.YouTubeIframeAPI = (function() {
	var YOUTUBE_IFRAME_API_URL = 'http://www.youtube.com/iframe_api';
	var YOUTUBE_IFRAME_API_SCRIPT = '<script type="text/javascript" src="' + YOUTUBE_IFRAME_API_URL + '"></script>';

	var _API_STATE_NONE    = 0;
	var _API_STATE_ONREADY = 1;
		
	var initialized = false;
	
	var apiState = _API_STATE_NONE;
	/*
	 * YT.PlayerState.ENDED
	 * YT.PlayerState.PLAYING
	 * YT.PlayerState.PAUSED
	 * YT.PlayerState.BUFFERING
	 * YT.PlayerState.CUED
	 */
	var playerState = null;
	
	var player = null;
	
	var setupApiScript = function() {
		var apiScript = $(YOUTUBE_IFRAME_API_SCRIPT);
		var firstScript = $('script').eq(0);
		firstScript.before(apiScript);
	};
	var onPlayerReady = function(event) {
		playerState = event.data;
	};
	var onPlayerStateChange = function(event) {
		playerState = event.data;
	};
	var onPlayerError = function(event) {
		playerState = event.data;
	};
	
	return {
		API_STATE_NONE: _API_STATE_NONE,
		API_STATE_ONREADY: _API_STATE_ONREADY,
		onReadyAPI: function() {
			apiState = _API_STATE_ONREADY;
		},
		apiState: function() {
			return apiState;
		},
		init: function() {
			if ( !initialized ) {
				setupApiScript(); // ここでYouTubeIframeAPIが自動でロードされる
				initialized = true;
			}
			return this;
		},
		setupVideoPlayer: function(elementID, option) {
			if ( YTL.Util.isNull(player) ) {
				if ( YTL.Util.isNull(option) ) {
					option = {};
				}
				option.events = {
					'onReady': onPlayerReady,
					'onStateChange': onPlayerStateChange,
					'onError': onPlayerError
				};
				player = new YT.Player(elementID, option);
			}
		},
		getVideoPlayer: function() {
			return player;
		},
		playVideo: function() {
			if ( !YTL.Util.isNull(player) ) {
				try {
					player.playVideo();
				} catch (e) {
				}
			}
		},
		stopVideo: function() {
			if ( !YTL.Util.isNull(player) ) {
				try {
					player.stopVideo();
				} catch (e) {
				}
			}
		},
		pauseVideo: function() {
			if ( !YTL.Util.isNull(player) ) {
				try {
					player.pauseVideo();
				} catch (e) {
				}
			}
		},
		clearVideo: function() {
			if ( !YTL.Util.isNull(player) ) {
				try {
					player.clearVideo();
				} catch (e) {
				}
			}
		}
	};
	
}());

// このメソッドでAPIから通知を受けるので必要
// このメソッドはYTLの外
var onYouTubeIframeAPIReady = function() {
	// 通知を発行
	YTL.YouTubeIframeAPI.onReadyAPI();
};

// ---------------------------------------------- //
// YouTube API Key
// 
YTL.YOUTUBE_API_KEY = 'AIzaSyDT_VS6dRaL1o4FYi7-sJ7qU_zqYpk0TAk';

// ---------------------------------------------- //
// Get Playlist Information
// 

YTL.YouTubePlaylistData = (function() {
    var API_URL = 'https://content.googleapis.com/youtube/v3/playlists';
    var API_PART = 'id,snippet,status';
    var API_MAX_RESULTS = 50;

    var _getPlaylistInfoWithId = function(playlistId, apiKey, successHandler, errorHandler) {
        var requestParam = {
            id: playlistId,
            key: apiKey,
            part: API_PART,
            maxResults: API_MAX_RESULTS
        };
        $.ajax({
            async: true,
            cache: false,
            type: 'POST',
            data: requestParam,
            dataType: 'jsonp',
            url: API_URL,
            success: successHandler,
            error: errorHandler
        });
    };

    return {
        getPlaylistInfoWithId: function(playlistId, apiKey, successHandler, errorHandler) {
            _getPlaylistInfoWithId(playlistId, apiKey, successHandler, errorHandler);
        }
    };
}());


// ---------------------------------------------- //
// YouTubeLayerView

YTL.YouTubeLayerView = (function(window){
	var YTL_VIDEOPLAYER_ELEMENT_ID = 'ytl_player';
	var YTL_CONTAINER_TEMPLATE = '<div style="display:none;position:absolute;z-index:10002;" class="ytl"><div class="tyl_video"><div id="' + YTL_VIDEOPLAYER_ELEMENT_ID + '" /></div>';
		
	var initialized = false;
	
	var s = null;
	
	var player = null;
	
	return {
		init: function() {
			if ( !initialized ) {
				this.setupYTLContainer();
				initialized = true;
			}
			return this;
		},
		setupYTLContainer: function() {
			s = $(YTL_CONTAINER_TEMPLATE);
			$('body').append(s);
		},
		getVideoPlayerElementId: function() {
			return YTL_VIDEOPLAYER_ELEMENT_ID;
		},
		show: function(callbackFunc) {
			this.adjustPosition();
			s.fadeIn(400, callbackFunc);
		},
		hide: function(callbackFunc) {
			s.fadeOut(400, callbackFunc);
		},
		adjustPosition: function() {
			var sw = Math.floor(s.outerWidth() / 2);
			var sh = Math.floor(s.outerHeight() / 2);
			var ww = Math.floor($(window).outerWidth() / 2);
			var wh = Math.floor($(window).outerHeight() / 2);
			var st = Math.floor($(window).scrollTop());
			var sl = Math.floor($(window).scrollLeft());
			
			var t = wh - sh;
			if ( t < 0 ) {
				t = 0;
			}
			t += st;
			
			var l = ww - sw;
			if ( l < 0 ) {
				l = 0;
			}
			l += sl;
			
			s.css({top: t, left: l});
		}
	};
	
}(window));

// ---------------------------------------------- //
// YTL.YouTubeLayerController

YTL.YouTubeLayerController = (function(window) {
	
	var playlistId = null;
	
	var screenManager = null;
	var videoManager = null;
	var viewManager = null;
	
	return {
		init: function(plid) {
			
			var _this = this;
			
			if ( YTL.Util.isNull(plid) ) {
				return; // error
			}
			
			playlistId = plid;
			
			screenManager = YTL.Screen.init({
				clickHandler: function() {
					_this.hide();
				}
			});
			videoManager = YTL.YouTubeIframeAPI.init();
			viewManager = YTL.YouTubeLayerView.init();
		},
		show: function() {
			$(window).bind('resize', function(){
				screenManager.adjustSize();
				viewManager.adjustPosition();
			});
			var elementId = viewManager.getVideoPlayerElementId();
			screenManager.show(function(){
				videoManager.setupVideoPlayer(elementId, {
					width: '640',
					height: '360',
					playerVars: {
						rel: 0,
						listType:'playlist',
						list: playlistId
					}
				});
				viewManager.show();
			});
		},
		hide: function() {
			videoManager.pauseVideo();
			$(window).unbind('resize');
			viewManager.hide(function(){
				screenManager.hide();
			});
		}
	};
	
}(window));
