﻿Array.prototype.remove = function(index) {
    for (var i = index; i < this.length - 1; i++) this[i] = this[i + 1];
    this.length -= 1;
}
Array.prototype.insert = function(value, index) {
    for (var i = this.length; i > index; i--) this[i] = this[i - 1];
    this[index] = value;
}
function GetObject(id) {
    return ((typeof(id)).toLowerCase() == 'string') ? $Get(id) : id;
}
function AddClassName(identificador, className) {
    var obj = GetObject(identificador);
    var str = obj.className || '';
    var arrClassNames = str.split(' ');
    for (var i = 0; i < arrClassNames.length; i++) {
        if (i == 0 && arrClassNames.length == 1 && arrClassNames[i] == '') { arrClassNames[0] = className; obj.className = className; return; }
        if (arrClassNames[i].toLowerCase() == className.toLowerCase()) return;
    }
    arrClassNames.push(className);
    obj.className = arrClassNames.join(' ');
}
function RemoveClassName(identificador, className) {
    var obj = GetObject(identificador);
    var str = obj.className || '';
    var arrClassNames = str.split(' ');
    for (var i = arrClassNames.length - 1; i >= 0; i--)
        if (arrClassNames[i].toLowerCase() == className.toLowerCase())
            arrClassNames.remove(i);
    obj.className = arrClassNames.join(' ');
}
function ClearClassName(identificador) {
    var obj = GetObject(identificador);
    obj.className = '';
}

Tabs = {};
Tabs.TabControllers = {};
Tabs.LockedTabs = {};
Tabs.PickMe = function(item, selectedPanel, tabController)
{
    if (Tabs.IsLocked(item)) return;
    if (PickMe_running) return;
    PickMe_running = true;
    var _ul = item.parentNode;
    for (var i = 0; i < _ul.childNodes.length; i++) RemoveClassName(_ul.childNodes[i], 'selected');
    Tabs.SelectTab(tabController, selectedPanel);
    AddClassName(item, 'selected');
    PickMe_running = false;
}
Tabs.Select = function(tab)
{
    tab.onclick();
}
Tabs.SelectTab = function(tabController, selectedPanel) {
    var panels = Tabs.TabControllers[tabController];
    for (var i = 0; i < panels.length; i++) $Get(panels[i]).style.display = 'none';
    $Get(selectedPanel).style.display = '';
}
Tabs.UnSelectTab = function(item)
{
    RemoveClassName(item, 'highlighted')
}
Tabs.IsLocked = function(item)
{
    if (!item) return false;
    return item.locked ? true : false;
}
Tabs.Lock = function(item)
{
    if (item) item.locked = true;
}
Tabs.UnLock = function(item)
{
    if (item) item.locked = false;
}
Tabs.HighlightMe = function(item)
{
    if (Tabs.IsLocked(item)) return;
    if (HighlightMe_running || PickMe_running) return;
    HighlightMe_running = true;
    var _ul = item.parentNode;
    for (var i = 0; i < _ul.childNodes.length; i++) RemoveClassName(_ul.childNodes[i], 'highlighted');
    if ('selected' != item.className) AddClassName(item, 'highlighted');
    HighlightMe_running = false;
}
Tabs.LeaveMe = function(item) 
{
    if (LeaveMe_running || PickMe_running) return;
    LeaveMe_running = true;
    var _ul = item.parentNode;
    for (var i = 0; i < _ul.childNodes.length; i++) RemoveClassName(_ul.childNodes[i], 'highlighted');
    LeaveMe_running = false;
}
PickMe_running = false;
HighlightMe_running = false;
LeaveMe_running = false;

GetSelectedRadio = function(name)
{
    var radios = document.getElementsByName(name);
    for (var i = 0; i < radios.length; i++) if (radios[i].checked) return radios[i];

    return null;
}

LinkedFieldSetCollection = {};
LinkedFieldSet = function(name)
{
    this.Fields = [];
    this.maxEnabledItem = -1;
    this.SetDefaultItem = function(index)
    {
        this.maxEnabledItem = index;
    }
    this.AddField = function(id, type, order, populateFunction, childCount, allwaysHidden, minSize)
    {
        this.Fields.push(new LinkedField(id, type, order, populateFunction, childCount, allwaysHidden, minSize));
        this.Fields[this.Fields.length - 1].fieldSet = this;
        return this;
    }
    this.OnTextChange = function(ev)
    {
        if (this.value != this.lastValue)
            this.linkedField.fieldSet.InvalidateCurrentField(this.linkedField.order);

        if (this.value != '' && this.value.length >= this.linkedField.minSize)
            this.linkedField.fieldSet.ExitCurrentField(this.linkedField.order);
        else
            this.linkedField.fieldSet.InvalidateCurrentField(this.linkedField.order);
    }
    this.OnTextBlur = function(ev)
    {
        ev = ev || this.event;
        this.lastValue = this.value;
    }
    this.OnComboChange = function(ev)
    {
        ev = ev || this.event;

        if (this.onchange2)
            this.onchange2(ev);

        if (this.SelectedValue() == '--')
        {
            this.linkedField.fieldSet.ExitCurrentField(this.linkedField.order - 1);
            this.linkedField.fieldSet.InvalidateCurrentField(this.linkedField.order);
            return false;
        }

        this.linkedField.fieldSet.InvalidateCurrentField(this.linkedField.order);
        if (this.options.length > 0 && !this.options[0].selected)
        {
            this.linkedField.fieldSet.ExitCurrentField(this.linkedField.order);
        }
    }
    this.OnRadioClick = function(ev)
    {
        ev = ev || this.event;

        var radios = document.getElementsByName(this.name);
        var radio = null;
        this.linkedField.fieldSet.InvalidateCurrentField(this.linkedField.order);
        for (var i = 0; i < radios.length; i++)
        {
            radio = radios[i];
            if (radio.checked)
            {
                radio.linkedField.fieldSet.ExitCurrentField(radio.linkedField.order);
                return;
            }
        }
    }
    this.Initialize = function()
    {
        for (var i = 0; i < this.Fields.length; i++)
        {
            var field = this.Fields[i];
            switch (field.type)
            {
                case 1:
                    $Get(field.id).linkedField = field;
                    $Get(field.id).linkedFieldSet = this;
                    $Get(field.id).onblur = this.OnTextBlur;
                    $Get(field.id).onkeyup = this.OnTextChange;
                    break;
                case 2:
                    $Get(field.id).linkedField = field;
                    $Get(field.id).onchange2 = $Get(field.id).onchange;
                    $Get(field.id).onchange = this.OnComboChange;
                    break;
                case 3:
                    var fieldset = this;
                    field.ForEachRadioButton(function(x)
                    {
                        x.linkedField = field;
                        x.onclick = fieldset.OnRadioClick;
                    });
                    break;
            }
            if (i > this.maxEnabledItem + 1)
            {
                this.Fields[i].Disable();
            }
        }
        if (this.maxEnabledItem >= 0)
        {
            this.ExitCurrentField(this.maxEnabledItem);
        }
    }
    this.ExitCurrentField = function(index)
    {
        var ativarProximoCampo = index < (this.Fields.length - 1);
        if (ativarProximoCampo)
        {
            this.Fields[index + 1].Enable();
        }
    }
    this.InvalidateCurrentField = function(index)
    {
        for (var i = index + 1; i < this.Fields.length; i++)
        {
            this.Fields[i].Reset();
            this.Fields[i].Disable();
        }
    }
    this.ResetNextFields = function(index)
    {
        for (var i = index + 1; i < this.Fields.length; i++)
            this.Fields[i].Reset();
    }
    LinkedFieldSetCollection[name] = this;
}
LinkedField = function(id, type, order, populateFunction, childCount, allwaysHidden, minSize)
{
    this.id = id;
    this.type = type;
    this.order = order;
    this.childCount = childCount || 0;
    this.populateFunction = populateFunction;
    this.allwaysHidden = allwaysHidden;
    this.minSize = minSize;
    this.ForEachRadioButton = function(action)
    {
        for (var i = 0; i < this.childCount; i++)
            action($Get(this.id + i.toString()));
    }
    this.Reset = function()
    {
        switch (this.type)
        {
            case 1:
                $Get(this.id).value = '';
                break;
            case 2:
                var combo = $Get(this.id);
                if (combo.options.length > 0) combo.options[0].selected = true;
                break;
            case 3:
                this.ForEachRadioButton(function(x) { x.checked = false; });
                break;
        }
    }
    this.Disable = function()
    {
        switch (this.type)
        {
            case 1:
            case 2:
                //$Get(this.id).disabled = true;
                $Get(this.id).style.display = 'none';
                $Get(this.id).style.visibility = 'hidden';
                break;
            case 3:
                this.ForEachRadioButton(function(x) { x.disabled = true; });
                break;
        }
    }
    this.Enable = function()
    {
        switch (this.type)
        {
            case 1:
                //$Get(this.id).disabled = false;
                $Get(this.id).style.display = '';
                $Get(this.id).style.visibility = 'visible';
                break;
            case 2:
                var combo = $Get(this.id);
                //combo.disabled = false;
                combo.style.display = '';
                combo.style.visibility = 'visible';
                combo.DataBind = Tesla.UI.ListControl.Functions.DataBind;
                if (this.populateFunction)
                {
                    combo.options.length = 0;
                    combo.options[0] = new Option('Carregando...');
                    var fn = new Function('p1,p2', this.populateFunction + '(p1,p2)');
                    fn(this, combo);
                }
                break;
            case 3:
                this.ForEachRadioButton(function(x) { x.disabled = false; });
                if (this.populateFunction)
                {
                    var text = $Get(this.id);
                    var fn = new Function('p1,p2', this.populateFunction + '(p1,p2)');
                    fn(this, text);
                }
                break;
        }
    }
    this.Release = function()
    {
    }
}
Tesla.UI.ListControl.Functions.DataBind = function(dataSource, valueProperty, textProperty, selectOption, preserveItems, p1, p2, p3)
{
    if (!dataSource.GetEnumerator)
        return;

    drop = this;
    if (!preserveItems)
        drop.options.length = 0;

    if (selectOption)
        drop.Add('', selectOption);

    var en = dataSource.GetEnumerator();
    while (en.MoveNext())
    {
        drop.Add(valueProperty ? en.Current[valueProperty] : en.Current, textProperty ? en.Current[textProperty] : en.Current);        
        if (p1) drop.options[drop.options.length - 1][p1] = en.Current[p1];
        if (p2) drop.options[drop.options.length - 1][p2] = en.Current[p2];
        if (p3) drop.options[drop.options.length - 1][p3] = en.Current[p3];
        drop.options[drop.options.length - 1].title = en.Current[valueProperty];
    }
}


DegressHelper = function()
{
    this.Minima = 180;
    this.Maxima = -180;
    this.Media = 0;
    this.Qtd = 0;
    this.Mediana = 0;
    this.Adiciona = function(val)
    {
        if (val < this.Minima) this.Minima = val;
        if (val > this.Maxima) this.Maxima = val;
        this.Media = (this.Media * this.Qtd / (this.Qtd + 1)) + (val / (this.Qtd + 1));
        this.Mediana = (this.Minima + this.Maxima) / 2;
        this.Qtd++;
    }
    this.GetZoomLevel = function()
    {
        var pixels = 300;
        var dif = this.Maxima - this.Minima;
        var x = dif * 1000 / pixels;
        //234.365, 117.1775, 
        var arr = [58.58375, 29.286875, 14.6384375, 7.31421875, 3.652109375, 1.821054688, 0.905527344, 0.447763672, 0.218881836, 0.104440918, 0.047220459, 0.018610229, 0.004305115];
        for (var i = 0; i < arr.length; i++)
            if (x > arr[i]) return i + 3;

        return 17;
    }
}

function ScrollableBorders(divId)
{
    function GetMouseOffset(target, ev)
    {
        ev = ev || window.event;

        var docPos = GetPosition(target);
        var mousePos = GetMouseCoords(ev);
        return { x: mousePos.x - docPos.x, y: mousePos.y - docPos.y };
    }

    function GetPosition(e)
    {
        var left = 0;
        var top = 0;

        if (!e.offsetParent)
            left = 0;
        while (e.offsetParent)
        {
            left += e.offsetLeft;
            top += e.offsetTop;
            e = e.offsetParent;
        }

        left += e.offsetLeft;
        top += e.offsetTop;

        return { x: left, y: top };
    }
    function GetMouseCoords(ev)
    {
        return {
            x: ev.clientX + document.documentElement.scrollLeft,
            y: ev.clientY + document.documentElement.scrollTop
        };
    }

    this.divId = divId;
    $Get(this.divId).scrollableBorderObj = this;
    ScrollableBorders.Drags[divId] = this;
    $Get(this.divId).onmousemove = function(ev)
    {
        ev = ev || this.event || window.event;
        var drag = this.scrollableBorderObj;
        var div = this;
        var mc = GetMouseCoords(ev);
        var pos = GetPosition(div);
        var rp = { x: mc.x - pos.x, y: mc.y - pos.y };
        var mov = { x: 0, y: 0 };
        if (rp.x < 50) mov.x = -6; else if (rp.x > div.offsetWidth - 50) mov.x = 6;
        if (rp.y < 50) mov.y = -6; else if (rp.y > div.offsetHeight - 50) mov.y = 6;

        if (drag.mov && drag.mov.x == mov.x && drag.mov.y == mov.y) return;
        if (drag.moving) { clearInterval(drag.moving); drag.moving = null; drag.mov = null; }
        drag.mov = mov;
        if (mov.x != 0 || mov.y != 0)
            drag.moving = setInterval('ScrollableBorders.ScrollDiv(\'' + drag.divId + '\', ' + mov.x.toString() + ',' + mov.y.toString() + ')', 40);
    }
    $Get(this.divId).onmouseout = function(ev)
    {
        ev = ev || this.event;
        var drag = this.scrollableBorderObj;
        if (drag.moving) { clearInterval(drag.moving); drag.moving = null; }
    }
}
ScrollableBorders.Drags = {};
ScrollableBorders.Stop = function(divId)
{
    clearInterval(ScrollableBorders.Drags[divId].moving);
    ScrollableBorders.Drags[divId].moving = null;
    ScrollableBorders.Drags[divId].mov = null;
}
ScrollableBorders.ScrollDiv = function(divId, x, y)
{
    var div = $Get(divId);
    var left = div.scrollLeft;
    var top = div.scrollTop;
    left = (left + x);
    top = (top + y);

    if ((div.scrollWidth < left || left < 0) && (div.scrollHeight < top || top < 0)) ScrollableBorders.Stop(divId);
    if (div.scrollWidth > left && left >= 0) div.scrollLeft = left;
    if (div.scrollHeight > top && top >= 0) div.scrollTop = top;
}