﻿/**
 * Обновитель контрола с частотой
 * @param {Object} params
 */
function FrequencyUpdater(params)
{
	/**
	 * Адрес, по которому находятся данные
	 */
	var url = params.url;
	/**
	 * Действие в случае успешного обновления
	 */
	var onSuccess = params.onSuccess;
	/**
	 * Действие в случае ошибки получения данных
	 */
	var onError = params.onError;
	/**
	 * Обновляет данные
	 */
	var refresh = function()
	{
		$.ajax(
		{
			url:url,
			cache:true,//Позволяет использовать WCF кэширование с AspNetCompatibilityMode.Required
			dataType:"json",
			success: function(serverData){onSuccess(serverData);},
			error: function(xhr){onError(CustomError.fromXHR(xhr))}
		}
		);
	}
	var updateInterval = 5*1000;
	window.setInterval(refresh,updateInterval);
};

/**
 * Обновитель контрола раз в час
 * @param {Object} params
 */
function HourlyUpdater(params)
{
	/**
	 * Адрес, по которому находятся данные
	 */
	var url = params.url;
	/**
	 * Действие в случае успешного обновления
	 */
	var onSuccess = params.onSuccess;
	/**
	 * Действие в случае ошибки получения данных
	 */
	var onError = params.onError;
	/**
	 * Минута, начиная с которой нужно обновлять данные раз в час
	 */
	var startMinute = params.startMinute;
	/**
	 * Обновляет данные
	 */
	var task = function()
	{
		$.ajax({
			url: url,
			cache: true,//Позволяет использовать WCF кэширование с AspNetCompatibilityMode.Required
			dataType: "json",
			success: function(serverData)
			{
				onSuccess(serverData);
			},
			error: function(xhr)
			{
				onError(CustomError.fromXHR(xhr))
			}
		});
	};
	new HourTaskExecutor(
	{
		startMinute:startMinute,
		task:task
	}
	).startExecuting();
};

/**
 * Обновитель контрола с событиями
 * @param {Object} params
 */
function EventsUpdater(params)
{
	/**
	 * Адрес, по которому находятся данные
	 */
	var url = params.url;
	/**
	 * Действие в случае успешного обновления
	 */
	var onSuccess = params.onSuccess;
	/**
	 * Действие в случае ошибки получения данных
	 */
	var onError = params.onError;
	/**
	 * Обновляет данные
	 */
	this.refresh = function()
	{
		$.ajax(
		{
			url:url,
			cache:true,//Позволяет использовать WCF кэширование с AspNetCompatibilityMode.Required
			dataType:"json",
			success: function(serverData){onSuccess(serverData);},
			error: function(xhr){onError(CustomError.fromXHR(xhr))}
		}
		);
	}
	var updateInterval = 30*1000;
	this.refresh();
	window.setInterval(this.refresh,updateInterval);
};
/**
 * Обновитель графика
 * @param {imgID, preloadImgID, getGraphUrl, updateMinute } params
 */
function GraphUpdater(params)
{
	var containerID = params.containerID;
	/**
	 * Функция, которая выдает URL, по которому находится график
	 */
	var getGraphUrl = params.getGraphUrl;
	/**
	 * Минута, на которой нужно обновлять данный график
	 */
	var updateMinute = params.updateMinute;
	
	var that = this;
//	$(document).ready(
//        function()
//        {
//            that.updateImage();
//			//Начинаем выполнять обновление графика каждый час
//            new HourTaskExecutor({
//				startMinute: updateMinute,
//				task: that.updateImage
//			}).startExecuting();
//        }
//    );
	
	/**
	 * Функция, которая обновляет картинку с графиком
	 */
        this.updateImage = function()
        {
            var url = getGraphUrl();
            var timestamp = new Date().getTime();
            url += ("&ts=" + timestamp); //otherwise IE cashes the response
            var imageContainer = $("#" + containerID);            
            imageContainer.load(url, null,
            function(responseText, textStatus, XMLHttpRequest)
            {
                //("#graphContent", imageContainer).show();
                //("#loadDiv", imageContainer).hide();
            });
        };
};

/**
* Обновитель графика
* @param {imgID, preloadImgID, getGraphUrl, updateMinute } params
*/
function ProposalGraphUpdater(params)
{
    var containerID = params.containerID;
    /**
    * Функция, которая выдает URL, по которому находится график
    */
    var getGraphUrl = params.getGraphUrl;
    /**
    * Минута, на которой нужно обновлять данный график
    */
    var updateMinute = params.updateMinute;

    var that = this;
    //	$(document).ready(
    //        function()
    //        {
    //            that.updateImage();
    //			//Начинаем выполнять обновление графика каждый час
    //            new HourTaskExecutor({
    //				startMinute: updateMinute,
    //				task: that.updateImage
    //			}).startExecuting();
    //        }
    //    );

    /**
    * Функция, которая обновляет картинку с графиком
    */
    var that = this;
    var withCPCH = true;
    this.updateImage = function()
    {
        var url = getGraphUrl();
        var timestamp = new Date().getTime();
        url += ("&withCPCH=" + withCPCH);
        url += ("&ts=" + timestamp); //otherwise IE cashes the response
        var imageContainer = $("#" + containerID);
        imageContainer.load(url,
            function()
            {
                //alert($("#cpchMode").val());
                if (withCPCH)
                    $("#cpchMode").attr("checked", "true");
                $("#cpchMode").click(function()
                {
                    withCPCH = this.checked;
                    that.updateImage();
                });
            },
            function(responseText, textStatus, XMLHttpRequest)
            {

            });
    };
};





/**
* Обновитель графика
* @param {imgID, preloadImgID, getGraphUrl, updateMinute } params
*/
function IBRGraphUpdater(params) {
    var containerID = params.containerID;
    /**
    * Функция, которая выдает URL, по которому находится график
    */
    var getGraphUrl = params.getGraphUrl;
    /**
    * Минута, на которой нужно обновлять данный график
    */
    var updateMinute = params.updateMinute;

    var that = this;
    //	$(document).ready(
    //        function()
    //        {
    //            that.updateImage();
    //			//Начинаем выполнять обновление графика каждый час
    //            new HourTaskExecutor({
    //				startMinute: updateMinute,
    //				task: that.updateImage
    //			}).startExecuting();
    //        }
    //    );

    /**
    * Функция, которая обновляет картинку с графиком
    */
    var that = this;
    var fromZero = false;
    this.updateImage = function() {
        var url = getGraphUrl();
        var timestamp = new Date().getTime();
        url += ("&isStartedFromZero=" + fromZero);
        url += ("&ts=" + timestamp); //otherwise IE cashes the response
        var imageContainer = $("#" + containerID);
        imageContainer.load(url,
            function() {
                //alert($("#cpchMode").val());
                if (fromZero)
                    $("#chkChartGenVolumesNull").attr("checked", "true");

                $("#chkChartGenVolumesNull").click(function() {
                    fromZero = this.checked;
                    that.updateImage();
                });
            },
            function(responseText, textStatus, XMLHttpRequest) {

            });
    };
};





/**
* Обновитель графика
* @param {imgID, preloadImgID, getGraphUrl, updateMinute } params
*/
function ConsumingGraphUpdater(params) {
    var containerID = params.containerID;
    /**
    * Функция, которая выдает URL, по которому находится график
    */
    var getGraphUrl = params.getGraphUrl;
    /**
    * Минута, на которой нужно обновлять данный график
    */
    var updateMinute = params.updateMinute;

    var that = this;
    //	$(document).ready(
    //        function()
    //        {
    //            that.updateImage();
    //			//Начинаем выполнять обновление графика каждый час
    //            new HourTaskExecutor({
    //				startMinute: updateMinute,
    //				task: that.updateImage
    //			}).startExecuting();
    //        }
    //    );

    /**
    * Функция, которая обновляет картинку с графиком
    */
    var that = this;
    var fromZero = false;
    this.updateImage = function() {
        var url = getGraphUrl();
        var timestamp = new Date().getTime();
        url += ("&isStartedFromZero=" + fromZero);
        url += ("&ts=" + timestamp); //otherwise IE cashes the response
        var imageContainer = $("#" + containerID);
        imageContainer.load(url,
            function() {
                //alert($("#cpchMode").val());
                if (fromZero)
                    $("#chkChartConsumingNull").attr("checked", "true");

                $("#chkChartConsumingNull").click(function() {
                    fromZero = this.checked;
                    that.updateImage();
                });
            },
            function(responseText, textStatus, XMLHttpRequest) {

            });
    };
};
















/**
 * Функция, которая раз в час выполняет задачу
 * @param {task, startMinute} params
 */
function HourTaskExecutor(params)
{
	/**
	 * Минута, на которой нужно обновлять данные
	 */
	var startMinute = params.startMinute;
	/**
	 * Задача, которую нужно выполнять
	 */
	var task = params.task;
	
	//На сколько минут нужно отложить старт обновления
	var delayStartInMinutes = getDelayStartInMinutes();
	
	//Интервал обновления - час
	var hourInterval = 60 * 60 * 1000;
	/**
	 * Периодически обновляет данные
	 */
	var periodicRefresh = function()
	{
		task();
		//Далее обновляем каждый час
		window.setInterval(task, hourInterval);
	}
	/**
	 * Начинает выполнение задачи
	 */
	this.startExecuting = function()
	{
		//Откладываем начало периодического обновления
		window.setTimeout(periodicRefresh, delayStartInMinutes * 60 * 1000);
	};
	
	/**
	 * Определяет, на сколько нужно отложить старт
	 */
	function getDelayStartInMinutes()
	{
		var result = 0;
		var timeOfNow = new Date();
		if (timeOfNow.getMinutes() < startMinute) 
		{
			result = startMinute - timeOfNow.getMinutes();
		}
		else 
		{
			//Обновление начнется в следующем часу
			result = 60 + startMinute - timeOfNow.getMinutes();
		}
		return result;
	}
}

