
// スクリプト実行結果ステータスのみをチェック
function script_exec_callback(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"});
		}
	} 
}

// 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;
}

// デジタルポートの値やコンフィギュレーションの設定値が入ったパラメータを
///受け取ってチェックボックスに反映させる
//
// パラメータフォーマット (data オブジェクト中のこの関数で使用するタグのみを抜粋)
//
// { ... ,"DIO_VALUE":XXXXXX", ...."}
//               XXXXXX: デジタルポートの値を24ビット幅16進数表記の値
//
// { ... ,"DIO_CONFIG":XXXXXX", ...."}
//               XXXXXX: デジタルポートの出力モードのビットを 1 に、入力モードのビットを0
//               にした 24ビット幅16進数表記の値
// 
function apply_ui(data){
	var pval;
	var	flag;
	var visible;

	if (data.DIO_CONFIG != null){
		pval = parseInt(data.DIO_CONFIG,16);

		if((pval & (1 << 0)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox0").checkboxradio(visible);
		if((pval & (1 << 1)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox1").checkboxradio(visible);
		if((pval & (1 << 2)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox2").checkboxradio(visible);
		if((pval & (1 << 3)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox3").checkboxradio(visible);
		if((pval & (1 << 4)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox4").checkboxradio(visible);
		if((pval & (1 << 5)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox5").checkboxradio(visible);
		if((pval & (1 << 6)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox6").checkboxradio(visible);
		if((pval & (1 << 7)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox7").checkboxradio(visible);
		if((pval & (1 << 8)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox8").checkboxradio(visible);
		if((pval & (1 << 9)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox9").checkboxradio(visible);
		if((pval & (1 << 10)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox10").checkboxradio(visible);
		if((pval & (1 << 11)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox11").checkboxradio(visible);
		if((pval & (1 << 12)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox12").checkboxradio(visible);
		if((pval & (1 << 13)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox13").checkboxradio(visible);
		if((pval & (1 << 14)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox14").checkboxradio(visible);
		if((pval & (1 << 15)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox15").checkboxradio(visible);
		if((pval & (1 << 16)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox16").checkboxradio(visible);
		if((pval & (1 << 17)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox17").checkboxradio(visible);
		if((pval & (1 << 18)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox18").checkboxradio(visible);
		if((pval & (1 << 19)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox19").checkboxradio(visible);
		if((pval & (1 << 20)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox20").checkboxradio(visible);
		if((pval & (1 << 21)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox21").checkboxradio(visible);
		if((pval & (1 << 22)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox22").checkboxradio(visible);
		if((pval & (1 << 23)) != 0){ visible = "enable"; } else { visible = "disable"; }
		$("#checkbox23").checkboxradio(visible);

	}

	if (data.DIO_VALUE != null){
		pval = parseInt(data.DIO_VALUE,16);

		flag = ((pval & (1 << 0)) != 0);
		if ($("#checkbox0").checked != flag) $("#checkbox0").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 1)) != 0);
		if ($("#checkbox1").checked != flag) $("#checkbox1").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 2)) != 0);
		if ($("#checkbox2").checked != flag) $("#checkbox2").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 3)) != 0);
		if ($("#checkbox3").checked != flag) $("#checkbox3").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 4)) != 0);
		if ($("#checkbox4").checked != flag) $("#checkbox4").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 5)) != 0);
		if ($("#checkbox5").checked != flag) $("#checkbox5").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 6)) != 0);
		if ($("#checkbox6").checked != flag) $("#checkbox6").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 7)) != 0);
		if ($("#checkbox7").checked != flag) $("#checkbox7").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 8)) != 0);
		if ($("#checkbox8").checked != flag) $("#checkbox8").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 9)) != 0);
		if ($("#checkbox9").checked != flag) $("#checkbox9").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 10)) != 0);
		if ($("#checkbox10").checked != flag) $("#checkbox10").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 11)) != 0);
		if ($("#checkbox11").checked != flag) $("#checkbox11").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 12)) != 0);
		if ($("#checkbox12").checked != flag) $("#checkbox12").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 13)) != 0);
		if ($("#checkbox13").checked != flag) $("#checkbox13").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 14)) != 0);
		if ($("#checkbox14").checked != flag) $("#checkbox14").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 15)) != 0);
		if ($("#checkbox15").checked != flag) $("#checkbox15").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 16)) != 0);
		if ($("#checkbox16").checked != flag) $("#checkbox16").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 17)) != 0);
		if ($("#checkbox17").checked != flag) $("#checkbox17").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 18)) != 0);
		if ($("#checkbox18").checked != flag) $("#checkbox18").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 19)) != 0);
		if ($("#checkbox19").checked != flag) $("#checkbox19").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 20)) != 0);
		if ($("#checkbox20").checked != flag) $("#checkbox20").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 21)) != 0);
		if ($("#checkbox21").checked != flag) $("#checkbox21").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 22)) != 0);
		if ($("#checkbox22").checked != flag) $("#checkbox22").attr("checked",flag).checkboxradio("refresh");
		flag = ((pval & (1 << 23)) != 0);
		if ($("#checkbox23").checked != flag) $("#checkbox23").attr("checked",flag).checkboxradio("refresh");
	}
}


// REMOLAB/DIO_GET スクリプト実行結果のイベントハンドラ。
function io_get_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;
	}
	if (data.ResultParams.STATUS != "OK"){
		$.mobile.changePage( "#error_quit_dialog", {transition: "pop",role:"dialog"});
		return;
	}

	apply_ui(data.ResultParams);
}


// UI コンポーネントの初期値ロード
function load_tdcp_dio(){
	var params = {};
	params["device"] = target_xbee_device;
	script_exec("REMOLAB/DIO_GET",params,"io_get_handler");
}

// デジタルポート操作用のメイン画面が表示された
$( "#page1" ).live( "pageshow",function(event){
	load_tdcp_dio();
});

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

// サーバー側でログイン操作が成功したらデバイス選択画面に移動する
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_tdcp_dio();
});


// XBee デバイスリストを取得する
function list_xbee_device(){
	script_exec("REMOLAB/XBEE_LIST",{},"list_xbee_handler");
}

// REMOLAB/XBEE_LIST スクリプト実行結果のイベントハンドラ。
function list_xbee_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;
	}

	// リストビューに XBee デバイス名を表示する
	$("#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 != ""){
		target_xbee_device = attrVal;
		params["device"] = target_xbee_device;
		script_exec("REMOLAB/DEVICE_AVAILABLE",params,"device_available_handler");
	}
});

// REMOLAB/DEVICE_AVAILABLE スクリプト実行結果のイベントハンドラ。
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;
	}

	if (data.ResultParams.STATUS != "OK"){
		$.mobile.changePage( "#invalid_device_dialog", {transition: "pop",role:"dialog"});
		return;
	}

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

}


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



///////////////////////////////////////////////////////////////////////////////////////
// (オプション機能)
//
// この機能を使用する場合には、サーバー側でデバイスからのイベントデータを
// ブラウザに配信する node.js + socket.io で作成されたリレーサーバーを
// 実行して下さい (node event_relay_server.jsで実行できます)
//
// リモートデバイスの I/O 状態が変更された場合に最新のI/O データが配信されてくる
// これを受信するために WebSocket(socket.io) でリレーサーバーに接続する
//
///////////////////////////////////////////////////////////////////////////////////////

var socket = io.connect("/",{ port:9090});

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

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


