/*
  foundation.js
  for Bridgestone GlobalWebSite
*/

(function(){
	/**
	 * 設定項目
	 */

	// 本文領域の幅
	var WIDTH_CONTENT_BODY = 636;

	// ファーストビューの高さに関する調整の閾値
	var HEIGHT_FIRSTVIEW_THRESHOLD = 700;

	// 本文の高さに関する調整の閾値
	var HEIGHT_CONTENTSBODY_THRESHOLD = 100;

	// ローカルサイトへのリンクUI（開閉動作）を、2段階にする閾値
	// ↑廃案？
	var HEIGHT_LOCAL_SITE_UI_THRESHOLD = 200;

	/* 帯域設定のデフォルト（ブロードバンド版・ナローバンド版） */
	var STR_DEFAULT_BANDWIDTH = "bb" //ブロードバンド
	//var STR_DEFAULT_BANDWIDTH = "nb" //ナローバンド

	/* 並列カラムの高さあわせの適用クラス */
	var CLASS_PANEL_LOOK_ELMS = "ul.particularTopics, div.figure-container";

	/* 並列カラムの見出しの高さあわせの適用クラス */
	var CLASS_TARGET_HEADING_ELMS = "div.heading";



	/**
	 * 定数定義
	 */

	// グローバルメニュー子階層 Products
	var HTML_GNAVI_PRODUCTS =
		'<div class="products">' +
		'  <div class="gnavi2ndBody">' +
		'    <ul>' +
		'      <li><a href="/products/passenger_tires/index.html" class="passengerTires">Passenger Tires</a></li>' +
		'      <li><a href="/products/commercial_tires/index.html" class="commercialTires">Commercial Tires</a></li>' +
		'      <li><a href="/products/motorcycle_tires/index.html" class="motorcycleTires">Motorcycle Tires</a></li>' +
		'      <li><a href="/products/speciality_tires/index.html" class="specialityTires">Speciality Tires</a></li>' +
		'      <li><a href="/products/diversified/index.html" class="diversified">Diversified Products</a></li>' +
		'      <li><a href="/products/technologies/index.html" class="technologies">Technologies</a></li>' +
		'    </ul>' +
		'  </div>' +
		'  <div class="bgLayer"></div>' +
		'</div>';

	// グローバルメニュー子階層 Corporate
	var HTML_GNAVI_CORPORATE =
		'<div class="corporate">' +
		'  <div class="gnavi2ndBody">' +
		'    <ul>' +
		'      <li><a href="/corporate/philosophy/index.html" class="philosophy">Philosophy</a></li>' +
		'      <li><a href="/corporate/strategy/index.html" class="strategy">Strategy</a></li>' +
		'      <li><a href="/corporate/profile/index.html" class="profile">Profile</a></li>' +
		'      <li><a href="http://www.bridgestone.co.jp/english/info/corp/facilities/contents/index.html" target="_blank" class="locations">Locations</a></li>' +
		'      <li><a href="/corporate/finance/index.html" class="finance">Finance</a></li>' +
		'      <li><a href="/corporate/history/index.html" class="history">History</a></li>' +
		'      <li><a href="/corporate/news/index.html" class="news">News</a></li>' +
		'    </ul>' +
		'  </div>' +
		'  <div class="bgLayer"></div>' +
		'</div>';

	// グローバルメニュー子階層 Responsibilities
	var HTML_GNAVI_RESPONSIBILITIES =
		'<div class="responsibilities">' +
		'  <div class="gnavi2ndBody">' +
		'      <ul>' +
		'        <li><a href="/responsibilities/environment/index.html" class="environment">Environment</a></li>' +
		'        <li><a href="/responsibilities/tire_safety/pledge/index.html" class="tireSafety">Tire Safety</a></li>' +
		'        <li><a href="/responsibilities/corporate_citizenship/policy/index.html" class="corporateCitizenship">Corporate Citizenship</a></li>' +
		'    </ul>' +
		'  </div>' +
		'  <div class="bgLayer"></div>' +
		'</div>';


	// フォントサイズ変更UI
	var HTML_FONT_SIZE_SWITCH_UI =
		'<ol id="fontSizeSwitchUI">' +
		'  <li class="setterS"><a href="#">S</a></li>' +
		'  <li class="setterM"><a href="#">M</a></li>' +
		'  <li class="setterL"><a href="#">L</a></li>' +
		'</ol>';

	// ユーザー設定フォントサイズのcookie保管用キー名
	var STR_FONTSIZE_COOKIEKEY = 'fontsizeSetting';

	// ユーザー設定フォントサイズのcookie保管用キー名
	var STR_BANDWIDTH_COOKIEKEY = 'bandwidthSetting';

	// 各国サイトへのリンクの展開UIのクラス名
	var CLASS_COUNTRY_LINKS_TOGGLE = 'countrySpecificLinksTrigger';



	/**
	 * 汎用関数定義
	 */
	var bsjs = window.bsjs = {};

	/* クッキー操作 */
	bsjs.setCookie = function( myKey, myVal ){
		/* max-ageは、safari1系で不正という情報があるので、expiresDateで代替 */
		var expiresDateObj = new Date();
		if( arguments.length == 3 ){
			expiresDateObj = arguments[2];
		} else {
			expiresDateObj.setYear( expiresDateObj.getFullYear() + 1 );
		}
		var expiresDate = expiresDateObj.toGMTString().replace(/UTC/, "GTM");
		var tempStr = myKey + "=" + myVal + "; ";
		tempStr +="path=/;";
		tempStr +="expires=" + expiresDate + "; ";
		document.cookie = tempStr;
	}
	bsjs.getCookie = function( myKey ){
		var cookies = [];
		if( document.cookie ){
			var cookiesStr = document.cookie.split(";");
			for( var i=0; i < cookiesStr.length; i++ ){
				var cookiePair = cookiesStr[i].split("=");
				if( cookiePair.length != 2 ) continue;
				cookies[cookiePair[0].replace( /^ *| *$/g, "" )] = cookiePair[1].replace( /^ *| *$/g, "" );
			}
			return cookies[myKey];
		}
	}

	bsjs.fontSizeWatcher = function(){
		this.elm = $( '<div id="fontSizeWatcher"> </div>' );
		$(document.body).append( this.elm );
		this.lastHeight = this.elm.height();
	}
	bsjs.fontSizeWatcher.prototype = {
		elm: null,
		lastHeight: 0,
		timer: null,
		test: function(){
			if( this.elm.height() !== this.lastHeight ){
				this.lastHeight = this.elm.height();
				this.elm.trigger("fontSizeChange");
			}
		},
		start: function(){
			var that = this;
			this.timer = setInterval( function(){that.test()}, 200 );
		},
		toString: function(){ return "bsjs.fontSizeWatcher" }
	}



	/* 並列カラムの高さあわせ */
	$.fn.adjustPanelHeight = function(){
		var targetPanels = this.find("> *");

		if(
			/* カラムが1つもない場合 */
			!targetPanels.get(0) ||

			/* もしくは、カラムが2つ以上ない場合 */
			!targetPanels.get(1) ||

			/* もしくは、2つのカラムの幅が異なる場合 */
			$(targetPanels.get(0)).width() !== $(targetPanels.get(1)).width()
		){
			/* 高さあわせを適用しない */
			return;
		}

		var turnCount = Math.floor(WIDTH_CONTENT_BODY / $(targetPanels.get(0)).width());

		var rowMaxHeight, headingMaxHeight, calcedValue, testElm;
		for( var i=0; i<targetPanels.length/turnCount; i++ ){
			rowMaxHeight = 0;
			headingMaxHeight = 0;

			for( var j=0; j<turnCount && i*turnCount+j < targetPanels.length; j++ ){
				testElm = $(CLASS_TARGET_HEADING_ELMS,targetPanels.get(i*turnCount+j));
				testElm.removeClass("adjusted");
				headingMaxHeight = Math.max( testElm.css("height","auto").height(), headingMaxHeight );
			}
			for( var j=0; j<turnCount && i*turnCount+j < targetPanels.length; j++ ){
				testElm = $(CLASS_TARGET_HEADING_ELMS,targetPanels.get(i*turnCount+j));

				/* 各論リンクへの見出しの場合、内容要素の位置調整 */
				if(testElm.parent().parent().hasClass("particularTopics")){
					calcedValue = ( headingMaxHeight - testElm.height() ) / 2;
					$("> *:first-child",testElm).css("marginTop",calcedValue);
				}

				testElm.height(headingMaxHeight).addClass("adjusted");
			}
			for( var j=0; j<turnCount && i*turnCount+j < targetPanels.length; j++ ){
				testElm = $(targetPanels.get(i*turnCount+j));
				rowMaxHeight = Math.max( testElm.css("height","auto").height(), rowMaxHeight );
			}
			for( var j=0; j<turnCount && i*turnCount+j < targetPanels.length; j++ ){
				testElm = $(targetPanels.get(i*turnCount+j));
				testElm.height(rowMaxHeight);
			}
		}
		return this;
	}

	/* 並列カラムの高さあわせ初期化 */
	$.fn.initPanelLinks = function(){
		return this.each(function(){
			var that = $(this);
			$("#fontSizeWatcher").bind("fontSizeChange",function(){that.adjustPanelHeight()});
			$(this).adjustPanelHeight();
		});
	}



	/* OL見栄え調整 */
	$.fn.dressOL = function(){
		return this.each( function(){
			$(this).addClass("dressed")
			.find("> li").wrapInner(document.createElement("div"))
			.find("> div").addClass("dressed-inner")
		})
	}



	/**
	 * トラッキング用文字列生成
	 */
	bsjs.tracking = {};

	/* 計測アプリでエラーとなる文字の手当て（削除・置換） */
	bsjs.tracking.sanitizeStr = function( myStr ){
		myStr = myStr.replace(/ /g,"_").replace(/&/g,"and");
		myStr = unescape( escape( myStr ).replace(/%u.{4}/g,"").replace(/%.{2}/g,"") );
		myStr = 
			encodeURI(myStr)
			.replace(/[/]/g,"_")
			.replace(/[\!\#\$\'\(\)\*\+\,\.\/\:\;\=\?\@\~]/g,"")
			.replace(/_[_]+/g,"_");
		return myStr;
	}

	/* ローカルサイトへの離脱導線のID（画像ファイル名を利用） */
	bsjs.tracking.getIdByCountryLabel = function( myTrigger ){
		var keyStr = $(myTrigger).children().attr("src").split("/").pop();
		keyStr = "to_" + keyStr.substring( keyStr.indexOf("_")+1, keyStr.lastIndexOf("_") ).replace("_","");
		return keyStr;
	}

	/* <a>タグ内容のテキスト（or画像のalt）からリンクIDを生成 */
	bsjs.tracking.getIdByText = function( myTrigger ){
		var keyStr;

		var textSrc = $(myTrigger).children().get(0);
		if( textSrc && textSrc.nodeType === 1 && textSrc.tagName.toLowerCase() === "img" ){
			keyStr = $(textSrc).attr("alt");
		}
		else if( textSrc = $(myTrigger).text() ){
			keyStr = textSrc;
		}

		if( keyStr ){
			return ("to_" + bsjs.tracking.sanitizeStr(keyStr.toLowerCase()));
		}
		else {
			return "UNDEFINED";
		}
	}

	/* ページタイトルを取得（主に、リンクIDのプレフィックスとして使用） */
	bsjs.tracking.getPageTitle = function(){

		var keyStr;
		switch( document.title ){

			//【例外】トップページ⇒Top
			case "Bridgestone Corporation":
				var path = location.pathname;
				if( path === "/" || path === "/index.html" ){
					keyStr = "Top";
				}
				break;

			//【例外】NEWS詳細⇒NEWS
			case "Bridgestone Corporation | News Release":
				keyStr = "News";
				break;

			//【基本】縦線区切り|の、一項目目
			default:
				keyStr = document.title.split(" | ")[0];
				break;
		}

		return bsjs.tracking.sanitizeStr(keyStr);
	}

	/* ページ固有のトリガー設定 */
	bsjs.tracking._additionalEvents = [];
	bsjs.tracking.add = function( mySelector, myId ){
		bsjs.tracking._additionalEvents.push([mySelector,myId]);
	}



	/**
	 * 初期表示処理
	 */
	$(document).ready( function(){

		/* 汎用：slideDown/Up のレガシーUA対応 */
		if( !$("#nav").slideDown ){
			$.fn.slideDown = function(speed,callback){
				return this.css("display","block");
			}
			$.fn.slideUp = function(speed,callback){
				return this.css("display","none");
			}
			$.fn.stop = function(clearQueue,gotoEnd){
				return this;
			}
		}

		/* フォントサイズ変更の検出 */
		var fSWatcher = new bsjs.fontSizeWatcher();
		fSWatcher.start();


		/* ユーザー設定フォントサイズの適用 */
		switch( bsjs.getCookie(STR_FONTSIZE_COOKIEKEY) ){
			case "s":
				$(document.body).addClass("fontsizeS");
				break;
			case "l":
				$(document.body).addClass("fontsizeL");
				break;
		}


		/* グローバルナビの初期化 */
		$("#nav > ul > li:nth-child(1)").append( HTML_GNAVI_PRODUCTS );
		$("#nav > ul > li:nth-child(2)").append( HTML_GNAVI_CORPORATE );
		$("#nav > ul > li:nth-child(3)").append( HTML_GNAVI_RESPONSIBILITIES );

		$("#nav > ul > li > a")
			.bind( "mouseenter", function(myEv){
				var targetElm = $( this ).parent();
				targetElm.addClass( 'selecting' );
				$( "> div", targetElm ).stop(false,true).slideDown( 'normal' );
			} );
		$("#nav > ul > li")
			.bind( "mouseleave", function(){
				$( this ).removeClass( 'selecting' );
				$( "> div", this ).stop(false,true).slideUp( 'normal' );
			} )


		/* フォントサイズ変更UIの初期化 */
		$("#contents-header").append( HTML_FONT_SIZE_SWITCH_UI );
		$("#contents-header .setterS a").click( function(){
			$(document.body)
				.removeClass("fontsizeL")
				.addClass("fontsizeS");
			bsjs.setCookie(STR_FONTSIZE_COOKIEKEY,"s");
			return false;
		} );
		$("#contents-header .setterM a").click( function(){
			$(document.body)
				.removeClass("fontsizeS")
				.removeClass("fontsizeL");
			bsjs.setCookie(STR_FONTSIZE_COOKIEKEY,"m");
			return false;
		} );
		$("#contents-header .setterL a").click( function(){
			$(document.body)
				.removeClass("fontsizeS")
				.addClass("fontsizeL");
			bsjs.setCookie(STR_FONTSIZE_COOKIEKEY,"l");
			return false;
		} );


		/* a.toPageTop の動作設定 */
		$("#contents-body .toPageTop, #contents-footer .toPageTop")
			.click( function(){
				if( !$("html,body").animate ){
					window.scroll(0,0);
					return true;
				}

				$("html,body").animate({ scrollTop: 0 }, "normal");
				return false;
			} )

		/* 並列カラムの高さあわせ */
		$( CLASS_PANEL_LOOK_ELMS ).initPanelLinks();

		/* OL.generalの粉飾 */
		$("ol.general").dressOL();

		/* 各論への導線のリンク領域を拡張 */
		$( "ul.particularTopics > li" ).click( function(){
			location.href = this.getElementsByTagName("a")[0];
			return false;
		} ).css("cursor","pointer");



		/* IE向けの調整 */
		if( $.browser.msie ){

			// div.figure-containerの余白調整
			$(
				"div.figure-container div > *:last-child," +
				"div.figure-container div > *:last-child > *:last-child," +
				"div.figure-container div > *:last-child > *:last-child > *:last-child," +
				"div.figure-container div > *:last-child > *:last-child > *:last-child > *:last-child"
			).addClass("lastChild");

			// #contents-asideのmargin相殺不具合の対応
			$("#contents-aside > div.section > *:last-child").addClass("lastChild");

		}

		/* ローカルサイトへのリンクUIの初期化 */
		var jQ_localSitesUI = $("#contents-aside .countrySpecificLinks");
		if( jQ_localSitesUI.length ){

			/* 共通動作：一階層目の開閉 */
			jQ_localSitesUI
				.css( "display", "none" )
				.css( "position", "absolute" )

			$("#contents-aside ." + CLASS_COUNTRY_LINKS_TOGGLE)
				.toggle(
					function(){
						jQ_localSitesUI.slideDown( 'normal' );
						$( this ).removeClass("closed");
					},
					function(){
						$( this ).addClass("opened");
						jQ_localSitesUI.slideUp( 'normal' );
						$( this ).addClass("closed");
					}
				)
				.addClass("closed");

			/* 高さが設定された閾値以上の場合：2段階目の開閉 */
			// ↑廃案？
			//if( jQ_localSitesUI.height() > HEIGHT_LOCAL_SITE_UI_THRESHOLD ){
				jQ_localSitesUI.find("ul")
					.css( "display", "none" );

				jQ_localSitesUI.find("div.areaHeading")
					.css("cursor","pointer")
					.toggle(
						function(){
							$(this).next().slideDown( 'normal' )
							$( this ).removeClass("closed");
						},
						function(){
							$(this).next().slideUp( 'normal' );
							$( this ).addClass("closed");
						}
					)
				.addClass("closed");
			//}
		}


		/* 本文の高さに関する調整 */
		if(
			$(document.body).hasClass("topicPage") &&
			$("#contents-body").height() < HEIGHT_CONTENTSBODY_THRESHOLD
		){
			$("#contents-body").addClass("shortContents");
		}


		/* ファーストビューの高さに関する調整 */
		if( $(document.body).height() > HEIGHT_FIRSTVIEW_THRESHOLD ){

			/* PageTopボタン表示 */
			$("#contents-footer .toPageTop").css("display","block")
		}
		else {

			/* PageTopボタン非表示 */
			$("#contents-footer .toPageTop").css("display","none")
		}

		/* トラッキングのトリガー設定 */
		if( !$(document.body).hasClass("topicBranch") ){

			//グローバルナビの利用計測
			$("#nav > ul > li:nth-child(1) > a").click( function(){
				var tempId = bsjs.tracking.getPageTitle() + "_navi_products";
				sendAnalyticsEvent( tempId );
			} );
			$("#nav > ul > li:nth-child(1) > div a").click( function(){
				var tempId = bsjs.tracking.getPageTitle() + bsjs.tracking.getIdByText(this).replace(/^to_/,"_navi_products_")
				sendAnalyticsEvent( tempId );
			} );
			$("#nav > ul > li:nth-child(2) > a").click( function(){
				var tempId = bsjs.tracking.getPageTitle() + "_navi_corporate";
				sendAnalyticsEvent( tempId );
			} );
			$("#nav > ul > li:nth-child(2) > div a").click( function(){
				var tempId = bsjs.tracking.getPageTitle() + bsjs.tracking.getIdByText(this).replace(/^to_/,"_navi_corporate_")
				sendAnalyticsEvent( tempId );
			} );
			$("#nav > ul > li:nth-child(3) > a").click( function(){
				var tempId = bsjs.tracking.getPageTitle() + "_navi_responsibilities";
				sendAnalyticsEvent( tempId );
			} );
			$("#nav > ul > li:nth-child(3) > div a").click( function(){
				var tempId = bsjs.tracking.getPageTitle() + bsjs.tracking.getIdByText(this).replace(/^to_/,"_navi_responsibilities_")
				sendAnalyticsEvent( tempId );
			} );
			$("#nav > ul > li:nth-child(4) > a").click( function(){
				var tempId = bsjs.tracking.getPageTitle() + "_navi_investor_relations";
				sendAnalyticsEvent( tempId );
			} );

			//カテゴリーメニューの外部導線
			$("#contents-body ul.childTopics a.external")
				.click( function(){sendAnalyticsEvent(bsjs.tracking.getIdByText(this))} );

			//関連情報カラムの、水平階層リンク中の外部導線
			$("#contents-aside ul.siblingTopics a.external")
				.click( function(){sendAnalyticsEvent(bsjs.tracking.getIdByText(this))} );

			//ローカルサイトへの外部導線
			$("#contents-aside div.countrySpecificLinks a")
				.click( function(){sendAnalyticsEvent(bsjs.tracking.getIdByCountryLabel(this))} );

			//フッターの外部導線（Contact Us）
			$("#footer a.toContactUs")
				.click( function(){sendAnalyticsEvent("to_contact")} );
		}

		//Adobe Reader ダウンロード
		//$("#contents-body div.pluginGuide a.getAdobeReader")
		//	.click( function(){sendAnalyticsEvent("to_AcrobatDL")} );

		/* ページ固有のトリガー */
		var additionalEvents = bsjs.tracking._additionalEvents;
		for( var i in additionalEvents ){
			if( typeof(additionalEvents[i][1]) === "string" ){
				$( additionalEvents[i][0] )
					.attr("bsTrackingID",additionalEvents[i][1])
					.click( function(){
						sendAnalyticsEvent( $(this).attr("bsTrackingID") );
					} );
			}
			else if( typeof(additionalEvents[i][1]) === "function" ){
				$( additionalEvents[i][0] )
					.each( function(){ this.bsTrackingFunc = additionalEvents[i][1] } )
					.click( function(){
						sendAnalyticsEvent( this.bsTrackingFunc(this) );
					});
			}
		}

	});



	/**
	 * JS読み込み時処理
	 */

	/* ブロードバンド版・ナローバンド版の表示制御 */
	bsjs.isBroadband = ( "bb" === (bsjs.getCookie(STR_BANDWIDTH_COOKIEKEY) || STR_DEFAULT_BANDWIDTH) );

	/* CSSチラつき対応 */
	try {
		document.execCommand('BackgroundImageCache', false, true);
	} catch( myEx ) {}

	/* JSが有効なUA向けのCSS調整 (DOMReadyが怪しいUAがあるので、$(document).ready外に記述) */
	var myStyleSheets = document.styleSheets[0];
	try {
		/* for DOM Level 2 */
		if( myStyleSheets.insertRule ){
			myStyleSheets.insertRule("#contents-aside .countrySpecificLinks { display: none }", myStyleSheets.cssRules.length);
		}

		/* for IE */
		if( myStyleSheets.addRule ){
			myStyleSheets.addRule("#contents-aside .countrySpecificLinks", "display:none");
		}
	} catch( myEx ) {}


})();
