﻿/**
 * Контрол для показа событий на главной странице
 * (Использует паттерн MS Ajax Component. Будет доступен через $find)
 */
function EventsControl()
{
	//Стандартный интерфейс для компонента
	EventsControl.initializeBase(this);
	//ID элемента, в котором находится данный контрол
	this.containerElementID = null;
	/**
	 * Столько часов нужно прибавить к локальному времени, чтобы получилось время Москвы
	 */
	this.hoursToAddToLocalTime = null;
	/**
	 * Кол-во пикселов в смещении когда время 00:00
	 */
	this.nowLabelPixelOffsetOnZero = -12;
	/**
	 * Кол-во пикселов в одном часе
	 */
	this.pixelsInOneHour = 33;
	/**
	 * События, которые нужно отрисовать
	 */
	this.eventItems = null;
};
EventsControl.prototype =
{
    /**
    * Вызывается автоматически после установки всех свойств
    */
    initialize: function()
    {
        var that = this;
        var updateTimeInterval = 10 * 1000;
        this.updateTimeLine();
        $("#nowLabel").show();
        window.setInterval(function() { that.updateTimeLine(); }, updateTimeInterval);
    },
    /**
    * Обновляет временную шкалу
    */
    updateTimeLine: function()
    {
        var nowInMoscow = this.getLocalTimeInMoscow();
        var pixelsInOneHour = this.pixelsInOneHour;
        /**
        * Полное кол-во часов, которое прошло с 00:00 (дробное значение)
        */
        var nowTotalHours = nowInMoscow.getHours() + nowInMoscow.getMinutes() / 60;
        $("#timeLineSpan").css("width", pixelsInOneHour * nowTotalHours + "px");
        $("#nowLabel").text("Сейчас " + nowInMoscow.format("HH:mm") + " Мск").
			css("left", this.nowLabelPixelOffsetOnZero + pixelsInOneHour * nowTotalHours + "px");
        var tomorrow = this.addHoursToDate(nowInMoscow, 24);
        $("#tomorrowLabel").html("Завтра " + tomorrow.format("dd.MM.yyyy"));
        var yesterday = this.addHoursToDate(tomorrow, -24 * 2);
        $("#yesterdayLabel").html("Вчера " + yesterday.format("dd.MM.yyyy"));
    },
    getLocalTimeInMoscow: function()
    {
        var now = new Date();
        now.setHours(now.getHours() + this.hoursToAddToLocalTime);
        return now;
    },
    addHoursToDate: function(date, hours)
    {
        var result = date;
        result.setHours(date.getHours() + hours);
        return result;
    },
    /**
    * Устанавливает события для отрисовки
    * @param {Object} newEventItems
    */
    set_events: function(newEventItems)
    {
        this.eventItems = newEventItems;
        this.renderEvents();
    },
    /**
    * Отрисовывает события
    */
    renderEvents: function()
    {
		$("#eventsContainer").empty();
		//Координата X предыдущего события (необходимо, чтобы события не наезжали друг на друга)
		var prevItemLeftCoord = -1000;
        for (var i = 0; i < this.eventItems.length; i++)
        {
            prevItemLeftCoord = this.renderEvent(this.eventItems[i], prevItemLeftCoord);
        }
    },
    /**
    * Отрисовывает отдельное событие
    * @param {Object} eventItem
    */
    renderEvent: function(eventItem, prevItemLeftCoord)
    {
        var eventElement = $("<var></var>");
        var eventLeft = this.getEventLeftCoordinate(eventItem);
        var prevCoordDelta = eventLeft - prevItemLeftCoord;
		if (prevCoordDelta < 8) 
		{
			eventLeft += (8 - (prevCoordDelta));
		}
		eventElement.
			addClass(this.getEventCssClass(eventItem.EventType)).
			css("left", eventLeft + "px").
			css("z-index", "10").
			text(eventItem.SessionNumber);
        var tootip = eventItem.EventTime.format("HH:mm: ") + eventItem.EventDescription;
        eventElement.attr("title", tootip);
        $("#eventsContainer").append(eventElement);
		return eventLeft;
    },
    /**
    * Выдает левую координату события (Css свойство left)
    * @param {Object} eventItem
    */
    getEventLeftCoordinate: function(eventItem)
    {
        //Смещение элемента для отрисовки события, когда время события = 00:00
        var eventPixelOffsetWhenZero = 33;
        var eventTime = eventItem.EventTime;
        var eventTotalHours = eventTime.getHours() + eventTime.getMinutes() / 60;
        var nowInMoscow = this.getLocalTimeInMoscow();
        if (eventTime.getDate() == nowInMoscow.getDate())
            return eventPixelOffsetWhenZero + eventTotalHours * this.pixelsInOneHour;
        else //Это событие за вчера
            return eventPixelOffsetWhenZero - (24 - eventTotalHours) * this.pixelsInOneHour;
    },
    /**
    * Выдает Css класс для отображения события
    * @param {Object} eventType
    */
    getEventCssClass: function(eventType)
    {
        switch (eventType)
        {
            case -1: return "f_gray"; //Schedule
            case 0: return "f_orang"; //OTS
            case 1: return "f_orang"; //UOD
            case 2: return "f_green"; //ACCEPT
        }
        return "";
    },
    get_containerElementID: function()
    {
        return this.containerElementID;
    },
    set_containerElementID: function(value)
    {
        this.containerElementID = value;
    },
    get_moscowTimeUTCOffset: function()
    {
        return this.moscowTimeUTCOffset;
    },
    /**
    * Задает текущее смещение локального времени Москвы от UTC
    * @param {Object} value
    */
    set_moscowTimeUTCOffset: function(value)
    {
        this.moscowTimeUTCOffset = value;
        var now = new Date();
        this.hoursToAddToLocalTime = value + now.getTimezoneOffset() / 60;
    }
};

// JSON object that describes all properties, events, and methods of this component that should
// be addressable through the Sys.TypeDescriptor methods, and addressable via xml-script.
EventsControl.descriptor = {
properties: [
	{ name: 'containerElementID', type: String },
	{ name: 'moscowTimeUTCOffset', type: Number }
]
};
EventsControl.registerClass('EventsControl', Sys.Component);

// Since this script is not loaded by System.Web.Handlers.ScriptResourceHandler
// invoke Sys.Application.notifyScriptLoaded to notify ScriptManager 
// that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();