
/**
 * baserAjaxSortTable プラグイン
 * 
 * 並び替え可能なテーブルを実装する
 * 
 * 【必要ライブラリ】
 * jquery / jquery-ui / yuga
 * 
 * Javascript / jQuery
 *
 * baserCMS :  Based Website Development Project <http://basercms.net>
 * Copyright 2008 - 2015, baserCMS Users Community <http://sites.google.com/site/baserusers/>
 *
 * @copyright		Copyright 2008 - 2015, baserCMS Users Community
 * @link			http://basercms.net baserCMS Project
 * @since			baserCMS v 0.1.0
 * @license			http://basercms.net/license/index.html
 */
(function($){

    /* 関数にオプション変数を渡す */
    $.baserAjaxSortTable = {
		config: {
			listTable	: ".sort-table",
			handle		: ".sort-handle",
			items		: "tr.sortable",
			placeHolder	: ".placeholder",
			alertBox	: "#AlertMessage",
			loader		: '#Waiting',
			flashBox	: '#flashMessage'
		},
		init: function(config){
			if(config) {
				$.extend($.baserAjaxSortTable.config, config);
			}
			config = $.baserAjaxSortTable.config;

		},
		initList: function() {
			
			var config = $.baserAjaxSortTable.config;
			
			// イベント削除
			$(config.handle).unbind();
			$(config.listTable).sortable("destroy");
			
			// イベント登録
			var sortableOptions = {
				scroll: true,
				items: config.items,
				opacity: 0.80,
				zIndex: 55,
				containment: 'body',
				tolerance: 'pointer',
				distance: 5,
				cursor: 'move',
				placeholder: 'ui-widget-content placeholder',
				handle: config.handle,
				revert: 100,
				start: sortStartHandler,
				stop: sortStopHander,
				update: sortUpdateHandler
			};
			$(config.handle).css('cursor', 'move');
			$(config.listTable).sortable(sortableOptions);
			$(config.handle).click(function(e){
				e.stopPropagation();
			});
			
		}
		
	};
/**
* 並び替え開始時イベント
*/
	function sortStartHandler(event, ui) {
		
		var config = $.baserAjaxSortTable.config;
		
		ui.item.css('border','2px solid #CCC');
		$(config.placeHolder).css('height',ui.item.height());
		for(var i = 0; i < ui.item.find('td').length; i++){
			$(config.placeHolder).append('<td>&nbsp;</td>');
		}
		$(config.placeHolder + " td").css('background-color', '#ffffbe');
		$(config.placeHolder + " td").css('border', 'none');
		
	}
/**
 * 並び替え終了時イベント
 */
	function sortStopHander(event, ui) {
		
		ui.item.css('border','none');
		
	}
/**
 * 並び順を更新時イベント
 */
	function sortUpdateHandler(event, ui){
		
		var config = $.baserAjaxSortTable.config;
		var target = ui.item;
		var targetNum = $(config.listTable + " " + config.items).index(target)+1;
		var sourceNum = target.attr('id').replace('Row','');
		var offset = targetNum - sourceNum;
		var sortTable = $(config.listTable);
		
		var form = $('<form/>').hide();
		var sortId = $('<input/>').attr('type', 'hidden').attr('name', 'data[Sort][id]').val(target.find('.id').val());
		var sortOffset = $('<input/>').attr('type', 'hidden').attr('name', 'data[Sort][offset]').val(offset);
		form.append(sortId).append(sortOffset);

		$.ajax({
			url: config.url,
			type: 'POST',
			data: form.serialize(),
			dataType: 'text',
			beforeSend: function() {
				$(config.alertBox).fadeOut(200);
				$(config.flashBox).fadeOut(200);
				$(config.loader).show();
			},
			success: function(result){
				if(result == '1') {
					sortTable.find(config.items).each(function(i,v){
						$(this).attr('id','Row'+(i+1));
					});
				} else {
					sortTable.sortable("cancel");
					$(config.alertBox).html('並び替えの保存に失敗しました。');
					$(config.alertBox).fadeIn(500);
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown){
				var errorMessage = '';
				if(XMLHttpRequest.status == 404) {
					errorMessage = '<br />'+'送信先のプログラムが見つかりません。';
				} else {
					if(XMLHttpRequest.responseText) {
						errorMessage = '<br />'+XMLHttpRequest.responseText;
					} else {
						errorMessage = '<br />'+errorThrown;
					}
				}
				sortTable.sortable("cancel");
				$(config.alertBox).html('並び替えの保存に失敗しました。('+XMLHttpRequest.status+')'+errorMessage);
				$(config.alertBox).fadeIn(500);
			},
			complete: function() {
				$(config.loader).hide();
				$(config.listTable + " " + config.items).removeClass('even odd');
				$.yuga.stripe();
			}
		});
		
	}
	
})(jQuery);