﻿var start_time = null;
var end_time;
var task_name;

var next_time = null;
var next_name;
var warter_class;

var load_counter = 0;
var set_interval = false;
var timer_interval;
var free_time = false;
var api_url = this_url + "/api/gettasks.php";

var time_status = 0;
var lastfinish_tasktime = null;
var lastspeak_sec = null;
var lastspeak_nsec = null;

var last_nowtime = null;

var drawTaskName = function() {
	var dateFormat = new DateFormat("HH:mm");
	var dFormat = new DateFormat("MM/dd");
	
	if (start_time == null) {
		$("tasktime").innerHTML = "&nbsp;";
		$("taskname").innerHTML = "&nbsp;";
	} else {
		var dstr = dFormat.format(start_time);
		var edstr = dFormat.format(end_time);
		var sstr = dateFormat.format(start_time);
		var estr = dateFormat.format(end_time);
		if (dstr != edstr) {
			estr = "(" + edstr + ")" + estr;
		}
		$("tasktime").innerHTML = "(" + dstr + ")" + sstr + "-" + estr;
		$("taskname").innerHTML = task_name
	}
	if (next_time == null) {
		$("nexttime").innerHTML = "&nbsp;";
		$("nextname").innerHTML = "&nbsp;";
	} else {
		var ndstr = dFormat.format(next_time);
		if (start_time != null) {
			if (dstr == ndstr) {
				ndstr = "";
			}
		}
		if (ndstr != "") {
			ndstr = "(" + ndstr + ")";
		}
		$("nexttime").innerHTML = "[Next] " + ndstr + dateFormat.format(next_time);
		$("nextname").innerHTML = next_name;
	}
}

var notTaskDisplay = function() {
	if (background_black) {
		$("body").className = "black";
	} else {
		$("body").className = "white";
	}
	switch(bar_style) {
		case 1:
		case 2:
			$("watermark").style.height = "0%";
			break;
		case 3:
		case 4:
			$("watermark").style.width = "0%";
			break;
	}
	$("time").innerHTML = "No Plan";
}

var setWaterMark = function(sec, nsec){
	var color = "color-normal";
	var time = nsec;
	time_status = 0;
	if (time < (hurryup_time)) {
		color = "color-hurryup";
		time_status = 1;
	} else if(time < (warning_time)) {
		color = "color-warning";
		time_status = 2;
	}
	if (free_time) {
		color = "color-free";
		time_status = 3;
	}
	if (nowtime_show) {
		$("time").className = color;
		$("watermark").style.display = "none";
	} else {
		switch(bar_style) {
			case 1:
			case 2:
				$("watermark").style.height = getTimerPersent(sec, nsec) + "%";
				break;
			case 3:
			case 4:
				$("watermark").style.width = getTimerPersent(sec, nsec) + "%";
				break;
		}
		$("time").className = "";
		$("watermark").className = warter_class + " bg" + color;
		$("watermark").style.display = "block";
	}
	if (background_black) {
		$("body").className = "black";
	} else {
		$("body").className = "white";
	}
}

var formatDisplayTimeStyle = function(time){
	if (nowtime_show) {
		var now = nowDateTime(); //new Date();
		var dateFormat = new DateFormat("HH:mm:ss");
		$("time").innerHTML = dateFormat.format(now);
	} else {
		var h = parseInt(time / (60 * 60));
		var m = parseInt((time % (60 * 60)) / 60);
		var s = parseInt(time % 60);
		$("time").innerHTML = right("00" + h, 2) + ":" + right("00" + m, 2) + ":" + right("00" + s, 2);
	}
}

var nowDateTime = function() {
	var now = new Date();
	var offset = now.getTimezoneOffset();
	offset = offset + (time_offset * 60);
	now.setTime(now.getTime() + (offset * 60 * 1000));
	if (setdate != null) {
		var setnow = now;
		setnow.setFullYear(setdate.substring(0,4));
		setnow.setMonth(setdate.substring(5,7)-1);
		setnow.setDate(setdate.substring(8,10));
		now = setnow;
	}
	return now;
}

var getTimerSec = function() {
	return ((end_time.getTime() - start_time.getTime()) / 1000);
}

var getTimerPersent = function(sec, nsec) {
	return (((sec - nsec) / sec) * 100);
}

var getTimerNowSec = function() {
	var now = new nowDateTime();
	var nsec = ((end_time.getTime() - now.getTime()) / 1000);
	return parseInt(nsec);
}

var reload_calendar = function() {
	load_counter = reload_interval;
}

var countdown = function(){
	if (!set_interval) {
		set_interval = true;
		timer_interval = setInterval(function(){
			load_counter++;
			if (load_counter >= reload_interval) {
				load_counter = 0;
				getTasks();
			}
			var nowtime = (new nowDateTime()).getTime();
			if (last_nowtime == null) {
				last_nowtime = nowtime;
			}
			if (last_nowtime > nowtime) {
				last_nowtime = nowtime; 
				load_counter = 0;
				clearInterval(timer_interval);
				set_interval = false;
				getTasks();
			}
			if (start_time != null) {
				var sec = getTimerSec();
				var nsec = getTimerNowSec();
				if (nsec < 1) {
					// タイマーを停止して新しいタスク情報を取得する。
					clearInterval(timer_interval);
					set_interval = false;
					if (lastfinish_tasktime != sec) {
						lastfinish_tasktime = sec;
						var spearkfile = voicedir + "/finished.mp3";
						var spearkaddfile = null;
						if (free_time == false) {
							spearkaddfile = voicedir + "/goodwork.mp3";
						}
						if (spearkaddfile == null) {
							playmp3.playFile(spearkfile);
						} else {
							playmp3.playFile2(spearkfile, spearkaddfile);
						}
					}
					getTasks();
				} else {
					setWaterMark(sec, nsec);
					formatDisplayTimeStyle(nsec);
					
					if (voice) {
						if (parseInt(nsec % 60) == 0) {
							var spearktime = parseInt(nsec / 60);
							var spearkout = false;
							var spearkaddfile = null;
							var spearkstatus = 0;
							if (nsec <= (hurryup_time)) {
								spearkstatus = 1;
								if (nsec == hurryup_time) {
									spearkout = true;
									spearkaddfile = voicedir + "/hurryup.mp3";
								}
							} else if(nsec <= (warning_time)) {
								spearkstatus = 2;
								if (nsec == warning_time) {
									spearkout = true;
									spearkaddfile = voicedir + "/goodluck.mp3";
								}
							}
							if (free_time) {
								spearkstatus = 0;
								spearkout = false;
							}
							if (spearkstatus == 1 && parseInt(spearktime % 5) == 0) {
								spearkout = true;
							} else if (spearkstatus == 2 && parseInt(spearktime % 10) == 0) {
								spearkout = true;
							} else if (spearkstatus == 0 && parseInt(spearktime % 30) == 0) {
								spearkout = true;
							} else if (spearktime == 1) {
								spearkout = true;
							}
							if (spearktime > 60) {
								spearkout = false;
							}
							//spearkout = true;
							//spearktime = 15;
							if (spearkout == true) {
								var spearkfile = voicedir + "/" + spearktime + ".mp3";
								if (lastspeak_sec == sec && lastspeak_nsec == nsec) {
									// 前回アナウンスしている内容と同じ場合はしゃべらない									
								} else {
									lastspeak_sec = sec;
									lastspeak_nsec == nsec;
									if (spearkaddfile == null) {
										playmp3.playFile(spearkfile);
									} else {
										playmp3.playFile2(spearkfile, spearkaddfile);
									}
								}
							}
						}
					}
				}
			}
		},1000);
	}
}

var right = function(str, n) {
    l = str.length;
    if (n>l) n=l;
    return(str.substring(l-n, l));
}

/*
var getTasks = function() {
	var url = api_url;
	var now = new nowDateTime();
	var msec = now.getTime();
	var updatestr = "";
	if (last_update != null) {
		updatestr = last_update;
	}
	var dateFormat = new DateFormat("yyyy/MM/dd");
	var reqdate = dateFormat.format(now);
	if (setdate != null) {
		reqdate = setdate;
	}
	$("busy").src = this_url + "/images/loader.gif";

	new Ajax.Request(url, {
		method: "get",
		parameters: "cache="+msec+"&update="+updatestr+"&timeoffset="+encodeURI(time_offset)+"&reqdate="+reqdate+"&xmlurl="+encodeURI(xmlurl),
		onSuccess:function(httpObj) {
			var res = httpObj.responseText;
			loadSuccess(res);
		},
		onFailure:function(httpObj) {
			//window.alert('サーバーとの通信でエラーが発生しました。');
			$("busy").src = this_url + "/images/spacer.gif";
		}
	});
}
*/

var loadSuccess = function(res) {
	$("busy").src = this_url + "/images/spacer.gif";
	if (res == null || res == "") {
		//window.alert('カレンダーデータが受信できませんでした。');		
		checkTask();
	} else {
		var jsonObj = eval('(' + res + ')');
		var status = jsonObj.status;
		if (status == 2) {
			// サーバー側でデータ変更がなかった
			checkTask();
		} else if (status == 1) {
			var now_day = (new nowDateTime()).getDate();
			if (load_date != now_day) {
				// 日付が変わった場合には更新を必ず行う
				last_update = null;
				load_date = now_day;
			}
			var update = jsonObj.update;
			if (set_interval == false || last_update == null || last_update != update) {
				// タイマーが開始していないか、データが更新されている場合のみタスクの再チェックを行う。
				tasks = jsonObj.tasks;
				checkTask();
				// これをコメントアウトしていると毎回更新する
				last_update = update;
			}
		} else {
			// エラーの場合は全て停止する
			window.alert(jsonObj.error);
			clearInterval(timer_interval);
			set_interval = true;
		}
	}
}

var drawTimer = function() {
	var sec = getTimerSec();
	var nsec = getTimerNowSec();
	setWaterMark(sec, nsec);
	formatDisplayTimeStyle(nsec);
}

var checkTask = function() {
	start_time = null;
	next_time = null;
	free_time = false;
	
	if (tasks != null) {
		var now = new nowDateTime();
		var dateFormat = new DateFormat("yyyy/MM/dd HH:mm:ss");
		var nowstr = dateFormat.format(now);
		var near_time = null;
		
		//ソート
		var ret = tasks.sortBy(function(value, index){
			return value.start_time;
		});
		tasks = ret;
		
		for(var i=0; i<tasks.length; i++) {
			var task = tasks[i];
			if (nowstr >= task.start_time && nowstr <= task.end_time) {
				start_time = new Date(task.start_time);
				end_time = new Date(task.end_time);
				task_name = task.name;
				if (i < tasks.length - 1) {
					var next = tasks[i+1];
					next_time = new Date(next.start_time);
					next_name = next.name;
				}
				drawTaskName();
				drawTimer();
				countdown();
				return;
			}
			if (nowstr < task.start_time && near_time == null) {
				near_time = task.start_time;
				var next = task;
				next_time = new Date(next.start_time);
				next_name = next.name;
				if (i > 0) {
					var old = tasks[i-1];
					start_time = new Date(old.end_time);
				} else {
					var todatyDateFormat = new DateFormat("yyyy/MM/dd 00:00:00");
					start_time = new Date(todatyDateFormat.format(now));
				}
				end_time = next_time;
				task_name = "[Free Time]";
				free_time = true;
				drawTaskName();
				drawTimer();
				countdown();
				return;
			}
		}
		notTaskDisplay();
		drawTaskName();
		countdown();
	} else {
		notTaskDisplay();
		drawTaskName();
		countdown();
	}
}

var change_barstyle = function() {
	switch(bar_style) {
		case 1:
			warter_class="watermark-up";
			$("watermark").style.width = "100%";
			break;
		case 2:
			warter_class="watermark-down";
			$("watermark").style.width = "100%";
			break;
		case 3:
			warter_class="watermark-right";
			$("watermark").style.height = "100%";
			break;
		case 4:
			warter_class="watermark-left";
			$("watermark").style.height = "100%";
			break;
	}
	$("watermark").className = warter_class
}

var change_nowtime = function() {
	nowtime_show = (nowtime_show == false);
	return true;
};

var change_nowtime_on = function() {
	nowtime_show = true;
	return true;
};

var change_nowtime_off = function() {
	nowtime_show = false;
	return true;
};

var change_voice_on = function() {
	voice = true;
	return true;
};

var change_voice_off = function() {
	voice = false;
	return true;
};

var change_background = function() {
	background_black = (background_black == false);
	return true;
};

var change_background_black = function() {
	background_black = true;
	return true;
};

var change_background_white = function() {
	background_black = false;
	return true;
};

var change_bar_up = function() {
	bar_style = 1;
	change_barstyle();
	return true;
};

var change_bar_down = function() {
	bar_style = 2;
	change_barstyle();
	return true;
};

var change_bar_right = function() {
	bar_style = 3;
	change_barstyle();
	return true;
};

var change_bar_left = function() {
	bar_style = 4;
	change_barstyle();
	return true;
};	

var change_bar = function() {
	bar_style++;
	if (bar_style > 4) {
		bar_style = 1;
	}
	change_barstyle();
	return true;
}

var timeclick = function(event) {
	if (Event.isLeftClick(event)) {
		if ($("time").innerHTML == "No Plan") {
			menushow();
		} else {
			change_nowtime();
		}
	}
}

var nextinfoclick = function(event) {
	if (Event.isLeftClick(event)) {
		change_bar();
	}
}

var keyassign = function() {
	shortcut.add("T",change_nowtime);
	shortcut.add("B",change_background);
	shortcut.add("Up",change_bar_up);
	shortcut.add("Down",change_bar_down);
	shortcut.add("Right",change_bar_right);
	shortcut.add("Left",change_bar_left);	
}

var wiiassign = function() {
	if (wii.isWiiOperaBrowser()) { 
		var wiimote = new wii.Wiimote();
		
		wiimote.handleB = change_background;
		wiimote.handleUp = change_bar_up;
		wiimote.handleDown = change_bar_down;
		wiimote.handleRight = change_bar_right;
		wiimote.handleLeft = change_bar_left;
		wii.addController(wiimote);
		
		wii.setupHandlers();
	}
}

Event.observe(window,"load",function(e){
	change_barstyle();
	
	if (tasks == null) {
		getTasks();
	} else {
		checkTask();
	}
	prepareTimeFontSize();
	
	keyassign();
	wiiassign();
	
	Event.observe('time', 'click', timeclick);
	Event.observe('nextinfo', 'click', nextinfoclick);
	
});


Event.observe(window,"resize",function(e){
	prepareTimeFontSize();
});

