

//「保存する」ボタンを押したときの挙動
function entry_grid_save( entry_id, block_id ) {
	// 引数チェック
	if( ! entry_id || ! block_id ) return;

	// 保存する値
	var data = $('#entry_grid_'+entry_id+'_'+block_id).EntryGrid_getData();
	
	// ステータス表示
	// ステータスを表示するには、プラグインで描画するHTMLの親<div>の持つ、showStatus()メソッドを実行すればOK
	$('#E_plugin_' + block_id).showStatus('保存しています');

	// 保存用のAPIをたたく
	$.ajax({
		type: 'POST',
		url: '/entry/' + entry_id + '/' + block_id + '/appli/plugin/EntryGrid/save/',
		data: data,
		dataType: 'json',
		success: function( res ) {
			if( res.success ) {
				$('#E_plugin_' + block_id).showStatus('保存しました');
			} else {
				alert( '保存に失敗しました' );
			}
			$('#E_plugin_' + block_id ).closeEditor();
		}
	});
}

//「キャンセル」ボタンを押したときの挙動
function entry_grid_cancel( entry_id, block_id ) {
	// エディタを閉じるには、プラグインで描画するHTMLの親<div>の持つ、closeEditor()メソッドを実行すればOK
	$('#E_plugin_' + block_id ).closeEditor();
}

//「削除する」ボタンを押したときの挙動
function entry_grid_delete( entry_id, block_id, mode ) {
	// 引数チェック
	if( ! entry_id || ! block_id ) return;

	// 確認
	if( mode != 'noconfirm' ) {
		if( ! confirm('本当に削除しますか？') ) return;
	}

	// ステータス表示
	// ステータスを表示するには、プラグインで描画するHTMLの親<div>の持つ、showStatus()メソッドを実行すればOK
	$('#E_plugin_' + block_id).showStatus('削除しています');

	// 削除用のAPIをたたく
	$.ajax({
		type: 'POST',
		url: '/entry/' + entry_id + '/' + block_id + '/appli/plugin/EntryGrid/delete/',
		data: {},
		dataType: 'json',
		success: function( res ) {
			if( res.success ) {
				$('#E_plugin_' + block_id).showStatus('削除しました');
			} else {
				alert( '削除に失敗しました' );
			}
			// 要素を削除するには、プラグインで描画するHTMLの親<div>の持つ、deleteBlock()メソッドを実行すればOK
			$('#E_plugin_' + block_id ).deleteBlock();
		}
	});
}

//------------------------------------------------------------------------------------------------
// EntryGrid
//------------------------------------------------------------------------------------------------
(function($){
	$.fn.EntryGrid = function(options) {
		
		var row = 0;
		var col = 0;
		var values = $(this).EntryGrid_extract_datas(options.data, "line");
		var types = $(this).EntryGrid_extract_datas(options.data, "type");
		$(this).data("selects", options.selects);
		if (options.data && options.data["select_data"]) {
			options.selects.val(options.data["select_data"]);
		} else {
			options.selects.val("○,×");
		}
		if (options.data) {
			row = values.length;
			col = 0;
			if (row != 0) {
				col = values[0].length;
			}
		}
		
		if (options.rows && !row) {
			row = options.rows;
		}
		if (options.cols && !col) {
			col = options.cols;
		}
		
		$(this).empty();
		
		var one_row = "";
		for (var i = 0; i < col; i++) {
			one_row += "<td>&nbsp;</td>";
		}
		for (var i = 0; i < row; i++) {
			$(this).append("<tr>"+one_row+"</tr>");
		}

		if (options.data) {

			var tr = $(this).find("tr:first");

			for (var i = 0; i < values.length; i++) {
				var row = values[i];
				var row_type = null;
				if (types) {
					row_type = types[i];
				}
				var td = tr.find("td:first");
				for (var j = 0; j < row.length; j++) {
					var col = row[j];
					var t = null;
					if (row_type) {
						t = row_type[j];
					}
					td.empty();
					td.append(col);
					td.data("type", t);
					td = td.next();
				}
				tr = tr.next();
			}
		}
		
		if (options.noedit) return;
		$(this).EntryGrid_editable();
	}

	$.fn.EntryGrid_editable = function() {
		var _this = this;
		$(this).find("td").click(function() {
			
			if ($(this).find(":input").length != 0) return;
			
			$(this).parent().parent().find("input").blur();
			$(this).parent().parent().find("td").data("selected", false);
			
			var text = $(this).text();
			$(this).empty();
			$(this).data("selected", true);
			if ($(this).data("type") == "select") {
				var vals = $(_this).data("selects").val().split(",");
				var opt = "";
				for (var i = 0; i < vals.length; i++) {
					v = vals[i];
					opt += '<option '+(text==v ? 'selected ' : '')+'value="'+v+'">'+v+'</option>';
				}
				$(this).append('<select><option value="&nbsp;"></option>'+opt+'</select>');
			} else {
				$(this).append('<input type="text" value="'+text+'">');
			}
			$(this).find(":input").focus();
			$(this).find(":input").blur(function() {
				var value = $(this).val();
				$(this).parent().append(value);
				$(this).remove();
			});
		});
	}
			
	$.fn.EntryGrid_extract_datas = function(data, search) {
		var keys = new Array();
		for (var key in data) {
			keys.push(key);
		}
		keys.sort();
		
		var result = new Array();
		for (i = 0; i < keys.length; i++) {
			var key = keys[i];
			if (0 == key.indexOf(search)) {
				result.push(data[key]);
			}
		}
		return result;
	}
	
	$.fn.EntryGrid_getData = function() {
		var result = {};
		var i = 0;
		$(this).find("tr").each(function() {
			var row = new Array();
			var types = new Array();
			$(this).find("td").each(function() {
				row.push($(this).text());
				types.push($(this).data("type"));
			});
			result["line"+i] = row;
			result["type"+i] = types;
			i++;
		});
		result["select_data"] = $(this).data("selects").val();
		return result;
	}

	$.fn.EntryGrid_addRow = function() {
		var col = $(this).find("tr:first").find("td").length;
		var one_row = "";
		for (var i = 0; i < col; i++) {
			one_row += "<td>&nbsp;</td>";
		}
		$(this).append("<tr>"+one_row+"</tr>");
		$(this).EntryGrid_editable();
	}

	$.fn.EntryGrid_addCol = function() {
		$(this).find("tr").each(function() {
			$(this).append("<td>&nbsp;</td>");
		});
		$(this).EntryGrid_editable();
	}
	
	$.fn.EntryGrid_removeSelectedRow = function() {
		var selected;
		$(this).find("td").each(function() {
			if ($(this).data("selected")) {
				selected = $(this);
			}
		});
		if (selected) {
			selected.parent().remove();
		}
	}
	
	$.fn.EntryGrid_removeSelectedCol = function() {
		var selected;
		$(this).find("td").each(function() {
			if ($(this).data("selected")) {
				selected = $(this);
			}
		});

		if (!selected) return;

		var i = selected.prevAll().length;
		
		selected.parent().parent().find("tr").each(function() {
			var j = 0;
			$(this).find("td").each(function() {
				if (j == i) {
					$(this).remove();
				}
				j++;
			});
		});
	}
	
	$.fn.EntryGrid_changeSelectedType = function(type) {
		var selected;
		$(this).find("td").each(function() {
			if ($(this).data("selected")) {
				selected = $(this);
			}
		});

		if (!selected) return;
		
		selected.data("type", type);
		$(this).EntryGrid_editable();
	}
	
})(jQuery);