/**************************
サーバーに設置した gettime.php から時刻を取得。
一定間隔で取得することも可能。
JSONなのでクロスドメインは非対応。

参考：日付関係
http://www.hoge256.net/2007/08/64.html

usage:
<script language="JavaScript" type="text/javascript" src="jqGetTimeTimer.js"></script>
<script language="JavaScript" type="text/javascript">
<!--
	jqGetTimeTimer.SCRIPT_URL = 'gettime.php';
	jqGetTimeTimer.getTimeTimer();
// -->
</script>



*************************/

var JqGetTime = {
	// 時刻取得スクリプトURL
	SCRIPT_URL : "gettime.php",
	
	// 取得したサーバー時刻
	serverDate : null,
	
	// インターバルリスト
	intervalList: [],
	
	/******************************
	* 準備完了時に実行
	* @param callback	時刻取得後に実行した関数
	*/
	ready : function( callback ){
		JqGetTime.callback = callback;
		jQuery.getJSON( JqGetTime.SCRIPT_URL, JqGetTime.___onGetJson );
	},
	
	/*******************************
	* 今日が指定日ならelmYesを表示、違うならelmNoを表示
	*/
	XdayVisible : function( year, mon, day, elmYes, elmNo, loop  ){
		var param = {year:year, mon:mon, day:day, elmYes:elmYes, elmNo:elmNo };
		
		// loop==true なら繰り返し設定
		if( loop ){
			JqGetTime.intervalList.push({ 
				func : JqGetTime.___XdayVisible,  
				param: param,
				callback: null
			});
		}
		
		JqGetTime.___XdayVisible( null, param );
	},
	/*******************************
	* 今日が指定日ならelmYesを表示、違うならelmNoを表示：実行部
	*/
	___XdayVisible : function( callback, param ){
		
		if( JqGetTime.isXday( param.year, param.mon, param.day ) ){
			$(param.elmYes).show();
			$(param.elmNo).hide();
		}else{
			$(param.elmYes).hide();
			$(param.elmNo).show();
		}
	},
	
	/*******************************
	* 今日が指定日か
	*/
	isXday : function( year, mon, day, callback ){
		
		// コールバックが設定されてる場合は繰り返し設定
		if( callback ){
			JqGetTime.intervalList.push({ 
				func : JqGetTime.___isXday,  
				param: [year, mon, day],
				callback: callback
			});
		}
		
		return JqGetTime.___isXday( callback, [year, mon, day] );
	},
	/*******************************
	* 今日が指定日か：実行部分
	*/
	___isXday : function( callback, param ){
		var result;
		var now = JqGetTime.serverDate;
		
		if( now.getFullYear() == param[0] && now.getMonth()+1 == param[1] && now.getDate() == param[2] ){
			result = true;
		}else{
			result = false;
		}

		// コールバックが設定されてるなら実行
		if( callback ) callback( result );
		
		return result;
	},
	
	/*******************************
	* 指定されたタイミングか
	* 指定しない項目は「null」にする
	* wday は曜日（0-6）。
	*/
	isXtime : function( year, mon, day, hour, min, sec, wday, callback ){
		var param = { year:year, mon:mon, day:day, hour:hour, min:min, sec:sec, wday:wday };
		
		// コールバックが設定されてる場合は繰り返し設定
		if( callback ){
			JqGetTime.intervalList.push({ 
				func : JqGetTime.___isXtime,  
				param: param,
				callback: callback
			});
		}
		
		return JqGetTime.___isXtime( callback, param );
	},
	/*******************************
	* 指定されたタイミングか：実行部
	*/
	___isXtime : function( callback, param ){
		var result = true;
		var now = JqGetTime.serverDate;
		
		if( param.year != null  && now.getFullYear() != param.year ) result = false;
		if( param.mon != null   && now.getMonth()+1 != param.mon ) result = false;
		if( param.day != null   && now.getDate() != param.day ) result = false;
		if( param.hour != null  && now.getHours() != param.hour ) result = false;
		if( param.min != null   && now.getMinutes() != param.min ) result = false;
		if( param.sec != null   && now.getSeconds() != param.sec ) result = false;
		if( param.wday != null  && now.getDay() != param.wday ) result = false;
		
		// コールバックが設定されてるなら実行
		if( callback && result ) callback( result );
		
		return result;
	},
	
	/*******************************
	* 現在時刻取得
	*/
	getTime : function( callback ){
		// コールバックが設定されてる場合は繰り返し設定
		if( callback ){
			JqGetTime.intervalList.push({ 
				func : JqGetTime.___getTime,  
				callback: callback
			});
		}
		
		return JqGetTime.___getTime( callback );
	},
	
	/*******************************
	* 現在時刻取得：実行部分
	*/
	___getTime : function( callback ){
		// コールバックが設定されてるなら実行
		if( callback ) callback( JqGetTime.serverDate );
		
		return JqGetTime.serverDate;
	},

	/*******************************
	* 指定日までの残り日数
	*/
	remainDay : function( year, mon, day, callback ){
		var param = {year:year, mon:mon, day:day };
		
		// コールバックが設定されてる場合は繰り返し設定
		if( callback ){
			JqGetTime.intervalList.push({ 
				func : JqGetTime.___remainDay,
				param : param,
				callback: callback
			});
		}
		
		return JqGetTime.___remainDay( callback, param );
	},
	
	/*******************************
	* 指定日までの残り日数：実行部
	*/
	___remainDay : function( callback, param ){
		var target = new Date( param.year, param.mon-1, param.day );
		var now = JqGetTime.serverDate;
		
		var time = target.getTime() - now.getTime();
		var day = Math.ceil( time / ( 1000*60*60*24 ) );
		
		// コールバックが設定されてるなら実行
		if( callback ) callback( day );
		
		return day;
	},

	/*******************************
	* 指定日までの残り時間
	* {day:999, hour:24, min:60, sec:60 } の形式で返す
	*/
	remainTime : function( year, mon, day, hour, min, sec, callback ){
		var param = { year:year, mon:mon, day:day, hour:hour, min:min, sec:sec };
		
		// コールバックが設定されてる場合は繰り返し設定
		if( callback ){
			JqGetTime.intervalList.push({ 
				func : JqGetTime.___remainTime,
				param : param,
				callback: callback
			});
		}
		
		return JqGetTime.___remainTime( callback, param );
	},
	
	/*******************************
	* 指定日までの残り時間：実行部
	*/
	___remainTime : function( callback, param ){
		var target = new Date( param.year, param.mon-1, param.day, param.hour, param.min, param.sec );
		var now = JqGetTime.serverDate;
		
		var time = target.getTime() - now.getTime();

		var rDay = Math.floor( time / (1000 * 60 * 60 * 24));
		time = time - ( rDay * (1000 * 60 * 60 * 24));
		var rHour = Math.floor( time / (1000 * 60 * 60));
		time = time - ( rHour * (1000 * 60 * 60));
		var rMin = Math.floor( time / (1000 * 60));
		time = time - ( rMin * (1000 * 60));
		var rSec = Math.floor( time / 1000 );
		
		var result = { day:rDay, hour:rHour, min:rMin, sec:rSec };
		
		// コールバックが設定されてるなら実行
		if( callback ) callback( result );
		
		return result;
	},

	/*************************
	* 時刻のjsonを取得した
	* 返ってきたjsonデータはオブジェクトで、下記の内容。
	* seconds ---- 秒
	* mimutes --- 分
	* hours ----- 時
	* mday ------ 月次の日付
	* wday ------ 曜日番号
	* mon ------- 月
	* year ------ 年
	* yday ------ その年の通算日
	* weekday --- 曜日の文字列
	* month ----- 月の文字列
	* unix ------ Unixタイム
	*/
	___onGetJson : function( json ){
		// javascriptのData型を作る
		JqGetTime.serverDate = new Date( json.year, json.mon-1, json.mday, json.hours, json.minutes, json.seconds  );
		
		// 指定されたコールバックを実行
		JqGetTime.callback( JqGetTime.serverDate );
		
		// インターバル設定
		setInterval( JqGetTime.___interval, 1000 );
	},
	
	/*************************
	* インターバル実行
	*/
	___interval : function(){
		
		// 一秒進める
		var unixtime = JqGetTime.serverDate.getTime();
		JqGetTime.serverDate.setTime( unixtime + (1000) );
		
		// 設定された関数を実行
		var list = JqGetTime.intervalList;
		var i=0;
		
		for( i=0; i<list.length; i++ ){
			var item = list[i];
			item.func( item.callback, item.param );
		}
	}
	
};


