﻿var DataGridControl = new function() {
    this._Name = "DataGridControl";
    this.div = function() { return $("#dataGrid"); }
    this.noRecordsFound = function() { return $("#noRecordsFound", this.div()); }
    this.paging = function() { return $("#paging", this.div()); }
    this.addItemButton = function() { return $("#addItemButton", this.div()); }
    this.table = function() { return $("#locations", this.div()); }
    this._SeekFirst = this._SeekPrevious = this._SeekNext = this._SeekLast = this._SeekPage = null;
    this._OnPageChanged = undefined;
    this._OnItemAdded = undefined;

    this.init = function(aSettings, aParentElement) {
        this.noRecordsFound().hide();

        this._CurrentSettings = aSettings ? aSettings : { OrderColumn: null, OrderAscending: null, SelectedId: null, Page: 1, AvailablePages: 0 };

        this.addItemButton().iconButton({
            iconType: "plus",
            onClick: DataGridControl._onAddItem
        });

        this._SeekFirst = $("td:eq(0)", this.paging());
        this._SeekFirst.cellIcon({
            type: "seek-first",
            click: function() {
                DataGridControl._CurrentSettings.Page = 1;
                DataGridControl._onPageChange();
            }
        });

        this._SeekPrevious = $("td:eq(1)", this.paging()).cellIcon({
            type: "seek-prev",
            click: function() {
                DataGridControl._CurrentSettings.Page--;
                DataGridControl._onPageChange();
            }
        });

        this._SeekPage = $("td:eq(2)", this.paging());

        this._SeekNext = $("td:eq(3)", this.paging()).cellIcon({
            type: "seek-next",
            click: function() {
                DataGridControl._CurrentSettings.Page++;
                DataGridControl._onPageChange();
            }
        });

        this._SeekLast = $("td:eq(4)", this.paging()).cellIcon({
            type: "seek-end",
            click: function() {
                DataGridControl._CurrentSettings.Page = DataGridControl._CurrentSettings.AvailablePages;
                DataGridControl._onPageChange();
            }
        });

        this.paging().hide();
        this.addItemButton().iconButton({
            iconType: "plus",
            onClick: DataGridControl._onAddItem
        });
    }

    this.emptyTable = function() {
        this.table().empty();
        this.paging().hide();
    }

    this.settings = function(aNewSettings) {
        if (aNewSettings)
            this._CurrentSettings = aNewSettings;

        return this._CurrentSettings;
    }

    this.onPageChange = function(aNewOnPageChange) {
        if (aNewOnPageChange)
            this._OnPageChanged = aNewOnPageChange;

        return this._OnPageChanged;
    }

    this._onAddItem = function() {
        if (DataGridControl._OnItemAdded)
            DataGridControl._OnItemAdded();
    }

    this.onAddItem = function(aNewOnAddItem) {
        if (aNewOnAddItem)
            this._OnItemAdded = aNewOnAddItem;

        return this._OnItemAdded;
    }

    this._onPageChange = function() {
        if (this._OnPageChanged) {
            this.paging().hide();
            this._OnPageChanged();
        }
    }

    this._checkNoRecordsOnCurrentPage = function(aItemsCount) {
        if (aItemsCount == 0 && DataGridControl._CurrentSettings.Page > 1) {
            DataGridControl._CurrentSettings.Page--;
            DataGridControl._onPageChange();
        }
    }

    this.buildExpandedTable = function(aOptions) {
        log(DataGridControl, "Building expanded table with '{0}' results", aOptions.Items.length);
        DataGridControl._buildExpandedTable(aOptions);

        //DataGridControl.setPagingControls(aOptions.TotalCount, aOptions.PageSize, aOptions.Items.length);
        DataGridControl._checkNoRecordsOnCurrentPage(aOptions.Items.length);
    }

    this._buildExpandedTable = function(aOptions) {
        var table = this.table();
        table.empty();

        var columns = aOptions.Columns;
        var head = $("<thead><thead>").appendTo(table);
        var headRow = $("<tr></tr>").appendTo(head);
        var idColumn = null;

        for (var i = 0; i < columns.length; i++) {
            var column = columns[i];
            var columnName = column.Name;
            idColumn = column.ID ? columnName : idColumn;
            if (column.Header) {
                var idString = columnName == null ? "" : ("id='" + columnName + "'");
                var headerCell = $("<td " + idString + "></td>");
                headerCell.addClass("ui-widget ui-state-default ui-corner-all data-grid-header")
                          .text(null == column.Header ? "" : column.Header)
                          .appendTo(headRow)
                          .iconButton({
                              iconDisplayed: columnName && columnName == DataGridControl._CurrentSettings.OrderColumn,
                              iconType: DataGridControl._CurrentSettings.OrderAscending ? "triangle-1-s" : "triangle-1-n"
                          });
                if (column.Width)
                    headerCell.css("width", column.Width);

                if (columnName) {
                    headerCell.hover(
                                function() { $(this).addClass("ui-state-hover"); },
                                function() { $(this).removeClass("ui-state-hover"); }
                           )
                           .click(function() {
                               var orderColumn = $(this).attr("id");
                               if (orderColumn) {
                                   if (DataGridControl._CurrentSettings.OrderColumn == orderColumn)
                                       DataGridControl._CurrentSettings.OrderAscending = !DataGridControl._CurrentSettings.OrderAscending;
                                   else
                                       DataGridControl._CurrentSettings.OrderColumn = orderColumn;

                                   DataGridControl._onPageChange();
                               }
                           });

                }
            }
            else $("<td />").addClass("ui-helper-reset").appendTo(headRow);
        }

        var items = aOptions.Items;

        for (var index in items) {
            var item = items[index];
            var idValue = eval('item.' + idColumn);
            var firstRow = $("<tr id=" + idValue + " firstRow='true'></tr>")
                               .addClass((index & 1) == 0 ? "" : "alternate")
                               .appendTo(table)
                               .hover(
                                    function() { $(this).addClass("ui-hover"); },
                                    function() { $(this).removeClass("ui-hover"); }
                                );

            var cellPattern = "<td></td>";

            for (var cellIndex in columns) {
                var cell = $(cellPattern);

                var result = columns[cellIndex].CellFunction(cell, item);

                if (undefined == result || result)
                    cell.appendTo(firstRow);
            }

            if (aOptions.RowFunction)
                aOptions.RowFunction(firstRow, item);
        }
    }

    this.setPagingControls = function(aTotalCount, aPageSize, aItemsCount) {
        if ((aItemsCount <= 1 && DataGridControl._CurrentSettings.Page == 1) || undefined == aTotalCount)
            DataGridControl.paging().hide();
        else {
            DataGridControl._CurrentSettings.AvailablePages = Math.ceil(aTotalCount / aPageSize);

            if (DataGridControl._CurrentSettings.AvailablePages == 1 && aItemsCount <= 1)
                DataGridControl.paging().hide();
            else
                DataGridControl.paging().show();

            DataGridControl._SeekFirst.cellIcon("option", "clickable", DataGridControl._CurrentSettings.Page > 1);
            DataGridControl._SeekPrevious.cellIcon("option", "clickable", DataGridControl._CurrentSettings.Page > 1);

            DataGridControl._SeekLast.cellIcon("option", "clickable", DataGridControl._CurrentSettings.Page < DataGridControl._CurrentSettings.AvailablePages);
            DataGridControl._SeekNext.cellIcon("option", "clickable", DataGridControl._CurrentSettings.Page < DataGridControl._CurrentSettings.AvailablePages);

            DataGridControl._SeekPage.text(String.format("Sida {0} av {1}", DataGridControl._CurrentSettings.Page, DataGridControl._CurrentSettings.AvailablePages));
        }
    }
}
