
// スクリプト実行結果ステータスのみをチェック
function script_exec_callback(data){
	if (data.Result != "Success"){
		if(data.ErrorText.match(/CertifyUpdateSession failed/i)) {
			$("#login_password").val("");
			$.mobile.changePage( "#error_quit_dialog", {transition: "pop",role:"dialog"});
		} else {
			$.mobile.changePage( "#error_back_dialog", {transition: "pop",role:"dialog"});
		}
	} 
}

// スクリプト実行結果ステータスチェックとUI 値リロード
function script_exec_callback_reload(data){
	if (data.Result != "Success"){
		if(data.ErrorText.match(/CertifyUpdateSession failed/i)) {
			$("#login_password").val("");
			$.mobile.changePage( "#error_quit_dialog", {transition: "pop",role:"dialog"});
		} else {
			$.mobile.changePage( "#error_back_dialog", {transition: "pop",role:"dialog"});
		}
	}
	load_arduino_io();
}

// UI コンポーネントの xml 属性値を検索取得
function getAttrVal(node,name){
	var val = "";
	var attr =  node.attributes;
	for (var i=0; i<attr.length; i++){
		if (attr[i].nodeName == name){
			val = attr[i].nodeValue;
		}
	}
	return val;
}

// IO ポート値の配列を受け取ってチェックボックスの値に反映させる
//
// パラメータデータフォーマット
//
// { "PORT_0":"xx","PORT_1":"xx" }
//
function apply_ui(data){
	var pval;
	var	flag;

	if (data.PORT_0 != ""){
		pval = parseInt(data.PORT_0,16);

		flag = ((pval & (1 << 2)) != 0);
		if ($("#checkbox1").checked != flag) $("#checkbox1").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 3)) != 0);
		if ($("#checkbox2").checked != flag) $("#checkbox2").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 4)) != 0);
		if ($("#checkbox3").checked != flag) $("#checkbox3").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 5)) != 0);
		if ($("#checkbox4").checked != flag) $("#checkbox4").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 6)) != 0);
		if ($("#checkbox5").checked != flag) $("#checkbox5").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 7)) != 0);
		if ($("#checkbox6").checked != flag) $("#checkbox6").attr("checked",flag).checkboxradio("refresh");

	}

	if (data.PORT_1 != ""){
		pval = parseInt(data.PORT_1,16);

		flag = ((pval & (1 << 0)) != 0);
		if ($("#checkbox7").checked != flag) $("#checkbox7").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 1)) != 0);
		if ($("#checkbox8").checked != flag) $("#checkbox8").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 2)) != 0);
		if ($("#checkbox9").checked != flag) $("#checkbox9").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 3)) != 0);
		if ($("#checkbox10").checked != flag) $("#checkbox10").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 4)) != 0);
		if ($("#checkbox11").checked != flag) $("#checkbox11").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 5)) != 0);
		if ($("#checkbox12").checked != flag) $("#checkbox12").attr("checked",flag).checkboxradio("refresh");

	}
}


// ARDUINO_IO_GET スクリプト実行結果のイベントハンドラ。
function io_get_handler(data){
	if (data.Result != "Success"){
		if(data.ErrorText.match(/CertifyUpdateSession failed/i)) {
			$("#login_password").val("");
			$.mobile.changePage( "#error_quit_dialog", {transition: "pop",role:"dialog"});
		} else {
			$.mobile.changePage( "#error_back_dialog", {transition: "pop",role:"dialog"});
		}
		return;
	}
	apply_ui(data.ResultParams);
}


// UI コンポーネントの初期値ロード
function load_arduino_io(){
	var params = {};
	params["com"] = arduino_comport;
	script_exec("ARDUINO/IO_GET",params,"io_get_handler");
}

// メインページが表示された
$( '#page1' ).live( 'pageshow',function(event){
	load_arduino_io();
});

// チェックボックスを操作してArduino ピンの値が更新された
$('input[class="pin"]' ).bind( "change", function(event, ui){
	var params = {};
	var attrVal = getAttrVal(this,"pin");
	if (attrVal != ""){
		params["com"] = arduino_comport;
		params["pin"] = attrVal;
		if (this.checked){
			params["value"] = "1";
		} else {
			params["value"] = "0";
		}
		script_exec("ARDUINO/PIN_SET",params,"script_exec_callback");
	}
});

// クリアボタンを操作してArduino ポートの値がクリアされた
$('[class="port"]' ).bind( "click", function(event, ui){
	var params = {};
	var attrVal = getAttrVal(this,"port");
	if (attrVal != ""){
		params["com"] = arduino_comport;
		params["value"] = "00";
		params["port"] = attrVal;
		script_exec("ARDUINO/IO_PUT",params,"script_exec_callback_reload");
	}
});

// シリアルデバイスリストを取得する
function list_serial_device(){
	script_exec("ARDUINO/DEVICE_LIST",{},"list_serial_handler");
}

// ARDUINO/DEVICE_LIST スクリプト実行結果のイベントハンドラ。
function list_serial_handler(data){
	if (data.Result != "Success"){
		if(data.ErrorText.match(/CertifyUpdateSession failed/i)) {
			$.mobile.changePage( "#error_quit_dialog", {transition: "pop",role:"dialog"});
		} else {
			$.mobile.changePage( "#error_back_dialog", {transition: "pop",role:"dialog"});
		}
		return;
	}

	// リストビューに シリアルデバイス名を表示する
	$("#device_list li").remove();
	for(key in data.ResultParams){
		$('<li data-theme="a"><a data-transition="none" device="' + data.ResultParams[key] + '" class="dev_select">' + 
            data.ResultParams[key] + '</a></li>').appendTo($('#device_list'));
	}
	$("#device_list").listview("refresh");

}

// デバイスが選択されたら、このデバイスが利用可能かどうかの判断を行う
// スクリプトを実行する
$(".dev_select").live( "click", function(event, ui){
	var params = {};
	var attrVal = getAttrVal(this,"device");
	if (attrVal != ""){
		arduino_comport = attrVal;
		params["com"] = arduino_comport;
		script_exec("ARDUINO/VERSION",params,"device_available_handler");
	}
});

// ARDUINO/VERSION スクリプト実行結果のイベントハンドラ。
function device_available_handler(data){
	if (data.Result != "Success"){
		if(data.ErrorText.match(/CertifyUpdateSession failed/i)) {
			$.mobile.changePage( "#error_quit_dialog", {transition: "pop",role:"dialog"});
		} else {
			$.mobile.changePage( "#error_back_dialog", {transition: "pop",role:"dialog"});
		}
		return;
	}

	// Arduino で動作しているスケッチの FIRMATA のプログラム名がこのプログラムでサポート
	// しているものと一致するかを調べる
	if (data.ResultParams.FIRMWARE_NAME != "SensorControlModule"){
		$.mobile.changePage( "#invalid_device_dialog", {transition: "pop",role:"dialog"});
		return;
	}

	// デジタルポート操作用のメイン画面に移動する
	$( "#main_title" ).text(arduino_comport);
	$.mobile.changePage( "#page1", { transition: "none"}); 

}

// サーバー側でログイン操作が成功したらメイン画面に移動する
function login_callback(data){
	if (data.Result == "Success"){
		session_token = data.SessionToken;
		// dump_login_result(data);
		$.mobile.changePage( "#select_device", { transition: "none"}); 
	} else {
		$.mobile.changePage( "#login_error_dialog", {transition: "pop",role:"dialog"}); 
	} 
}

// サーバー側でログアウト操作が完了したらログイン画面に戻る
function logout_callback(data){
	session_token = "";
	$("#login_password").val("");
	$.mobile.changePage( "#login", { transition: "pop"}); 
}

// ログインボタンを押した
$( "#login_btn" ).bind( "click", function(event, ui){
	var user = $("#login_name").val();
	var pass = $("#login_password").val();
	login(user,pass,"login_callback");
});

// ログアウトボタンを押した
$( "#logout_ok_btn" ).bind( "click", function(event, ui){
	logout("logout_callback");
});

// サーバーエラーのダイアログから復帰する場合はログイン画面に戻る
$( "#server_error_ok_btn" ).bind( "click", function(event, ui){
	session_token = "";
	$.mobile.changePage( "#login", { transition: "pop"}); 
});

// ログインページが表示された
$( '#login' ).live( 'pageshow',function(event){
	// セッショントークンが指定されている場合にはユーザー認証を省略する
	if (session_token != ""){
		$.mobile.changePage( "#select_device", { transition: "slide"}); 
	}
});

// リロードボタンが操作された
$( "#reloadBtn" ).bind( "click", function(event, ui){
	load_arduino_io();
});

// デバイス選択画面が表示された
$( "#select_device" ).live( "pageshow",function(event){
	list_serial_device();
});


////////////////////////////////////////////////////////////////
// (オプション機能)
//
// この機能を使用する場合には、サーバー側でデバイスからのイベントデータを
// ブラウザに配信する node.js + socket.io で作成されたリレーサーバーを
// 実行して下さい (node event_relay_server.jsで実行できます)
//
// Arduino の I/O 状態が変更された場合に最新のI/O データが配信されてくる
// これを受信するために WebSocket(socket.io) でリレーサーバーに接続する
//
// WebSocket サーバーが動作しているPC のホスト名とポート番号部分を設定する
//
//		io.connect('http://your_web_socket_server.domain.com/',{ port:9090})
//
// Webサーバー(DeviceServer)が動作しているPC で WebSocketサーバーを起動している
// 場合には
//
// 		io.connect('/',{ port:9090}) のようにする
//
var socket = io.connect('/',{ port:9090});

// リレーサーバーから 'broadcast' タグの付いたメッセージを受信した
socket.on('broadcast', function (data) {
	// 配信されてきたJSON データを取得
	var obj = $.parseJSON(data["message"]);

	// Webアプリで自動更新の対象となるイベントデータを含んでいた場合には、
	// 最新のイベントデータで GUI の状態を更新する
	if((obj.DEVICE == arduino_comport) && (obj.TYPE == "DIGITAL_CHANGE_DETECT")){
		apply_ui(obj);
	}
});


