﻿///<reference path="jquery-1.3.2-vsdoc.js" />
///<reference path="jquery.json-2.2.min.js" />
///<reference name="MicrosoftAjax.js" />
//------------------------- Управление удалением элементов из грида --------------------------------
var clickedYes = null;
function deleteConfirm(ev, message, objName)
{
    return customRadconfirm(message.replace('&0&', '<b>' + objName + '</b>'), ev);
}
// Показать Custom Rad Confirm Window
function customRadconfirm(text, mozEvent, caption, wWidth, wHeight)
{
    // Определяем, была ли уже нажата кнопка "Да"
    if ($.browser.msie && clickedYes != null)
    {
        clickedYes = null;
        return true;
    }

    var ev = mozEvent ? mozEvent : window.event; //Moz support requires passing the event argument manually     
    //Cancel the event     
    ev.cancelBubble = true;
    ev.returnValue = false;
    if (ev.stopPropagation) ev.stopPropagation();
    if (ev.preventDefault) ev.preventDefault();

    //Determine who is the caller     
    var callerObj = ev.srcElement ? ev.srcElement : ev.target;

    //Call the original radconfirm and pass it all necessary parameters     
    if (callerObj)
    {
        //Show the confirm, then when it is closing, if returned value was true, automatically call the caller's click method again.
        var callBackFn = function(arg)
        {
            if (arg)
            {
                clickedYes = arg;
                callerObj["onclick"] = "";
                if (callerObj.click) callerObj.click(); //Works fine every time in IE, but does not work for links in Moz     
                else if (callerObj.tagName == "A" || callerObj.tagName == "IMG") //We assume it is a link button or img button    
                {
                    try
                    {
                        //Эта штука сразу выполняет удаление для gecko браузеров
                        eval($(callerObj).parent().attr("href"));
                    }
                    catch (e) { alert(e); }
                }
            }
        }
        radconfirm(text, callBackFn, wWidth || 400, wHeight || 150, null, caption || "Удаление");
    }
    return false;
}
// ---------------------------------------------------------------------------------------------------
// --------------------------- Управление ошибками ---------------------------------------------------
function customAlert(message, header, width, height)
{
    return radalert(message, width || 300, height || 140, header);
}
function handleError(error)
{
    $.releaseInterface();
    radalert("В момент запроса произошла ошибка: " + error.get_message(), 300, 80, 'Серверная ошибка');
}
//Handle ajax errors
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestErrorHandler);
function EndRequestErrorHandler(sender, args)
{
    if (args.get_error() != undefined)
    {
        var errorMessage;
        if (args.get_response().get_statusCode() == '200')
        {
            errorMessage = args.get_error().message;
        }
        else
        {
            // Error occurred somewhere other than the server page.
            errorMessage = 'Неожиданная ошибка';
        }
        args.set_errorHandled(true);
        radalert("В момент запроса произошла ошибка: " + errorMessage, 300, 80, 'Серверная ошибка');
    }
}
//------------------------------------ Работа со строками --------------------------------------
String.prototype.replaceAll = function(search, replace)
{
    return this.split(search).join(replace);
}
//------------------------------------ Работа с датами -----------------------------------------
/**
* Converts string like /Date(1230913093+0400)/ to Date object
*/
function parseWCFDateTime(timeString)
{
    var dateCtor = timeString.replaceAll("/", "");
    var result = new Date(eval("new " + dateCtor));
    return result;
};
/**
*  Converts string to Boolean (returns null when failure)
*/
function convertStringToBool(s)
{
if (s.toLowerCase() === "true")
return true;
else if (s.toLowerCase() === "false")
return false;
return null; 
}

//----------------------------------- Array helper ---------------------------------------------
Array.prototype.searchItem = function(itemCondition)
{
for (var i = 0; i < this.length; i++)
{
if (itemCondition(this[i]))
return this[i];
}
return null;
} 
//Преобразует массив в таблицу
Array.prototype.convertToTable = function(tableWidth)
{
var result = [];
for (var i = 0; i < this.length; i += tableWidth)
{
var row = [];
for (var j = i; j < i + tableWidth; j++)
{
var item = this[j];
if (typeof (item) != "undefined")
Array.add(row, item);
else
Array.add(row, null);
}
Array.add(result, row);
}
return result;
};
/**
* Выдает уникальные элементы для данного массива
* @param {Function} keyGetter Выдает ключ, по которому определяется уникальность элемента
*/
Array.prototype.getUniqueElements = function(keyGetter)
{
    var dictionary = {};
    for(var i=0;i<this.length;i++)
	{
		var key = keyGetter(this[i]);
		if (!dictionary[key])
        {
            dictionary[key] = this[i];
        }
	}
    var result = [];
    for (var key in dictionary)
    {
        result.push(dictionary[key]);
    }
	return result;
}

// ----------------------------------- Exception Handling -------------------------------------------------
function CustomError(message)
{
    this.message = message;
};
CustomError.prototype.get_message = function() {return this.message;};
CustomError.fromXHR = function(xhr)
{
    if (xhr.status == 403)
    {
        return new CustomError("У вас нет доступа к данному действию");
    }
    if (xhr.status == 400)
    {
        return new CustomError("Действие не найдено");
    }
    try
    {
        var responseObject = JSON.parse(xhr.responseText);
        if (typeof (responseObject.Detail) != "undefined")
        {
            return new CustomError(responseObject.Detail);
        }
        else
        {
            return new CustomError(xhr.responseText);
        }
    }
    catch (e)
    {
        return new CustomError(xhr.responseText);
    }
};
/**
* Console
*/
function BrowserConsole()
{
    /**
    * Logs message to Console
    */
    this.log = function(message)
    {
        if (typeof (console) != "undefined")
        {
            console.log(message);
        }
    }
}

// ----------------------------------- Ajax helpers -------------------------------------------
/**
 * Очередь ajax запросов
 */
function AjaxQueue()
{
	/**
	 * Список XmlHttpRequest-ов, которые сейчас выполняются
	 */
	this.xhrs = [];
};
/**
 * Добавляет XmlHttpRequest
 * @param {XmlHttpRequest} xhr
 */
AjaxQueue.prototype.addXhr = function(xhr)
{
	this.xhrs.push(xhr);
	$("#ajaxCancelBtn").show();
};
AjaxQueue.prototype.removeXhr = function(xhr)
{
	Array.remove(this.xhrs, xhr);
	if(this.xhrs.length==0)
		$("#ajaxCancelBtn").hide();
};
AjaxQueue.prototype.abort = function()
{
	for(var i=0;i<this.xhrs.length;i++)
	{
		var xhr = this.xhrs[i];
		if(xhr!=null && typeof(xhr.abort)!="undefined")
			xhr.abort();
	}
	//TODO подумать. Возможно необходимо здесь чистить список всех request-ов
	this.xhrs = [];
	$("#ajaxCancelBtn").hide();
	$.releaseInterface();
};

$.ajaxManager = new AjaxQueue();
$.ajaxSetup(
	{
		beforeSend: function(xhr)
		{
			$.ajaxManager.addXhr(xhr);
		},
		complete:function(xhr)
		{
			$.ajaxManager.removeXhr(xhr);
		}
	}
);

// ----------------------------------- ObjectManagement ----------------------------------------
var _globalAppObjects = [];
//Выдает объект по его ID
function findObject(objectID)
{
    return _globalAppObjects[objectID];
}
//Устанавливает объект вместес ID
function setObject(object, objectID)
{
    _globalAppObjects[objectID] = object;
}

// ---------------------------------- Работа с checkbox-ами ------------------------------------
//Снимает выдеЛение с checkbox-ов внутри данного эЛемента
function clearCheckboxes(containerElementID)
{
    var checkedElements = $("input:checked", $("#" + containerElementID)).get();
    $.each(checkedElements, function() { this.checked = false; });
}
//Ставит выдеЛение checkbox-ам внутри данного эЛемента
function setCheckboxes(containerElementID)
{
    var checkboxes = $("input[type=checkbox]", $("#" + containerElementID)).get();
    $.each(checkboxes, function() { this.checked = true; });
}

// --------------------------------- Реакция на Enter -------------------------------------------
$(document).ready(function()
{
    $(document).keypress(function(eventInfo)
    {
        if (eventInfo.keyCode == 13 && eventInfo.target.nodeName.toUpperCase() != "TEXTAREA")
        {
            eventInfo.preventDefault();
            return false;
        }
        else
        {
            return true;
        }
    });
});
