﻿/*
 * Copyright (C) Johnny&Associates.
 * All Rights Reserved.
 */

//
// グローバル変数を定義
//

// ブラウザ種別
var BNAME_SAFARI = 1;
var BNAME_FF = 2;
var BNAME_IE = 3;
var CURRENT_BROWSER = 0;
if( navigator.userAgent.indexOf( "Safari" ) != -1 )
{
	CURRENT_BROWSER = BNAME_SAFARI;
}
else if( document.all )
{
	CURRENT_BROWSER = BNAME_IE;
}
else
{
	CURRENT_BROWSER = BNAME_FF;
}

// class 属性の名称
var classAttrKey = "class";
if( CURRENT_BROWSER == BNAME_IE )
{
	classAttrKey = "className";
}

// 表示中の週(デフォルト 1 = 当週)
var JC_CURRENT_WEEK = 1;	// 0:前週, 1:当週, 2:次週, 3:次々週, 4:次々々週

// 表示対象グループのID(デフォルト all = 全てのグループ)
var JC_CURRENT_GROUP = "all";

// [定数]ディレクトリ名・URL
var jcImageDir			= "img/";						// 画像ファイル格納ディレクトリ
var jcIconDir			= "icon/";						// メディアアイコン格納ディレクトリ
var jcMonthTitleDir		= "month/";						// 月名タイトル画像格納ディレクトリ
var jcMonthTitleSuffix	= ".gif";						// 月名タイトル画像拡張子
var jcCalgeneUrl = "/calgene/PreviewDetailCalendar";	// JSONデータ生成用サーブレットのURL


//
// 詳細カレンダー表示初期化処理
//
function jcInit()
{
	//
	// JSONデータが存在する場合(公開サーバ側)
	//
	if( jcDataObj != null )
	{
		// カレンダーを生成して終了
		makeDetailCalendar();
		return;
	}

	
	//
	// JSONデータが存在しない場合(管理者側)
	//
	
	// 指定された日時を取得
	var tForm = parent.search.document.prevForm;
	var pDate = tForm.pDate.value;
	var pTime = tForm.pTime.value;
		
	// サーブレットの URL を生成
	var url = jcCalgeneUrl + "?date=" + pDate.split("/").join("") + "&time=" + pTime + "&callback=jsonpHandler";

	// サーブレット呼び出し
	var scriptObj = document.createElement( "script" );
	scriptObj.setAttribute( "type", "text/javascript" );
	scriptObj.setAttribute( "src", url );
	document.getElementsByTagName( "body" ).item(0).appendChild( scriptObj );
}


//
// JSONP コールバック関数
//
function jsonpHandler( jsonpData )
{
	// サーブレットで取得した JSON 形式文字列を評価してオブジェクトを取得
	jcDataObj = eval( jsonpData );
	if( jcDataObj == null )
	{
		alert( "詳細カレンダー情報の取得に失敗しました。" );
		return;
	}
	
	// カレンダーを生成
	makeDetailCalendar();
	
}


//
// 詳細カレンダーを生成する
//
function makeDetailCalendar()
{	
	// グループリストを初期化
	var groupListObj = document.getElementById( "jcGroupList" );
	for( var i = 0; i < jcDataObj.jcGroup.length; i++ )
	{
		var optObj = document.createElement( 'option' );
		optObj.setAttribute( 'value', jcDataObj.jcGroup[i].gid );
		optObj.appendChild( document.createTextNode( jcDataObj.jcGroup[i].name ) );
		groupListObj.appendChild( optObj );
	}
	groupListObj.selectedIndex = 0;	// デフォルトでは「すべてのアーティスト」を選択
	
	// グローバル変数を初期化
	JC_CURRENT_WEEK = 1;
	JC_CURRENT_GROUP = "all";
	
	// 日付部分を表示
	jcDisplayDate();
	
	// イベントデータを表示
	jcDisplayEventData();
}


//
// 表示切り替え処理
//
function jcToggleVisible( type, value )
{
	// 週表示切り替え
	if( type == 'week' )
	{
		// Back ボタンが押下された場合
		if( value == 'back' )
		{
			if( JC_CURRENT_WEEK == 0 )
			{
				return;
			}
			JC_CURRENT_WEEK--;
		}
		
		// This week ボタンが押下された場合
		else if( value == 'this' )
		{
			if( JC_CURRENT_WEEK == 1 )
			{
				return;
			}
			JC_CURRENT_WEEK = 1;
		}
		
		// Next ボタンが押下された場合
		else
		{
			if( JC_CURRENT_WEEK == 4 )
			{
				return;
			}
			JC_CURRENT_WEEK++;
		}
		
		// 日付部分を表示
		jcDisplayDate();
	}
	
	// グループ切り替えが選択された場合
	else
	{
		JC_CURRENT_GROUP = value;
	}
	
	// イベントデータを表示
	jcDisplayEventData();
}


//
// 日付部分表示処理
//
function jcDisplayDate()
{
	// 詳細カレンダーの document オブジェクト
	var JC_CALENDAR;
	if( CURRENT_BROWSER == BNAME_IE )
	{
		JC_CALENDAR = document.frames[ 'calendar' ].document;	// IE
	}
	else
	{
		JC_CALENDAR = document.getElementById( 'jcDetail' ).contentWindow.document; // Safari, Firefox
	}

	// 表示開始日を現在の週から割り出す
	var cDayOffset = JC_CURRENT_WEEK * 7;
	
	// 週の中で月が変わる場合(「1日」を含む週の場合)は日付の前に「月」を表示
	var lastMonthStr = "";
	var monMonth = jcDataObj.jcDate[ cDayOffset ].month;			// 月曜日の「月」
	var sunMonth = jcDataObj.jcDate[ cDayOffset + 6 ].month;		// 日曜日の「月」
	if( monMonth != sunMonth )
	{
		lastMonthStr = "" + monMonth + "/";
	}
	
	// 表示対象の日付の分だけループ
	for( var i = 0; i < 7; i++ )
	{
		// 対象の日付オブジェクトを設定
		var todayObj = jcDataObj.jcDate[ cDayOffset + i ];
		
		// 日付表示エリアを設定
		var dAreaObj = JC_CALENDAR.getElementById( "jcDayNum" + i + "" );
		
		// 既存の日付を削除
		while( dAreaObj.childNodes.length > 0 )
		{
			dAreaObj.removeChild( dAreaObj.lastChild );
		}
		
		// 現在の日付を設定
		var cDayStr = lastMonthStr;		// 週の中で月が変わる場合は「月」を表示
		lastMonthStr = "";				// 月曜日(i=0)以外では不要
		if( todayObj.day == 1 )
		{
			cDayStr = "" + todayObj.month + "/";
		}
		cDayStr += "" + todayObj.day + "";
		dAreaObj.appendChild( JC_CALENDAR.createTextNode( cDayStr ) );

		
		// 誕生日／祝日・行事表示エリアを設定
		dAreaObj = JC_CALENDAR.getElementById( "jcHoliday" + i + "" );
		
		// 既存の誕生日／祝日・行事を削除
		while( dAreaObj.childNodes.length > 0 )
		{
			dAreaObj.removeChild( dAreaObj.lastChild );
		}
	
		// 祝日・行事
		if( todayObj.holiday )
		{
			var trObj = JC_CALENDAR.createElement( 'tr' );
			dAreaObj.appendChild( trObj );
			var tdObj = JC_CALENDAR.createElement( 'td' );
			tdObj.setAttribute( classAttrKey, 'jcHoliday' );
			tdObj.setAttribute( 'colSpan', '2' );	// IE では "colSpan" とする必要あり
			tdObj.appendChild( JC_CALENDAR.createTextNode( todayObj.holiday ));
			trObj.appendChild( tdObj );
		}
		
		// 誕生日
		var birthdayObj = todayObj.birthDayArray;
		var bdtrObj;
		var bdtdObj;
		for( var j = 0; j < birthdayObj.length; j++ )
		{
			var spStr = "";
			if( ( j % 2 ) == 0 )
			{
				spStr = " ";
				bdtrObj = JC_CALENDAR.createElement( 'tr' );
				dAreaObj.appendChild( bdtrObj );
				var tdObj = JC_CALENDAR.createElement( 'td' );
				tdObj.setAttribute( classAttrKey, 'jcBirthdayIcon' );
				if( j == 0 )
				{
					var imgObj = JC_CALENDAR.createElement( 'img' );
					imgObj.setAttribute( classAttrKey, 'jcBirthdayIcon');
					imgObj.setAttribute( 'alt', jcDataObj.jcBirthdayIconName );
					imgObj.setAttribute( 'title', jcDataObj.jcBirthdayIconName );
					imgObj.setAttribute( 'src', jcIconDir + jcDataObj.jcBirthdayIcon );
					tdObj.appendChild( imgObj );
				}
				bdtrObj.appendChild( tdObj );
				
				bdtdObj = JC_CALENDAR.createElement( 'td' );
				//bdtdObj.setAttribute( classAttrKey, 'spc_l3' );
				bdtrObj.appendChild( bdtdObj );
			}
			bdtdObj.appendChild( JC_CALENDAR.createTextNode( birthdayObj[j] + spStr ) );
		}

		//
		// Firefox のレンダリング不具合への暫定対処(2007.09.06)
		//
		//	【注】Firefox で対処されたら削除すること
		// ------------- ここから ---------------
		if( CURRENT_BROWSER == BNAME_FF )
		{
			// スケジュール表示エリアのスタイル指定文字列
			var styleStr = '.txt { width:110px; font-size:12px; line-height:normal; text-align:left; color:#666666; vertical-align:top;border-left:1px solid #B7A25C; padding:3px; }';

			// 一旦スタイル指定文字列を与えてすぐ削除
			if( document.implementation &&
				document.implementation.hasFeature ('HTML', '2.0') &&
				document.implementation.hasFeature ('StyleSheets', '2.0') &&
				document.implementation.hasFeature ('CSS', '2.0') )
			{
				var element = document.getElementsByTagName( 'head' )[0].appendChild( document.createElement( 'style' ) );
				element.type = 'text/css';
				element.sheet.insertRule( styleStr, 0 );
				element.parentNode.removeChild( element );
			}
		}
		// ------------- ここまで ---------------


	}
	
	// 年月タイトル画像を設定
	var mtSrc = jcMonthTitleDir;
	mtSrc += "" + jcDataObj.jcDate[ cDayOffset + 6 ].year;
	if( jcDataObj.jcDate[ cDayOffset + 6 ].month < 10 )
	{
		mtSrc += "0";
	}
	mtSrc += jcDataObj.jcDate[ cDayOffset + 6 ].month + jcMonthTitleSuffix;
	document.getElementById( 'jcMonthTitle' ).src = mtSrc;
	document.getElementById( 'jcMonthTitle' ).alt = jcDataObj.jcDate[ cDayOffset + 6 ].year + "年" + jcDataObj.jcDate[ cDayOffset + 6 ].month + "月";
	document.getElementById( 'jcMonthTitle' ).title = jcDataObj.jcDate[ cDayOffset + 6 ].year + "年" + jcDataObj.jcDate[ cDayOffset + 6 ].month + "月";
}


//
// イベントデータ表示処理
//
function jcDisplayEventData()
{
	// 詳細カレンダーの document オブジェクト
	var JC_CALENDAR;
	if( CURRENT_BROWSER == BNAME_IE )
	{
		JC_CALENDAR = document.frames[ 'calendar' ].document;	// IE
	}
	else
	{
		JC_CALENDAR = document.getElementById( 'jcDetail' ).contentWindow.document; // Safari, Firefox
	}

	// 表示開始日を現在の週から割り出す
	var cDayOffset = JC_CURRENT_WEEK * 7;
	
	// 表示対象の日付の分だけループ
	for( var i = 0; i < 7; i++ )
	{
		// 対象の日付オブジェクトを設定
		var todayObj = jcDataObj.jcDate[ cDayOffset + i ];

		// イベント表示エリアを設定
		var eAreaObj = JC_CALENDAR.getElementById( "jcEvent" + i + "" );
		
		// 既存のイベントを削除
		while( eAreaObj.childNodes.length > 0 )
		{
			eAreaObj.removeChild( eAreaObj.lastChild );
		}
		
		// イベントを表示
		for( var j = 0; j < todayObj.eventArray.length; j++ )
		{
			jcAddEventData( eAreaObj, todayObj.eventArray[j] );
		}
		if( eAreaObj.childNodes.length == 0 )
		{
			var spanObj = JC_CALENDAR.createElement( 'span' );
			spanObj.appendChild( JC_CALENDAR.createTextNode( '　' ) );
			eAreaObj.appendChild( spanObj );
		}

		//
		// Firefox のレンダリング不具合への暫定対処(2007.07)
		//
		//	【注】Firefox で対処されたら削除すること
		// ------------- ここから ---------------
		if( CURRENT_BROWSER == BNAME_FF )
		{
			// スケジュール表示エリアのスタイル指定文字列
			var styleStr = '.txt { width:110px; font-size:12px; line-height:normal; text-align:left; color:#666666; vertical-align:top;border-left:1px solid #B7A25C; padding:3px; }';

			// 一旦スタイル指定文字列を与えてすぐ削除
			if( document.implementation &&
				document.implementation.hasFeature ('HTML', '2.0') &&
				document.implementation.hasFeature ('StyleSheets', '2.0') &&
				document.implementation.hasFeature ('CSS', '2.0') )
			{
				var element = document.getElementsByTagName( 'head' )[0].appendChild( document.createElement( 'style' ) );
				element.type = 'text/css';
				element.sheet.insertRule( styleStr, 0 );
				element.parentNode.removeChild( element );
			}
		}
		// ------------- ここまで ---------------

	}
}


//
// イベント追加処理
//
function jcAddEventData( targetObj, eventObj )
{
	// 詳細カレンダーの document オブジェクト
	var JC_CALENDAR;
	if( CURRENT_BROWSER == BNAME_IE )
	{
		JC_CALENDAR = document.frames[ 'calendar' ].document;	// IE
	}
	else
	{
		JC_CALENDAR = document.getElementById( 'jcDetail' ).contentWindow.document; // Safari, Firefox
	}
	
	// 表示対象グループか否かをチェック
	if( JC_CURRENT_GROUP != 'all' )
	{
		// 表示対象外
		if( eventObj.groupId.length <= 0 || eventObj.groupId.indexOf( JC_CURRENT_GROUP ) == -1 )
		{
			return;
		}
	}

	// イベントオブジェクトを作成	
	var evSpan = JC_CALENDAR.createElement( 'span' );
	
	// NEW アイコン
	if( eventObj.newFlag )
	{
		var imgObj = JC_CALENDAR.createElement( 'img' );
		imgObj.setAttribute( 'alt', jcDataObj.jcNewEventIconName );
		imgObj.setAttribute( 'title', jcDataObj.jcNewEventIconName );
		imgObj.setAttribute( 'src', jcIconDir + jcDataObj.jcNewEventIcon );
		evSpan.appendChild( imgObj );
	}
	
	// メディアアイコン
	var mIcon = JC_CALENDAR.createElement( 'img' );
	mIcon.setAttribute( classAttrKey, 'jcMediaIcon' );
	mIcon.setAttribute( 'alt', jcDataObj.jcEventType[ eventObj.eventType ].name );
	mIcon.setAttribute( 'title', jcDataObj.jcEventType[ eventObj.eventType ].name );
	mIcon.setAttribute( 'src', jcIconDir + jcDataObj.jcEventType[ eventObj.eventType ].icon );
	evSpan.appendChild( mIcon );
	
	// 時間
	if( eventObj.fromTime != "" || eventObj.toTime != "" )
	{
		evSpan.appendChild( JC_CALENDAR.createTextNode( eventObj.fromTime + '-' + eventObj.toTime ) );
		evSpan.appendChild( JC_CALENDAR.createElement( 'br' ) ); // 改行
	}
	
	var eventTxt = "";
	
	// メディアタイプ(SINGLE / ALBUM)
	if( eventObj.mediaType != "" )
	{
		eventTxt += eventObj.mediaType + " ";
	}

	// タイトル
	if( eventObj.eventTitle != "" )
	{
		eventTxt += eventObj.eventTitle;
	}
	
	// 放送局／出版社など
	if( eventObj.eventAuthor != "" )
	{
		eventTxt += "(" + eventObj.eventAuthor + ")";
	}
	
	// 出演者
	if( eventObj.artists != "" )
	{
		eventTxt += "/" + eventObj.artists;
	}

	/**
	 * FireFoxの場合、wbrタグを追加
	 */
	if( CURRENT_BROWSER == BNAME_FF ) {
		var wbr = JC_CALENDAR.createElement('wbr');

		var alnumCount = 0;
		var c = "";
		var tmpStr = "";
		for( var i = 0; i < eventTxt.length ; i++ ) {
			c = eventTxt.charAt(i);
			if( alnumCount > 9 || (alnumCount > 0 && (c == "." || c == "/" || c == ":" || c == ";" || c == "," || c == "#" || c == "&" || c == "(" || c == ")" || c == "!" ) || c == "×" ) ) {
				evSpan.appendChild( JC_CALENDAR.createTextNode( tmpStr ) );
				evSpan.appendChild( wbr.cloneNode(true) );
				tmpStr = "";
				alnumCount = 0;
			}

			if( (c >= "A" && c <= "z") || (c >= "0" && c <= "0") || c == "." || c == "/" || c == ":" || c == ";" || c == "," || c == "#" || c == "&" || c == "(" || c == ")" || c == "!" || c == "×" ) { 
				alnumCount++;
			} else {
				alnumCount = 0;
			}
			tmpStr = tmpStr + c;
		}

		evSpan.appendChild( JC_CALENDAR.createTextNode( tmpStr ) );
	} else {
		evSpan.appendChild( JC_CALENDAR.createTextNode( eventTxt ) );
	}

	// 作成したイベントオブジェクトを追加
	targetObj.appendChild( evSpan );
}

