/* =====================================================================
*
*   POCKY x THE BAWDIES SPECIAL 360 BANNER | banner.js
*
* =================================================================== */


/*----------------------------------------------------------------------
	GLOBAL OBJECT
----------------------------------------------------------------------*/

if( typeof( BW ) == "undefined" ) BW = {};
	


// window
BW.$window = jQuery( window );

// ブラウザ判別
var ua       = navigator.userAgent;
BW.isIE      = !!( jQuery.browser.msie );
BW.isIE6     = !!( jQuery.browser.msie && parseInt( jQuery.browser.version ) == 6 );
BW.isIE9     = !!( jQuery.browser.msie && parseInt( jQuery.browser.version ) == 9 );
BW.isMozilla = (ua.indexOf("Mozilla", 0) != -1);
BW.isChrome  = (ua.match(/Chrome\/([\.\d]+)/)) ? true : false;
BW.isiOs     = ( ua.indexOf('iPhone') != -1 || ua.indexOf('iPad') != -1 );
BW.enabledCSS3 = true;



/* SWFObject v2.1 <http://code.google.com/p/swfobject/>
	Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/
BW.swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("<script id=__ie_ondomload defer=true src=//:><\/script>");J=C("__ie_ondomload");if(J){I(J,"onreadystatechange",S)}}catch(q){}}if(h.webkit&&typeof K.readyState!=b){Z=setInterval(function(){if(/loaded|complete/.test(K.readyState)){E()}},10)}if(typeof K.addEventListener!=b){K.addEventListener("DOMContentLoaded",E,null)}R(E)}();function S(){if(J.readyState=="complete"){J.parentNode.removeChild(J);E()}}function E(){if(e){return }if(h.ie&&h.win){var v=a("span");try{var u=K.getElementsByTagName("body")[0].appendChild(v);u.parentNode.removeChild(u)}catch(w){return }}e=true;if(Z){clearInterval(Z);Z=null}var q=o.length;for(var r=0;r<q;r++){o[r]()}}function f(q){if(e){q()}else{o[o.length]=q}}function R(r){if(typeof j.addEventListener!=b){j.addEventListener("load",r,false)}else{if(typeof K.addEventListener!=b){K.addEventListener("load",r,false)}else{if(typeof j.attachEvent!=b){I(j,"onload",r)}else{if(typeof j.onload=="function"){var q=j.onload;j.onload=function(){q();r()}}else{j.onload=r}}}}}function H(){var t=N.length;for(var q=0;q<t;q++){var u=N[q].id;if(h.pv[0]>0){var r=C(u);if(r){N[q].width=r.getAttribute("width")?r.getAttribute("width"):"0";N[q].height=r.getAttribute("height")?r.getAttribute("height"):"0";if(c(N[q].swfVersion)){if(h.webkit&&h.webkit<312){Y(r)}W(u,true)}else{if(N[q].expressInstall&&!A&&c("6.0.65")&&(h.win||h.mac)){k(N[q])}else{O(r)}}}}else{W(u,true)}}}function Y(t){var q=t.getElementsByTagName(Q)[0];if(q){var w=a("embed"),y=q.attributes;if(y){var v=y.length;for(var u=0;u<v;u++){if(y[u].nodeName=="DATA"){w.setAttribute("src",y[u].nodeValue)}else{w.setAttribute(y[u].nodeName,y[u].nodeValue)}}}var x=q.childNodes;if(x){var z=x.length;for(var r=0;r<z;r++){if(x[r].nodeType==1&&x[r].nodeName=="PARAM"){w.setAttribute(x[r].getAttribute("name"),x[r].getAttribute("value"))}}}t.parentNode.replaceChild(w,t)}}function k(w){A=true;var u=C(w.id);if(u){if(w.altContentId){var y=C(w.altContentId);if(y){M=y;l=w.altContentId}}else{M=G(u)}if(!(/%$/.test(w.width))&&parseInt(w.width,10)<310){w.width="310"}if(!(/%$/.test(w.height))&&parseInt(w.height,10)<137){w.height="137"}K.title=K.title.slice(0,47)+" - Flash Player Installation";var z=h.ie&&h.win?"ActiveX":"PlugIn",q=K.title,r="MMredirectURL="+j.location+"&MMplayerType="+z+"&MMdoctitle="+q,x=w.id;if(h.ie&&h.win&&u.readyState!=4){var t=a("div");x+="SWFObjectNew";t.setAttribute("id",x);u.parentNode.insertBefore(t,u);u.style.display="none";var v=function(){u.parentNode.removeChild(u)};I(j,"onload",v)}U({data:w.expressInstall,id:m,width:w.width,height:w.height},{flashvars:r},x)}}function O(t){if(h.ie&&h.win&&t.readyState!=4){var r=a("div");t.parentNode.insertBefore(r,t);r.parentNode.replaceChild(G(t),r);t.style.display="none";var q=function(){t.parentNode.removeChild(t)};I(j,"onload",q)}else{t.parentNode.replaceChild(G(t),t)}}function G(v){var u=a("div");if(h.win&&h.ie){u.innerHTML=v.innerHTML}else{var r=v.getElementsByTagName(Q)[0];if(r){var w=r.childNodes;if(w){var q=w.length;for(var t=0;t<q;t++){if(!(w[t].nodeType==1&&w[t].nodeName=="PARAM")&&!(w[t].nodeType==8)){u.appendChild(w[t].cloneNode(true))}}}}}return u}function U(AG,AE,t){var q,v=C(t);if(v){if(typeof AG.id==b){AG.id=t}if(h.ie&&h.win){var AF="";for(var AB in AG){if(AG[AB]!=Object.prototype[AB]){if(AB.toLowerCase()=="data"){AE.movie=AG[AB]}else{if(AB.toLowerCase()=="styleclass"){AF+=' class="'+AG[AB]+'"'}else{if(AB.toLowerCase()!="classid"){AF+=" "+AB+'="'+AG[AB]+'"'}}}}}var AD="";for(var AA in AE){if(AE[AA]!=Object.prototype[AA]){AD+='<param name="'+AA+'" value="'+AE[AA]+'" />'}}v.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+AF+">"+AD+"</object>";i[i.length]=AG.id;q=C(AG.id)}else{if(h.webkit&&h.webkit<312){var AC=a("embed");AC.setAttribute("type",P);for(var z in AG){if(AG[z]!=Object.prototype[z]){if(z.toLowerCase()=="data"){AC.setAttribute("src",AG[z])}else{if(z.toLowerCase()=="styleclass"){AC.setAttribute("class",AG[z])}else{if(z.toLowerCase()!="classid"){AC.setAttribute(z,AG[z])}}}}}for(var y in AE){if(AE[y]!=Object.prototype[y]){if(y.toLowerCase()!="movie"){AC.setAttribute(y,AE[y])}}}v.parentNode.replaceChild(AC,v);q=AC}else{var u=a(Q);u.setAttribute("type",P);for(var x in AG){if(AG[x]!=Object.prototype[x]){if(x.toLowerCase()=="styleclass"){u.setAttribute("class",AG[x])}else{if(x.toLowerCase()!="classid"){u.setAttribute(x,AG[x])}}}}for(var w in AE){if(AE[w]!=Object.prototype[w]&&w.toLowerCase()!="movie"){F(u,w,AE[w])}}v.parentNode.replaceChild(u,v);q=u}}}return q}function F(t,q,r){var u=a("param");u.setAttribute("name",q);u.setAttribute("value",r);t.appendChild(u)}function X(r){var q=C(r);if(q&&(q.nodeName=="OBJECT"||q.nodeName=="EMBED")){if(h.ie&&h.win){if(q.readyState==4){B(r)}else{j.attachEvent("onload",function(){B(r)})}}else{q.parentNode.removeChild(q)}}}function B(t){var r=C(t);if(r){for(var q in r){if(typeof r[q]=="function"){r[q]=null}}r.parentNode.removeChild(r)}}function C(t){var q=null;try{q=K.getElementById(t)}catch(r){}return q}function a(q){return K.createElement(q)}function I(t,q,r){t.attachEvent(q,r);d[d.length]=[t,q,r]}function c(t){var r=h.pv,q=t.split(".");q[0]=parseInt(q[0],10);q[1]=parseInt(q[1],10)||0;q[2]=parseInt(q[2],10)||0;return(r[0]>q[0]||(r[0]==q[0]&&r[1]>q[1])||(r[0]==q[0]&&r[1]==q[1]&&r[2]>=q[2]))?true:false}function V(v,r){if(h.ie&&h.mac){return }var u=K.getElementsByTagName("head")[0],t=a("style");t.setAttribute("type","text/css");t.setAttribute("media","screen");if(!(h.ie&&h.win)&&typeof K.createTextNode!=b){t.appendChild(K.createTextNode(v+" {"+r+"}"))}u.appendChild(t);if(h.ie&&h.win&&typeof K.styleSheets!=b&&K.styleSheets.length>0){var q=K.styleSheets[K.styleSheets.length-1];if(typeof q.addRule==Q){q.addRule(v,r)}}}function W(t,q){var r=q?"visible":"hidden";if(e&&C(t)){C(t).style.visibility=r}else{V("#"+t,"visibility:"+r)}}function g(s){var r=/[\\\"<>\.;]/;var q=r.exec(s)!=null;return q?encodeURIComponent(s):s}var D=function(){if(h.ie&&h.win){window.attachEvent("onunload",function(){var w=d.length;for(var v=0;v<w;v++){d[v][0].detachEvent(d[v][1],d[v][2])}var t=i.length;for(var u=0;u<t;u++){X(i[u])}for(var r in h){h[r]=null}h=null;for(var q in swfobject){swfobject[q]=null}swfobject=null})}}();return{registerObject:function(u,q,t){if(!h.w3cdom||!u||!q){return }var r={};r.id=u;r.swfVersion=q;r.expressInstall=t?t:false;N[N.length]=r;W(u,false)},getObjectById:function(v){var q=null;if(h.w3cdom){var t=C(v);if(t){var u=t.getElementsByTagName(Q)[0];if(!u||(u&&typeof t.SetVariable!=b)){q=t}else{if(typeof u.SetVariable!=b){q=u}}}}return q},embedSWF:function(x,AE,AB,AD,q,w,r,z,AC){if(!h.w3cdom||!x||!AE||!AB||!AD||!q){return }AB+="";AD+="";if(c(q)){W(AE,false);var AA={};if(AC&&typeof AC===Q){for(var v in AC){if(AC[v]!=Object.prototype[v]){AA[v]=AC[v]}}}AA.data=x;AA.width=AB;AA.height=AD;var y={};if(z&&typeof z===Q){for(var u in z){if(z[u]!=Object.prototype[u]){y[u]=z[u]}}}if(r&&typeof r===Q){for(var t in r){if(r[t]!=Object.prototype[t]){if(typeof y.flashvars!=b){y.flashvars+="&"+t+"="+r[t]}else{y.flashvars=t+"="+r[t]}}}}f(function(){U(AA,y,AE);if(AA.id==AE){W(AE,true)}})}else{if(w&&!A&&c("6.0.65")&&(h.win||h.mac)){A=true;W(AE,false);f(function(){var AF={};AF.id=AF.altContentId=AE;AF.width=AB;AF.height=AD;AF.expressInstall=w;k(AF)})}}},getFlashPlayerVersion:function(){return{major:h.pv[0],minor:h.pv[1],release:h.pv[2]}},hasFlashPlayerVersion:c,createSWF:function(t,r,q){if(h.w3cdom){return U(t,r,q)}else{return undefined}},removeSWF:function(q){if(h.w3cdom){X(q)}},createCSS:function(r,q){if(h.w3cdom){V(r,q)}},addDomLoadEvent:f,addLoadEvent:R,getQueryParamValue:function(v){var u=K.location.search||K.location.hash;if(v==null){return g(u)}if(u){var t=u.substring(1).split("&");for(var r=0;r<t.length;r++){if(t[r].substring(0,t[r].indexOf("="))==v){return g(t[r].substring((t[r].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(A&&M){var q=C(m);if(q){q.parentNode.replaceChild(M,q);if(l){W(l,true);if(h.ie&&h.win){M.style.display="block"}}M=null;l=null;A=false}}}}}();




/*-----------------------------------------------------
	Flashからのイベント関連
-----------------------------------------------------*/

function FlashBannerMouseOver(){
	BW.ServiceManager.trigger( BW.ServiceManager.ON_CONTROLLER_MOUSE_OVER );
}

function FlashBannerMouseOut(){
	BW.ServiceManager.trigger( BW.ServiceManager.ON_CONTROLLER_MOUSE_OUT );
}

function FlashBannerMouseMove( i_event ){
	BW.ServiceManager.trigger( BW.ServiceManager.ON_CONTROLLER_MOUSE_MOVE, [ i_event ] );
}
function FlashBannerClick(){
	BW.ServiceManager.trigger( BW.ServiceManager.ON_CONTROLLER_CLICK );
}









/*-----------------------------------------------------
	もろもろ標管理用
-----------------------------------------------------*/

BW.ServiceManager = ( function() {
	
	var self;
	
	return {
		
		//---- 基本情報 ----//
		// dispatcher
		_dispatcher : $({}),
		
		// リダイレクト先
		POCKY_BAWDIES_360_URL : "http://web.pocky.jp/360/top/index.html",	
		
		// イベント
		ON_WINDOW_RESIZE         : "onWindowResize",
		ON_CONTROLLER_MOUSE_OVER : "oncontrollerMouseOver",
		ON_CONTROLLER_MOUSE_OUT  : "oncontrollerMouseOut",
		ON_CONTROLLER_MOUSE_MOVE : "oncontrollerMouseMove",
		ON_CONTROLLER_CLICK		 : "oncontrollerClick",
		
		// バナーのセレクタ
		CONTROLLER_ELEMENT_NAME : "PockyBanner",
		CONTROLLER_ELEMENT_SELECTER : "#PockyBanner",
		
		
		//---- Flash関連( FlashManagerに移動させたい ) ----//
		// flash有効、無効
		enabledFlash : BW.swfobject.hasFlashPlayerVersion( "10" ),
		
		
		//---- バナー関連 ----//
		// 本体
		banner : null,
		
		// swf
		bannerSWF : "./js/banner-parts/swf/controller.swf",		
		
		// サイズ
		bannerWidth : 545,
		bannerHeight : 100,
		
		// メイン
		// 本体
		// もともと存在しているFlashElement
		currentFlashSelecter : "#MainFlashPromoWrapper",
		current : null,
		
		
		// Flash埋め込み先　
		mainPrependTarget : "#mainColumn",
		
		// FlashのWrapper
		mainBannerFlashWrapper : null,
		main : null,
		
		
		
		
		/*---- flashobject ----*/
		flashSpacer         : null,
		currentFlashObject : null,
		mainFlashObject    : null,
		
		
		
		
		
		// 正常埋め込み完了フラグ
		completeEmbedMainFlash : false,
		
		
		// コントロール許可
		enabledControll : true,
		
		// 開始アニメーション終了フラグ
		isMainStart : false,
		
		// 開始アニメーション呼びフラグ
		isMainCallStart : false,
		
		// sef
		mainSWF : "./js/banner-parts/swf/main.swf",		
		
		// サイズ
		mainWidth : 545,
		mainHeight : 370,
		
		
		
		//---- 動作の値 ----//
		// 動く値の倍率
		MAX_ACTIVE_RATE : 1.0,
		MIN_ACTIVE_RATE : 0.5,
		
		// 傾き倍率
		MAX_ROTATION_RATE : 0.2,
		MIN_ROTATION_RATE : 0.01,
		
		// hand, pageの移動倍率
		PAPER_ACTIVE_RATE : 0.3,
		PAPER_ROTATION_RATE : 0.01,
		
		// マウス移動量との要素に追加する移動量の率
		MOUSE_TO_ACTIVE_RATE : 0.3,
		
		// 			"				 角度移動量の率
		MOUSE_TO_ROTATION_RATE : 0.1,
		
		// マウス座標
		mouseX : 0,
		mouseY : 0,
		
		// コントローラ上のマウス座標
		controllerMouseX : 0,
		controllerMouseY : 0,
		
		// ウインドウサイズ
		windowWidth : 0,
		windowHeight : 0,
		
		// コントローラサイズ
		controllerWidth : 0,
		controllerHeight : 0,
		
		// コントローラー要素
		controller : $( {} ),
		
		// リサイズ時に中央によらせる要素
		centerElements : [],
		
		// centerにマージン調節する
		centerModels : [],
		
		// テンプレートHTML関連
		templateList : [],
		
		
		/*-----------------------------------------------------
			初期化
		-----------------------------------------------------*/

		init : function() {
		
			self = BW.ServiceManager;
			
			
			// コントローラー取得
			self.controller = $( self.CONTROLLER_ELEMENT_SELECTER );
			self.controller.load( function() {
				
				// イベント追加
				// Flashがない場合、これで代用
				// Flashが存在する場合、Flash側からの通知でイベント発動
				if( !self.enabledFlash ) {
				
					// mouse enter
					self.controller.bind( "mouseenter", function() {
						self.trigger( BW.ServiceManager.ON_CONTROLLER_MOUSE_OVER );	
					} );
					
					// mouse leave
					self.controller.bind( "mouseleave", function() {
						self.trigger( BW.ServiceManager.ON_CONTROLLER_MOUSE_OUT );
					} );
					
					// mouse move
					$( document ).bind( "mousemove", self._onMouseMove );
					
					// click
					self.controller.bind( "click", function() {
						self.trigger( BW.ServiceManager.ON_CONTROLLER_CLICK );
					} );
					
				}
				
				// 読み込み完了後、幅高さ取得
				self.controllerWidth  = self.controller.width();
				self.controllerHeight = self.controller.height();
			} );
			
			
			if( self.enabledFlash ) {
				// マウス座標管理
				BW.ServiceManager.bind( self.ON_CONTROLLER_MOUSE_MOVE, self._onMouseMove );

			}
			
			
			// リサイズ対応
			$( window ).resize( self._resize );
			
			// リサイズ実行
			self._resize();
		},
		
		
		
		/*-----------------------------------------------------
			マウス移動
		-----------------------------------------------------*/
		
		_onMouseMove : function( i_event, mousePoint ) {
			
			// 現在のマウス座標取得
			if ( i_event ) {
				if( mousePoint ) {
					self.mouseX = mousePoint.mouseX;
					self.mouseY = mousePoint.mouseY;
				
				} else {
					self.mouseX = i_event.pageX - (document.documentElement.scrollLeft || document.body.scrollLeft );
					self.mouseY = i_event.pageY - (document.documentElement.scrollTop || document.body.scrollTop );
				}
			} else {
				self.mouseX = event.x;
				self.mouseY = event.y;
			}
			
			
			// コントローラ上でのマウス座標
			if( self.enabledFlash && self.banner && typeof self.banner.getMousePoint == "function" ){
				var mouse = self.banner.getMousePoint();
				self.controllerMouseX = mouse.mouseX;
				self.controllerMouseY = mouse.mouseY;
			} else {
				var controllerXY = getElementXY( self.controller );
				self.controllerMouseX = self.mouseX - controllerXY.x;
				self.controllerMouseY = self.mouseY - controllerXY.y;
			}
			
			// 開始済みかつ、動作許可
			//if( self.enabledControll && self.isMainStart ) {
			if( self.enabledControll  ) {
				// メインFlashに現在のマウス座標を渡す
				if( typeof self.main.setMousePoint == "function" ){
					self.main.setMousePoint( self.controllerMouseX, self.controllerMouseY );
				}
			} 
			
		},
		
		
		
		/*-----------------------------------------------------
			centerFix
		-----------------------------------------------------*/
		
		addSenterFixElement : function( i_element ) {
			self.centerElements.push( i_element );
			self._resize();
		},
		
		addCenterFixModel : function( i_model ) {
			self.centerModels.push( i_model );
			self._resize();
		},
		
		
		/*-----------------------------------------------------
			リサイズ
		-----------------------------------------------------*/
		
		_resize : function() {
			
			// ウインドウサイズ取得
			self.windowWidth  = $( window ).width();
			self.windowHeight = $( window ).height();
			
			var documentWidth = $( document ).width();
			var documentHeight = $( document ).height();
			
			
			if( BW.isIE9 ) {
				documentWidth -= 17;
			}
			
			// 大きい方でまわす
			var max = Math.max( self.centerModels.length, self.centerElements.length );
			for( var i = max; i--; ) {
				
				var e = self.centerElements[ i ];
				var m = self.centerModels[ i ];
				if( e ) {
					e.css( { "left" : ( (documentWidth- e.width() ) * 0.5 ) + "px", "top" : ( ( self.windowHeight  - e.height() ) * 0.5 ) + "px" } );
				}
				if( m ) {
					m.original.marginLeft = ( documentWidth - m.original.width ) * 0.5;
					//m.original.marginTop = ( self.windowHeight - m.original.height ) * 0.5;
				}
			}
		},
		
		
		/*-----------------------------------------------------
			テンプレートHTML登録
		-----------------------------------------------------*/
		
		addTemplateHTML : function( i_key, i_html ) {
			self.templateList[ i_key ] = i_html;
		},
		
		/*-----------------------------------------------------
			テンプレート取得
		-----------------------------------------------------*/
		
		getTemplateHTML : function( i_key ) {
			return self.templateList[ i_key ];
		},
		getTemplateElement : function( i_key ) {
			return $(self.templateList[ i_key ]);
		},
		
		
		/*-----------------------------------------------------
			リダイレクト
		-----------------------------------------------------*/
		
		redirect : function() {
			location.href = self.POCKY_BAWDIES_360_URL;
		},
		
		
		/*-----------------------------------------------------
			event 
		-----------------------------------------------------*/
		
		bind    : function( i_type, i_callBackFunction ){ self._dispatcher.bind( i_type, i_callBackFunction ); },
		unbind  : function( i_type, i_callBackFunction ){ self._dispatcher.unbind( i_type, i_callBackFunction ); },
		trigger : function( i_type, i_params ){ self._dispatcher.trigger( i_type, i_params ? i_params : [] ); }
	};
} )();




/*-----------------------------------------------------
	動かす要素保持
-----------------------------------------------------*/

BW.ActiveElementDataStore = ( function() {
	
	var self;
	
	
	// いろいろ
	
	
	return {
		
		// 画像要素のセレクター
		elementSelecters : [ ".linkBnr", "#happens .thickbox > img:lt(4)", "#pages > img[src='images/fakeAD_text001.gif']",
		"#pages > img[src='css/home/ad_ph.jpg']", "#pages > img[src='images/fakeAD_w250_005.gif']" ],
		
		// headerセレクタ
		headerSelecter : "#header",
	
		// pageセレクタ
		pageSelecter : "#pages",
		
		// hands
		handsSelecter : "#ftHands",
		
		// 要素たち
		data : [],
		
		
		// 初期化
		init : function() {
			
			self = BW.ActiveElementDataStore;
			
			// 動かす要素を取得
			if( !BW.isIE ) {
				// IE以外のみ
				self.scanElements();
			}
			
			// page部分
			self.scanPage();
			
			// 手部分
			self.scanHands();
			
		},
		
		
		
		
		/*-----------------------------------------------------
			hands要素を取得
		-----------------------------------------------------*/
		
		scanHands : function() {
			
			// 手
			var $_this = $( self.handsSelecter );
			
			// ActiveElementModelを生成
			var model = new ActiveElementModel( $_this, "hands" );
			
			// 移動量
			model.overlap *= BW.ServiceManager.PAPER_ACTIVE_RATE;
			model.easing  *= BW.ServiceManager.PAPER_ACTIVE_RATE;
			
			// 角度
			model.rotationOverLap *= BW.ServiceManager.PAPER_ROTATION_RATE;
			model.rotationEasing  *= BW.ServiceManager.PAPER_ROTATION_RATE;
			
			
			// マウスを無効に
			$_this.css( "pointer-events", "none" );
			
			// 保持
			self.data.push( model );
		},
		
		
		/*-----------------------------------------------------
			page要素を取得
		-----------------------------------------------------*/
		
		scanPage : function() {
			
			var $_this = $( self.pageSelecter );
			
			// ActiveElementModelを生成
			var model = new ActiveElementModel( $_this, "page" );
			
			// 移動量
			model.overlap *= BW.ServiceManager.PAPER_ACTIVE_RATE;
			model.easing  *= BW.ServiceManager.PAPER_ACTIVE_RATE;
			
			// 角度
			model.rotationOverLap *= BW.ServiceManager.PAPER_ROTATION_RATE;
			model.rotationEasing  *= BW.ServiceManager.PAPER_ROTATION_RATE;
			
			
			// リサイズ時に中央に表示する様に
			BW.ServiceManager.addCenterFixModel( model );
			
				
			// 保持
			self.data.push( model );
		
		},
		
		
		
		
		/*-----------------------------------------------------
			画像要素を取得
		-----------------------------------------------------*/
		
		scanElements : function() {
			
			var len = self.elementSelecters.length;
			for( var i = 0; i < len; i++ ) {
				
				var selecter = self.elementSelecters[ i ];
				var isTickBox = false;
				
				
				
				
				$( selecter ).not( BW.ServiceManager.CONTROLLER_ELEMENT_SELECTER ).each( function() { 
					var $_this = $( this );
					var $_parent = $_this.parent();
					
					
					$_this.load( function() {
					
						// 画像読み込みイベント後
						
						// ID無い場合付与
						if( $_this.attr( "id" ) == "" ) $_this.attr( "id", "ActiveElementModel" + self.data.length );
						
						
						// ActiveElementModelを生成
						var model = new ActiveElementModel( $_this, "img" );
						
						
						// 空間保持用のダミー
						/*
						$dummy = $_this.clone( false );
						$dummy.css( { "width" : $_this.css( "width" ), "height" : $_this.css( "height" ), "background" : "#FF0000", "opacity" : 0.1 } );
						
						// マウスを無効に( IEヒタイオウ？ )
						$dummy.css( "pointer-events", "none" );
						
						// ダミー表示
						$_parent.append( $dummy );
						*/
						
						
						// ランダムな倍率で値を変更
						// 倍率
						var rate = ( Math.random() * ( BW.ServiceManager.MAX_ACTIVE_RATE - BW.ServiceManager.MIN_ACTIVE_RATE ) ) + BW.ServiceManager.MIN_ACTIVE_RATE;
						
						
						// 値更新
						
						
						if( $_parent.attr( "class" ) == "thickbox" ) {
							
							model.overlap *= 0.05;
							model.easing *= 0.05;
							
						} else {
							model.overlap *= rate;
							model.easing *= rate;
						}
						
						// 角度
						rate = ( Math.random() * ( BW.ServiceManager.MAX_ROTATION_RATE - BW.ServiceManager.MIN_ROTATION_RATE ) ) + BW.ServiceManager.MIN_ROTATION_RATE;
						model.rotationOverLap *= rate;
						model.rotationEasing *= rate;
						
						
						// マウスを無効に
						//$_this.css( "pointer-events", "none" );
						//$_this.css( "position", "absolute" );
						
						// 保持
						self.data.push( model );
								
					} );
					
					
					
					// 再ロード
					// 画像読み込みイベントを強制発動するため
					var src = $_this.attr( "src" );
					$_this.attr( "src", "" );
					$_this.attr( "src", src );
					
				} );
			}
		}
		
	}

} )();








/*-----------------------------------------------------
	データ
-----------------------------------------------------*/

function ActiveElementModel( i_current, i_type ) {
	
	// 自身
	this.client = i_current;
	
	// タイプ( render内でこれ見て処理わける )
	this.type = i_type;
	
	// ベクトル
	this.vx = 0;
	this.vy = 0;
	this.vrx = 0;
	this.vry = 0;
	
	// 行き過ぎる度合い
	this.overlap = 0.2;
	
	this.rotationOverLap = 0.1;
	
	// easing
	this.easing = 0.3;
	this.rotationEasing = 0.95;
	
	// 摩擦
	this.friction = 0.98;
	this.rotationFriction = 0.98;
	
	// properties
	this.x  = 0;
	this.y  = 0;
	
	// 傾き
	this.rotationX = 0;
	this.rotationY = 0;
	
	// id
	this.id = this.client.attr( "id" );
	// original paramaters
	this.original = {};
	// margin
	this.original.marginLeft   = this.client.css( "marginLeft" )   == "auto" ? 0 : this.client.css( "marginLeft" ).pixcelToInt();
	this.original.marginRight  = this.client.css( "marginRight" )  == "auto" ? 0 : this.client.css( "marginRight" ).pixcelToInt();
	this.original.marginTop    = this.client.css( "marginTop" )    == "auto" ? 0 : this.client.css( "marginTop" ).pixcelToInt();
	this.original.marginBottom = this.client.css( "marginBottom" ) == "auto" ? 0 : this.client.css( "marginBottom" ).pixcelToInt();
	// offset
	this.offset           = getElementXY( this.client );
	this.original.offsetX = this.offset.x;
	this.original.offsetY = this.offset.y;
	// size
	this.original.width  = this.client.css( "width" ).pixcelToInt();
	this.original.height = this.client.css( "height" ).pixcelToInt();
};



/*-----------------------------------------------------
	描画メソッド
-----------------------------------------------------*/

ActiveElementModel.prototype.render = function() {
	
	var targetMarginLeft, targetMarginTop, css;
	
	// left
	targetMarginLeft = ( this.original.marginLeft + this.x );
	targetMarginLeft += "px";
	
	// top
	targetMarginTop = ( this.original.marginTop + this.y );
	targetMarginTop += "px";
	
	// CSS要素
	css = { marginLeft : targetMarginLeft, marginTop : targetMarginTop };
	
	
	// 画像要素のみ
	if( BW.enabledCSS3 && this.type == "img" ) {
		var setting = "rotate("+(this.rotationX*-1)+"deg)";
		css[ "-webkit-transform" ] = setting;
		css[ "-moz-transform" ]    = setting;
		//css[ "ms-transform" ]      = setting;
	}
	
	// 適用
	this.client.css( css );
};











/*-----------------------------------------------------
	パノラマバナーを管理
-----------------------------------------------------*/

BW.PanoramaBannerController = ( function() {
	
	var self;
	
	// 再生中フラグ
	var _isPlaying = false;
	
	
	// 前回座標
	var _lastControllerMouseX = 0;
	var _lastControllerMouseY = 0;
	var _lastMouseX = 0;
	var _lastMouseY = 0;
	
	return {
		
		/*-----------------------------------------------------
			初期化
		-----------------------------------------------------*/
		
		init : function() {
			
			enabled : true,
			
			// 自身を保持
			self = BW.PanoramaBannerController;
			
			// enter frame処理
			EnterFrameManager.add( "update", self._update );
			
			if( BW.ServiceManager.enabledFlash ) {
				
				// バナーフラッシュ埋め込み
				var vars       = {};
				var params     = { wmode : BW.isChrome || BW.isIE9 ? "window" : "transparent" };
				var attributes = {};
				params.base    = ".";
				
				
				BW.swfobject.embedSWF( BW.ServiceManager.bannerSWF, BW.ServiceManager.CONTROLLER_ELEMENT_NAME, BW.ServiceManager.bannerWidth, BW.ServiceManager.bannerHeight, "10", false, vars, params, attributes );
				
				//motionPlayer
				if( $( BW.ServiceManager.CONTROLLER_ELEMENT_SELECTER ).length ) BW.ServiceManager.banner = $( BW.ServiceManager.CONTROLLER_ELEMENT_SELECTER ).get( 0 );
				
				// 上部メインバナーを保持
				// デフォルトで表示されているFlashObject
				BW.ServiceManager.current = $( BW.ServiceManager.currentFlashSelecter );
				
				
				// FalshWrapper
				BW.ServiceManager.mainBannerFlashWrapper = $( '<div id="MainBannerWrapper"></div>' ).prependTo( BW.ServiceManager.mainPrependTarget );
				
				// Flash用
				BW.ServiceManager.mainBannerFlashWrapper.append( $( '<div id="MainBanner"></div>' ) );
				BW.swfobject.embedSWF( BW.ServiceManager.mainSWF, "MainBanner", BW.ServiceManager.mainWidth, BW.ServiceManager.mainHeight, "10", false, vars, params, attributes );
				
				var $wrap = BW.ServiceManager.current.wrap( '<div id="CurrentFlashWrapper"></div>' );
				
				BW.ServiceManager.currentFlashObject = new FlashObject( BW.ServiceManager.current.parent() );
				BW.ServiceManager.mainFlashObject = new FlashObject( $( "#MainBannerWrapper" ) );
				
				// 領域
				BW.ServiceManager.flashSpacer = $( '<div></div>' ).css( { background : "none", width : BW.ServiceManager.mainWidth + "px", height : BW.ServiceManager.mainHeight + "px" } );
				$( "#CurrentFlashWrapper" ).after( BW.ServiceManager.flashSpacer );
				
				
				
				// 最初は非表示
				BW.ServiceManager.mainFlashObject.hide();
				
				
			}
		}, 
		
		
		
		/*-----------------------------------------------------
			動く
		-----------------------------------------------------*/
		
		play : function() {

			BW.ServiceManager.bind( BW.ServiceManager.ON_CONTROLLER_MOUSE_OVER, self._onMouseControllerOver );
			BW.ServiceManager.bind( BW.ServiceManager.ON_CONTROLLER_MOUSE_OUT, self._onMouseControllerOut );
			
		
			
			if( !BW.ServiceManager.isMainCallStart && BW.ServiceManager.enabledFlash ) {
			
				
				//motionPlayer
				if( !BW.ServiceManager.completeEmbedMainFlash && $( "#MainBanner" ).length ) {
					BW.ServiceManager.main = $( "#MainBanner" ).get( 0 );
					BW.ServiceManager.completeEmbedMainFlash = true;
				}
			
				if( BW.ServiceManager.main && typeof BW.ServiceManager.main.start == "function" ) {
					BW.ServiceManager.isMainCallStart = true;
					BW.ServiceManager.main.start( "BW.PanoramaBannerController._onMainFlashStart", BW.ServiceManager.controllerMouseX, BW.ServiceManager.controllerMouseY );
				} else {
					setTimeout( function(){ self.play(); }, 10 );
				}
			}
			
			
			// Flash表示きりかえ
			if( BW.ServiceManager.completeEmbedMainFlash ) {
				BW.ServiceManager.currentFlashObject.hide();
				BW.ServiceManager.mainFlashObject.show();
				
			}
			
			
			_isPlaying = true;
			
		},
		
		
		
		/*-----------------------------------------------------
			動き停止
		-----------------------------------------------------*/
		
		stop : function() {
			
			_isPlaying = false;
			
			// Flash表示きりかえ
			if( BW.ServiceManager.completeEmbedMainFlash ) {
				BW.ServiceManager.currentFlashObject.show();
				BW.ServiceManager.mainFlashObject.hide();
				
			}
			
		},
		
		
		
		
		/*-----------------------------------------------------
			終了
		-----------------------------------------------------*/
		
		close : function() {
			_isPlaying = false;
			self.enabled = false;
			// enter frame処理
			EnterFrameManager.remove( "update" );
			
		},
		
		
		/*-----------------------------------------------------
			Flashスタート処理終了
		-----------------------------------------------------*/
		
		_onMainFlashStart : function() {
			BW.ServiceManager.isMainStart = true;
			BW.ServiceManager.enabledControll = true;
		},
		
		
		
		
		/*-----------------------------------------------------
			コントローラにマウスオーバー
		-----------------------------------------------------*/
		
		_onMouseControllerOver : function() {
			BW.ServiceManager.enabledControll = true;
		},
		
		
		
		/*-----------------------------------------------------
			コントローラからマウスアウト
		-----------------------------------------------------*/
		
		_onMouseControllerOut : function() {
			BW.ServiceManager.enabledControll = false;
			
		},
		
		
		
		
		
		/*-----------------------------------------------------
			EnterFrameHandler
		-----------------------------------------------------*/
		
		_update : function() {
			
			var activeVX, activeVY, rotationVX, rotationVY, vx, rate, m, lastRotationX;
			
			// マウスXを基準としたレート
			rate = 1 - Math.sin( ( BW.ServiceManager.controllerMouseX / BW.ServiceManager.controllerWidth ) * Math.PI  );
			
			activeVX = 0;
			activeVY = 0;
			
			rotationVX = 0;
			rotationVY = 0;
			
			// mouseX, mouseYの移動量
			if( _isPlaying ) {
				vx         = _lastMouseX - BW.ServiceManager.mouseX;
				activeVX   = vx * BW.ServiceManager.MOUSE_TO_ACTIVE_RATE;
				rotationVX = vx * BW.ServiceManager.MOUSE_TO_ROTATION_RATE;
			}
			
			
			
			for( var i = BW.ActiveElementDataStore.data.length; i--; ) {
				
				// ターゲット
				m = BW.ActiveElementDataStore.data[ i ];
				
				// 前回の角度
				lastRotationX = m.rotationX;
				
				// 計算
			    m.vx   = ( ( activeVX - m.x ) * m.easing ) + ( m.vx * m.overlap );
			  	m.vx  *= m.friction;
				m.vrx  = ( ( ( rotationVX ) - m.rotationX ) * m.rotationEasing ) + ( m.vrx * m.rotationOverLap );
				m.vrx *= m.rotationFriction;
				
				
				// 加算
				m.x += m.vx;
				m.rotationX += m.vrx;
				
				
				m.x         = m.x;
				m.rotationX = m.rotationX;

				// 更新
				m.render();
			}
			
			
			// 前回のマウス座標として保存
			_lastControllerMouseX = BW.ServiceManager.controllerMouseX;
			_lastControllerMouseY = BW.ServiceManager.controllerMouseY;
			_lastMouseX           = BW.ServiceManager.mouseX;
			_lastMouseY           = BW.ServiceManager.mouseY;
			
		}
		
	}
	

} )();




/*-----------------------------------------------------
	紙スライド関連
-----------------------------------------------------*/

BW.PaperSlider = ( function() {
	
	var self;
	return {
		
		// event
		ON_PAPER_SLIDE_COMPLET : "PaperSliderSlideComplete",
		
		enabled : false,
		
		// スライドさせる要素
		slideTarget : null,
		
		// スライドさせる手要素
		slideHandsTarget : null,
		
		
		// freame
		currentFrame : 0,
		
		// ロゴ表示開始フレーム
		//motionFadeinLogo : 0,
		
		// ページスライド後のロゴ表示タイミング
		fadeinLogoStartTime : 500,
		
		// 手移動開始フレーム数
		motionHandsFrame : 0,
		
		// ページ移動開始フレーム数
		motionPageFrame : 0,
		
		
		// スライドイージング
		// スピード
		slideSpeed : 3,
		handsSpeed : 3,
		
		// 加速値
		slideAccel : 4,
		handsAccel : 4,
		
		
		// スライド先座標
		targetY : 0,
		handsTargetY : 0,

		
		// 現在のY座標
		slideY : 0,
		handsY : 0,
		
		
		// 手の移動量
		slideHandsOffsetY : 120,
		
		
		
		// ロゴインスタンス
		logo01 : null,
		logo02 : null,
		
		
		logoFadeInTime  : 1000,
		logoStayTime    : 1200,
		logoFadeOutTime : 500,
		logoFadeOutStay : 400,
		
		
		
		//_dispatchkeisan
		_dispatcher : $({}),
		
		/*-----------------------------------------------------
			初期化
		-----------------------------------------------------*/
		
		init : function() {
			if( self || BW.isIE6 ) return;
			
			self = BW.PaperSlider;
			
			// ターゲット取得
			/*
			BW.ActiveElementDataStore.pageSelecter, BW.ActiveElementDataStore.handsSelecter
			*/
			self.slideTarget = $( BW.ActiveElementDataStore.pageSelecter );
			
			// 手要素取得
			self.slideHandsTarget = $( BW.ActiveElementDataStore.handsSelecter );
			
			if( BW.isChrome || BW.isIE9 ) self.slideHandsTarget.hide();
			
			
			self.enabled = true;
			
			// 背景に表示される要素を追加
			// CustomFadeInElementを作成
			logo01 = new CustomFadeInElement( "./js/banner-parts/images/background-pocky.png", 360, 60 );
			logo02 = new CustomFadeInElement( "./js/banner-parts/images/background-panorama.gif", 390, 70 );
			
			
			// 表示
			$( "body" ).prepend( logo01.client );
			$( "body" ).prepend( logo02.client );
			
			
			// 中央に
			BW.ServiceManager.addSenterFixElement( logo01.client );
			BW.ServiceManager.addSenterFixElement( logo02.client );
			
			
			// 非表示
			logo01.hide( 0 );
			logo02.hide( 0 );
			
		},
		
		
		
		
		/*-----------------------------------------------------
			スライド開始
		-----------------------------------------------------*/
		
		slide : function( i_time, i_delay ) {
		
			if( !self.enabled ) return;
			if( i_time == "undefined" ) i_time = 4;
			if( i_delay == "undefined" ) i_delay = 0;
			
			// 要素のクリックイベントを無効に
			self.slideTarget.bind( "click", function(){ return false; } );
			
			// バナーアニメーション無効
			BW.PanoramaBannerController.close();
			
			
			self.slideY = self.slideTarget.offset().top;
			self.handsY = self.slideHandsTarget.offset().top - $(window).scrollTop();
			
			
			// ターゲット座標を計算
			self.targetY = self.slideY + $(window).scrollTop() + $(window).height();
			self.handsTargetY = self.handsY + self.slideHandsOffsetY;
			
			
			// バナーFlashを表示、元のFlashを非表示に
			BW.ServiceManager.currentFlashObject.client.hide();
			if( BW.isIE ) {
				BW.ServiceManager.mainFlashObject.client.css( { position : "" } );
			}
			BW.ServiceManager.mainFlashObject.client.show();
			BW.ServiceManager.flashSpacer.hide();
			
			
			// event remove.
			BW.ServiceManager.unbind( BW.ServiceManager.ON_CONTROLLER_MOUSE_OVER, self._onMouseControllerOver );
			BW.ServiceManager.unbind( BW.ServiceManager.ON_CONTROLLER_MOUSE_OUT, self._onMouseControllerOut );
			
			// Enterframeイベント追加
			EnterFrameManager.add( "slide", BW.PaperSlider._update );
		},
		
		
		
		/*-----------------------------------------------------
			スライド要素座標更新
		-----------------------------------------------------*/
		
		_update : function() {
			
			self.currentFrame++;
			
			// 各フレーム数によって
			/*
			if( !logo01.isShown && self.currentFrame >= self.motionFadeinLogo ) {
				logo01.show( self.logoFadeInTime, self._onLogo01Shown );
				logo01.isShown = true;	
			}
			*/
			
			
			
			if( self.currentFrame >= self.motionHandsFrame ) {
				// 手移動
				self.handsSpeed += self.handsAccel;
				self.handsY += self.handsSpeed;
				self.slideHandsTarget.css( "top", self.handsY + "px" );
			}
			
			if( self.currentFrame >= self.motionPageFrame ) {
				// ページ移動
				self.slideSpeed += self.slideAccel;
				self.slideY += self.slideSpeed;
				self.slideTarget.css( "top", self.slideY + "px" );
			}
			
			
			// ターゲットまでいったか
			if( self.targetY * 1.1 <= Math.round( self.slideY ) && self.handsTargetY * 1.2 <= Math.round( self.handsY ) ) {
				self._onSlideComplete();
				
				setTimeout( function(){
					logo01.show( self.logoFadeInTime, self._onLogo01Shown );
					logo01.isShown = true;	
				}, self.fadeinLogoStartTime );
				
			}
		
		},
		
		
		
		/*-----------------------------------------------------
			スライド完了
		-----------------------------------------------------*/
		
		_onSlideComplete : function() {
			
			// EnterFrame削除
			EnterFrameManager.remove( "slide" );
			
			// ターゲット要素非表示
			self.slideTarget.hide();

		},
		
		
		/*-----------------------------------------------------
			ロゴ１表示完了
		-----------------------------------------------------*/
		
		_onLogo01Shown : function() {
			setTimeout( function(){
				logo01.hide( self.logoFadeOutTime, function(){
					setTimeout( function(){
						logo02.show( self.logoFadeInTime, function(){
							setTimeout( function(){		
								logo02.hide( self.logoFadeOutTime, function(){
									setTimeout( function(){
										self.trigger( self.ON_PAPER_SLIDE_COMPLET );
									
									}, self.logoFadeOutStay );
								});
							}, self.logoStayTime );
						} );
					}, self.logoFadeOutStay );
				} );
			}, self.logoStayTime );
		},
		
		/*-----------------------------------------------------
			event 
		-----------------------------------------------------*/
		
		bind : function( i_type, i_callBackFunction ){
			self._dispatcher.bind( i_type, i_callBackFunction );
		},
		
		unbind : function( i_type, i_callBackFunction ){
			self._dispatcher.unbind( i_type, i_callBackFunction );
		},
		
		trigger : function( i_type ){
			self._dispatcher.trigger( i_type );
		}
	};
} )();







/*-----------------------------------------------------
	FlashObject
-----------------------------------------------------*/

function FlashObject( i_client ) {
	this.client = i_client;
	this.client.css( { position : "absolute" } );
	this.visible = true;
}

// 表示
FlashObject.prototype.show = function(){
	this.client.css( { marginTop : "0px" });
	this.visible  = true;
}

// 非表示
FlashObject.prototype.hide = function(){
	this.client.css( { marginTop : "-560px" });
	this.visible = false;
}


		


/*-----------------------------------------------------
	fade in element
-----------------------------------------------------*/

function CustomFadeInElement( i_imagePath, i_width, i_height ) {

	// 自身
	this.client = $( '<div style="width:' + i_width + 'px;height:' + i_height + 'px;margin:0 auto;"></div>' );
	this.client.css( { position : "fixed" } );
	
	// 表示フラグ
	this.isShown = false;
	
	// ロゴ画像
	this.logo = $( '<img src="" alt="background-panorama" width="' + i_width + '" height="' + i_height + '" />' );
	
	// 読み込み
	this.logo.attr( "src", i_imagePath );
	
	
	this.client.append( this.logo );
};

// 表示
CustomFadeInElement.prototype.show = function( i_fade, i_listener ) {
	this.logo.stop( true );
	this.logo.show();
	this.logo.animate(
		{ opacity : 1 },
		{ duration : i_fade, easing: "linear", complete: function(){ i_listener && i_listener.call(); }
	});
};

// 非表示
CustomFadeInElement.prototype.hide = function( i_fade, i_listener ) {
	this.logo.animate(
		{ opacity : 0 },
		{ duration : i_fade, easing: "linear", complete: function(){
			$(this).hide();
			i_listener && i_listener.call();	
		}
	});
};





/*-----------------------------------------------------
	EnterFrameManager
	
		add     : 
		remove  :
		_update : 
		
-----------------------------------------------------*/

window.EnterFrameManager = ( function() {
	var self;
	return {
		FRAME_RATE : BW.isIE6 ? 10 : 30,
		listeners  : [],
		length     : 0,
		timer      : null,
		add : function( i_key, i_listener ) {
			if( !self )	self = window.EnterFrameManager;
			if( !self.listeners[ i_key ] ) {
				self.listeners[ i_key ] = i_listener;
				self.length++;
			}
			if( self.length == 1 ) self.timer = setInterval( self._update, 1000 / self.FRAME_RATE );
		},
		remove : function( i_key ) {
			if( self.listeners[ i_key ] ) {
				delete self.listeners[ i_key ];
				self.length--;
			}
			if( !self.length ) clearInterval( self.timer );
		},
		_update : function() {
			for( var i in self.listeners ) self.listeners[ i ].call();
		}			
	}
} )();





/*-----------------------------------------------------
	get element xy
-----------------------------------------------------*/

function getElementXY( i_element ) {
	//return { x : i_element.offset().left, y : i_element.offset().top };
	return { x : 0, y : 0 };
}




/*-----------------------------------------------------
	String utils
-----------------------------------------------------*/

// 000px -> 000
String.prototype.pixcelToInt = function() {
	return parseInt( this.replace( /px/, "" ) );
}

// [ A ] -> [A]
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, "");
}







$( window ).load( function(){
	
	BW.ServiceManager._resize();
	
});


/*-----------------------------------------------------
	document ready
-----------------------------------------------------*/

$( document ).ready( function() { 


	// 	サービスマネージャー初期化
	BW.ServiceManager.init();
	
	// 対象となる要素監視を初期化
	BW.ActiveElementDataStore.init();
	
	
	// 紙スライド管理初期化
	BW.PaperSlider.init();

	// バナーコントローラ初期化
	BW.PanoramaBannerController.init();
	
	
	
	// バナーアクション
	BW.ServiceManager.bind( BW.ServiceManager.ON_CONTROLLER_MOUSE_OVER, function() {
		
		// バナー再生
		BW.PanoramaBannerController.play();
	
	} );
	
	BW.ServiceManager.bind( BW.ServiceManager.ON_CONTROLLER_MOUSE_OUT, function() {
		
		// バナー停止
		BW.PanoramaBannerController.stop();
		
	} );
	
	
	// バナークリック時
	BW.ServiceManager.bind( BW.ServiceManager.ON_CONTROLLER_CLICK, function() {
		
		if( BW.isIE6 ) {
			// スライドせずにリダイレクト
			BW.ServiceManager.redirect();
		} else {
			// トップにスクロール後、スライド処理
			setTimeout( "BW.PaperSlider.slide()", 100 );
			
		}
	} );
	
	// スライド完了イベント追加
	BW.PaperSlider.bind( BW.PaperSlider.ON_PAPER_SLIDE_COMPLET, function() {
		// リダイレクト
		BW.ServiceManager.redirect();
	} );
	
	
	
	
	BW.ServiceManager._resize();
	
} );
