/**
 * Подтверждение удаления записи или нескольких записей
 *
 */
function confirmDelete(message)
{
	var question = 'You are about to delete records:';
	if (message) {
		question += '\n[' + message + ']';
	}
	question += '\nAre you sure?';
	return confirm(question);
}


/**
 * Реализация подсветки строк
 *
 */
function trMouseOver(trElement)
{
	$(trElement).addClassName('grid-tr-hovered');
}
var clicked = new Array();
function trClick(trElement)
{

	if (!clicked[$(trElement).rowIndex]) {
		$(trElement).addClassName('grid-tr-hovered');
		clicked[$(trElement).rowIndex] = true;
	} else {
		$(trElement).removeClassName('grid-tr-hovered');
		clicked[$(trElement).rowIndex] = false;
	}
}
function trMouseOut(trElement)
{
	if (!clicked[$(trElement).rowIndex]) {
		$(trElement).removeClassName('grid-tr-hovered');
	}
}


/**
 * Отметить все чекбоксы в конкретной таблице или снять отметку со всех
 * Соответственно, показываем или скрываем кнопку удаления
 *
 */
function toggleAllCheckboxes(tableId)
{
	allCheckboxes = $$('table#' + tableId + ' input.select-checkbox');
	selectAllCheckbox = $$('table#' + tableId + ' input.grid-checkbox-select-all');
	isAllChecked = selectAllCheckbox[0].checked;
	for (i = 0; i < allCheckboxes.length; i++) {
		allCheckboxes[i].checked = isAllChecked;
	}
	toggleDeleteMultipleButton(tableId);
}


/**
 * Показать или скрыть кнопку удаления (вместе со статусной строкой)
 * в зависимости от того, есть ли в таблице отмеченные чекбоксы
 */
function toggleDeleteMultipleButton(tableId) {
	buttonDeleteMultiple = $$('table#' + tableId + ' input.grid-button-delete-multiple');
	buttonDeleteMultiple = buttonDeleteMultiple[0];
	if(_isSomeCheckboxChecked(tableId)) {
		Element.addClassName(buttonDeleteMultiple, 'inline-visible');
		if (Element.hasClassName(buttonDeleteMultiple, 'inline-hidden')) {
			Element.removeClassName(buttonDeleteMultiple, 'inline-hidden');
		}
		_showStatusRow(tableId);
	} else {
		Element.addClassName(buttonDeleteMultiple, 'inline-hidden');
		if (Element.hasClassName(buttonDeleteMultiple, 'inline-visible')) {
			Element.removeClassName(buttonDeleteMultiple, 'inline-visible');
		}
		selectAllCheckbox = $$('table#' + tableId + ' input.grid-checkbox-select-all');

		if (selectAllCheckbox != '') {
			selectAllCheckbox[0].checked = false;
		}
		_hideStatusRow(tableId);
	}
}


/**
 * Есть ли хоть один отмеченный чекбокс в таблице
 *
 */
function _isSomeCheckboxChecked(tableId)
{
	allCheckboxes = $$('table#' + tableId + ' input.select-checkbox');
	for (i = 0; i < allCheckboxes.length; i++) {
		if (allCheckboxes[i].checked && !Element.hasClassName(allCheckboxes[i].parentNode.parentNode, 'grid-tr-hidden')) {
			return true;
		}
	}
	return false;
}

/**
 * Показать/скрыть статусную строку
 *
 */
function _showStatusRow(tableId)
{
	statusRow = $$('table#' + tableId + ' tr.grid-status-row');
	statusRow = statusRow[0];
	Element.addClassName(statusRow, 'grid-tr-visible');
	Element.removeClassName(statusRow, 'grid-tr-hidden');

//alert('table#' + tableId + ' tr.grid-status-row');
}
function _hideStatusRow(tableId)
{
	statusRow = $$('table#' + tableId + ' tr.grid-status-row');
	statusRow = statusRow[0];
	Element.addClassName(statusRow, 'grid-tr-hidden');
	Element.removeClassName(statusRow, 'grid-tr-visible');
//alert('table#' + tableId + ' tr.grid-status-row');
}



/**
 * Реализация аналога php-функции implode. Работает как с массивами, так и со скалярами
 *
 */
function _implode( glue, pieces ) {
    return ( ( pieces instanceof Array ) ? pieces.join ( glue ) : pieces );
}

/**
 * Удаление нескольких записей
 *
 */
var additionalRowsPerRecord = 0;
function deleteMultiple(deleteAction, tableId, additionalRows, textColumnNumber)
{
	Element.addClassName($$('table#' + tableId + ' img.wait-image')[0],'visible-inline');
	Element.addClassName($$('table#' + tableId + ' input.grid-button-delete-multiple')[0],'hidden-inline');
//console.log(waitImage);return;
//return;
	if (additionalRows > 0) {
		additionalRowsPerRecord = additionalRows;
	}
	if (textColumnNumber > 0) {
		textColumn = textColumnNumber;
	} else {
		textColumn = 0;
	}

	allCheckboxes = $$('table#' + tableId + ' input.select-checkbox');
	rowsToDelete = new Array();
	rowsToDeleteText = new Array();
	recordsToDelete = new Array();
	for (i = 0; i < allCheckboxes.length; i++) {
		if (allCheckboxes[i].checked) {
			var rowToDelete = allCheckboxes[i].parentNode.parentNode;
			rowToDelete.addClassName('grid-tr-delete');
			rowsToDelete.push(rowToDelete.rowIndex);


			rowsToDeleteText.push(rowToDelete.cells[textColumn].innerHTML.stripScripts().stripTags().unescapeHTML().strip().truncate(20));

			recordsToDelete.push('id[]=' + allCheckboxes[i].value);
			for (j = 0; j < additionalRowsPerRecord; j++) {
				rowToDelete = rowToDelete.next('tr');
				rowToDelete.addClassName('grid-tr-delete');
				rowsToDelete.push(rowToDelete.rowIndex);
			}
		}
	}

	ajaxParameters = _implode('&', recordsToDelete);
	if (confirmDelete(_implode(', ', rowsToDeleteText))) {
		_deleteAjaxRequest(deleteAction, ajaxParameters, tableId, rowsToDelete);
	} else {
		messages = [["Cancelled", 2]];
		_deleteRollback(tableId, rowsToDelete, messages);
	}
}

/**
 * Удаление одной записи
 *
 */
function deleteSingle(deleteLink, checkboxElement, additionalRows, textColumnNumber)
{
	if (additionalRows > 0) {
		additionalRowsPerRecord = additionalRows;
	}
	if (textColumnNumber > 0) {
		textColumn = textColumnNumber;
	} else {
		textColumn = 0;
	}

	Element.ancestors(checkboxElement).each(function(el) {
		if (Element.hasClassName(el, 'grid-tr')) {
			rowToDelete = el;
		}
	});

	tableId = rowToDelete.parentNode.parentNode.getAttribute('id');

	confirmText = rowToDelete.cells[textColumn].innerHTML.stripScripts().stripTags().unescapeHTML().strip().truncate(50);
	rowToDelete.addClassName('grid-tr-delete');
	rowsToDelete = [ rowToDelete.rowIndex ];
	for (j = 0; j < additionalRowsPerRecord; j++) {
		rowToDelete = rowToDelete.next('tr');
		rowToDelete.addClassName('grid-tr-delete');
		rowsToDelete.push(rowToDelete.rowIndex);
	}

	if (confirmDelete(confirmText)) {
		_deleteAjaxRequest(deleteLink, null, tableId, rowsToDelete);
	} else {
		rowToDelete.removeClassName('grid-tr-delete');
		for (j = 0; j < additionalRowsPerRecord; j++) {
			rowToDelete = rowToDelete.previous('tr');
			rowToDelete.removeClassName('grid-tr-delete');
		}
	}
}

/**
 * AJAX-удаление записей
 *
 */
function _deleteAjaxRequest(action, params, tableId, rowsToDelete)
{
	//	_showAjaxLoader();
	_deleteTry(tableId, rowsToDelete);
	new Ajax.Request(action, {
		method: 'get',
		parameters: params,
		onFailure: function() {
			Element.removeClassName($$('table#' + tableId + ' img.wait-image')[0],'visible-inline');
			Element.removeClassName($$('table#' + tableId + ' input.grid-button-delete-multiple')[0],'hidden-inline');
			messages = [["Error occured", 0]];
			_deleteRollback(tableId, rowsToDelete, messages);
		},
		onSuccess: function(transport, json) {
			Element.removeClassName($$('table#' + tableId + ' img.wait-image')[0],'visible-inline');
			Element.removeClassName($$('table#' + tableId + ' input.grid-button-delete-multiple')[0],'hidden-inline');
			if ((typeof(json) == 'object') && (json != null) ) {
				if (json.result) {
					_deleteCommit(json, tableId, rowsToDelete);
				} else {
					_deleteRollback(tableId, rowsToDelete, json.messages);
				}
			} else {
				if (transport.responseText.isJSON()) {
					messages = eval('(' + transport.responseText + ')').messages;
					_deleteRollback(tableId, rowsToDelete, messages);
				} else {
					messages = [["Error occured", 0]];
					_deleteRollback(tableId, rowsToDelete, messages);
					showFatalError(transport.responseText);
				}
			}
		}
	});
}

/**
 * Предварительное скрытие строк, которые удаляются
 *
 */
function _deleteTry(tableId, rowsToDelete)
{

//	grid = $(tableId);
//	for (i = rowsToDelete.length - 1; i >= 0 ; i--) {
//		grid.rows[rowsToDelete[i]].addClassName('grid-tr-hidden');
//		grid.rows[rowsToDelete[i]].removeClassName('grid-tr-delete');
//	}
//	deletedRecordsCount = Math.round(rowsToDelete.length / (additionalRowsPerRecord + 1));
//	message = [['Records deleted: [' + deletedRecordsCount + ']', 2]];
//	_renderResponse(tableId, message);
}


/**
 * Подтверждение удаления записей (фактическое удаление строк)
 *
 */
function _deleteCommit(json, tableId, rowsToDelete)
{
	//	_hideAjaxLoader();
	//	_renderResponse(tableId, json.messages);
	_renderResponse(tableId, json.messages);

	if (json.result) {
		grid = $(tableId);
		for (i = rowsToDelete.length - 1; i >= 0 ; i--) {
			grid.deleteRow(rowsToDelete[i]);
		}
	}
}

/**
 * Отмена удаления строк в случае ошибки. Восстановление видимости
 *
 */
function _deleteRollback(tableId, rowsToDelete, messages)
{
	Element.removeClassName($$('table#' + tableId + ' img.wait-image')[0],'visible-inline');
	Element.removeClassName($$('table#' + tableId + ' input.grid-button-delete-multiple')[0],'hidden-inline');
	//	_hideAjaxLoader();

	_renderResponse(tableId, messages);
	grid = $(tableId);
	for (i = rowsToDelete.length - 1; i >= 0 ; i--) {
		grid.rows[rowsToDelete[i]].removeClassName('grid-tr-delete');
		grid.rows[rowsToDelete[i]].removeClassName('grid-tr-hidden');
	}
}


/**
 * Вывод сообщений в статусную строку c цветовой индикацией
 *
 */
function _renderResponse(tableId, messages)
{
	var msgStyles = ['msg-error', 'msg-warning', 'msg-message'];
	var hold = false;
	var statusLineText = '';

	for (var i = 0; i < messages.length; i++){
		statusLineText += '<p class="' + msgStyles[messages[i][1]] + '">' + messages[i][0] + '</p>';
		if (messages[i][1] == 0 || messages[i][1] == 1) hold = true;
	}

	$$('table#' + tableId + ' td.grid-td-delete-status')[0].innerHTML = statusLineText;
	if (!hold) {
		Element.addClassName($$('table#' + tableId + ' tr.grid-status-row')[0], 'grid-status-row-ok');
	} else {
		Element.addClassName($$('table#' + tableId + ' tr.grid-status-row')[0], 'grid-status-row-error');
	}

	_showStatusRow(tableId);
	setTimeout('_smoothShow(\'' + tableId + '\')', 2000);
}
function _smoothShow(tableId)
{
	$$('table#' + tableId + ' td.grid-td-delete-status')[0].innerHTML = '';
	statusRow = $$('table#' + tableId + ' tr.grid-status-row')[0];
	Element.removeClassName(statusRow, 'grid-status-row-ok');
	Element.removeClassName(statusRow, 'grid-status-row-error');

	toggleDeleteMultipleButton(tableId);
}

