﻿    function GetDialog(data, options) {
        var div = GetDivForDialog();
        div.html(data);
        SetDialog(div, options);
        return div;
    }

    function SetDialog(dialogDiv, options) {
        var defaults = { autoOpen: false, closeOnEscape: true, draggable: true, close: HandleDialogClose, width: "auto", height: "auto" };
        
        if (options != null) {
            $.extend(defaults, options); 
        }
        dialogDiv.dialog(defaults);
    }

    var divsOpen = new Array();
    var divsCreated = new Array();
    var divDialog = $("#dialog");
    function GetDivForDialog() {
        if (divsCreated.length == 0) {
            $("#dialog").append("<div id=\"dialog0\"></div>");
            divsCreated.push("dialog0");
            divsOpen.push("dialog0");
            return $("#dialog0");
        } else {
            for (var divId in divsCreated) {
                var divIdValue = divsCreated[divId];
                if (jQuery.inArray(divIdValue, divsOpen) == -1) {
                    divsOpen.push(divIdValue);
                    return $("#" + divIdValue);
                }
            }
        }

        var createdDivId = divsCreated.length;
        $("#dialog").append("<div id=\"dialog" + createdDivId + "\" ></div>");
        divsOpen.push("dialog" + createdDivId);
        divsCreated.push("dialog" + createdDivId);
        return $("#dialog" + createdDivId);
    }

    function HandleDialogClose(event, ui) {
        divsOpen = jQuery.grep(divsOpen, function(element) { return element != event.target.id });
        var closingDialog = $('#' + event.target.id);
        var grid = closingDialog.find(".scroll");
        var gridId;
        $.each(grid, function() {
            if (this.id != null && this.id.indexOf("datagrid") != -1 && this.id.indexOf("pager") == -1)
                gridId = this.id;
        });
        if (GridValues != null && gridId != null && GridValues[gridId] != null)
            GridValues[gridId] = null;
        closingDialog.empty();
        closingDialog.dialog('destroy');
        
    }

    function AddDialogOption(dialogDiv, optionName, optionValue) {
        dialogDiv.dialog('option', optionName, optionValue);
    }

    function OpenNewDialogAndCloseOldDialogIfNotError(view, oldDialogTitle) {
        var newDialog = GetDialog(view);
        var firstDiv = newDialog.find('div:first');
        var title = firstDiv.attr('title'); 

        if (title == "Validation Errors")
            OpenDialog(newDialog);
        else {
            CloseDialogWithTitle(oldDialogTitle);
            OpenDialog(newDialog);
        }

    }
    
    function CloseDialogWithTitle(title) {
         var oldDialog = GetFirstDialogWithTitle(title);
         CloseDialog(oldDialog);
    }
    
    function OpenDialog(dialogDiv) {
        var firstDiv = dialogDiv.find('div:first');
        var width = firstDiv.attr("width");
        var height = firstDiv.attr('height');
        var title = firstDiv.attr('title');
        var modal = firstDiv.attr('modal') == "true";
        
        if (title == "Validation Errors")
            AddDialogOption(dialogDiv, "buttons", { "Ok": function() { $(this).dialog("close"); } });
        if (title == "Invoice")
            AddDialogOption(dialogDiv, "buttons", { "Print": function() { PrintInvoice(); } });
            
        AddDialogOption(dialogDiv, "height", height);
        AddDialogOption(dialogDiv, "width", width);        
        AddDialogOption(dialogDiv, "title", title);
        AddDialogOption(dialogDiv, "modal", modal);
        AddDialogOption(dialogDiv, "resizable", true);
        dialogDiv.bgiframe();
        dialogDiv.dialog('open');
    }
    
    function CloseDialog(dialogDiv) {
        dialogDiv.empty();
        dialogDiv.dialog('close');
    }

    function HandleError() {
        HandleErrorWithMessage('An unexpected error has occurred. Error has been logged. Please try again. We apologize for the inconvenience.');
    }

    function HandleErrorWithMessage(message) {
        EndProcessing();
        var data = '<div title="Unexpected error" modal="true" class="ui-widget"><div class="ui-state-error ui-corner-all" style="padding: 0 .7em;"><p>' + message + '</p></div></div>';
        var divDialog = GetDialog(data);
        divDialog.dialog('option', 'buttons', { 'OK': function() { $(this).dialog('close'); } });
        AddDialogOption(divDialog, "title", 'Error');
        OpenDialog(divDialog);
    }

    var stopAnimation = false;
    var processing = $("#processing");
    function StartProcessing(text) {
        stopAnimation = false;
        var processing = $("#processing");
        processing.text(text);
        processing.fadeIn('fast', function() { $(this).fadeOut('slow'); if (stopAnimation === false) StartProcessing(); });
    }

    function EndProcessing() {
        stopAnimation = true;
        processing.fadeOut('slow');
    }

    function ShowMessage(message) {
        message = '<div class="ui-widget"><div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"><p>' + message + '</p></div></div> ';
        var messageDialog = GetDialog(message);
        messageDialog.dialog('option', 'modal', true);
        messageDialog.dialog('option', 'resizable', false);
        messageDialog.dialog('option', 'buttons', { "OK": function() { $(this).dialog('destroy'); } });
        messageDialog.dialog('open');
    }

    function HandleSelectListCascade(data) 
    {
        for (listOrdinal in data) 
        {
                var nextList = data[parseInt(listOrdinal) + 1];
                $("#" + data[listOrdinal].name).change(function()
                {
                    EnableList($("#" + nextList.name), nextList.url, nextList.parameters)
                    for (nextOrdinal in data)
                    {
                        if (!(nextOrdinal > listOrdinal)) continue;
                        DisableList($("#" + data[nextOrdinal].name));
                    }
                });

                if (listOrdinal != "1")
                    DisableList($("#" + data[listOrdinal].name));
        }

    }

    function EnableList(listId, url, parameters)
    {
        var list = $("#" + listId);
        $.ajax({ beforeSend: StartProcessing, complete: EndProcessing, dataType: "json", error: HandleError, success: function(data) { $(list).addOption(data, false); }, data: parameters, url: url });
        list.removeAttr("disabled");
        list.fadeTo("Slow", 1);
    }

    function DisableLists(listIds)
    {
        for (id in listIds)
        {
            var list = $("#" + listIds[id]);
            list.attr("disabled", "disabled");
            list.fadeTo("slow", 0.33);
            list.removeOption(/[^A-Za-z0-9\.&@:?!()$#^]/);
        }

    }
    function ShowGrid(tableId, options) {
        return $("#" + tableId).jqGrid(options);
    }

    function GetGridWidth(grid) {
        var styleWidth = grid.css("width");
        if (styleWidth == null || styleWidth.length < 3)
            return 0;

        styleWidth = $.trim(styleWidth.replace(/px/i, ''));

        if (isNaN(styleWidth))
            return 0;

        return parseInt(styleWidth);
    }

    function LoadGrid(divId, title, gridExtraOptions) {
        var gridId = divId + "grid"
        var pagerId = divId + "pager";
        $("#" + divId).html('<table id="' + gridId + '" class="scroll"></table><div id="' + pagerId + '" class="scroll" style="text-align:center;"></div>');
        if (gridExtraOptions.hasOwnProperty("pager")) { 
            $.extend(gridExtraOptions, { pager: $("#" + pagerId) });
        }
        var grid = ShowGrid(gridId, GetGridOptions(gridExtraOptions));
        if (gridExtraOptions.hasOwnProperty("pager")) {
            grid.navGrid("#" + pagerId, { edit: false, add: false, del: false, search: false, refresh:true });
        }
        return grid;
    }

    function GetGridDialog(title, gridExtraOptions) {
        var dialogDiv = GetDialog('', { modal: true, title: title });
        var tableId = GetGridTableId(dialogDiv);
        var pagerId = tableId + "pager";
        dialogDiv.html('<table id="' + tableId + '" class="scroll"></table><div id="' + pagerId + '" class="scroll" style="text-align:center;"></div>');
        if (gridExtraOptions.hasOwnProperty("pager")) { 
            $.extend(gridExtraOptions, { pager: $("#" + pagerId) });
        }
            
        var grid = ShowGrid(tableId, GetGridOptions(gridExtraOptions));
        if (gridExtraOptions.hasOwnProperty("pager")) {
            grid.navGrid("#" + pagerId, { edit: false, add: false, del: false, search: true });
        }

        AddDialogOption(dialogDiv, 'modal', true);
        return dialogDiv;
    }

    function GetGridTableId(dialogDiv) { 
        return tableId = dialogDiv.attr('id') + 'datagrid';
    }
    
    function ShowObjectErrors(obj) {
        var errorMessage = '';
        for (var error in obj.Errors) {
            errorMessage += obj.Errors[error] + '<br />';
        }
        ShowMessage(errorMessage);
    }

    function GetDialogsWithTitle(title) {
        var dialogs = new Array();
        $(".ui-dialog-title").each(function() {
            if ($(this).text() == title) {
                var id = $(this).attr('id');
                id = id.substring(id.lastIndexOf('-') + 1)
                dialogs.push($('#' + id));
            }
        });
        return dialogs;
    }

    function GetFirstDialogWithTitle(title) {
        var foundDialog;
        $(".ui-dialog-title").each(function() {
            if ($(this).text() == title) {
                var id = $(this).attr('id');
                id = id.substring(id.lastIndexOf('-') + 1);
                foundDialog = $('#' + id);
            }
        });
        return foundDialog;
    }



    //------------------------
    //Up & Down grid selections


    var GridValues = [];
    function UpdateGridValues(gridId) {
        var GridValue = { currentGrid: null, tableDiv: null, allIdsInGridTable: null, divHeight: null, divRowHeight: null, maxRowsInGrid: null, currentId: null, currentRowNumber: null, shownRowsCount: null, lastIdShownIndex: null, firstIdShownIndex: null };
        GridValue.currentGrid = jQuery("#" + gridId);
        GridValue.allIdsInGridTable = GridValue.currentGrid.getDataIDs();
        GridValue.currentId = GridValue.currentGrid.getGridParam('selrow');
        GridValue.currentRowNumber = GridValue.allIdsInGridTable.indexOf(GridValue.currentId) + 1;
        GridValue.maxRowsInGrid = GridValue.allIdsInGridTable.length;
        GridValue.tableDiv = GridValue.currentGrid.parent();
        GridValue.divHeight = GridValue.tableDiv.height();
        GridValue.divRowHeight = GridValue.tableDiv.find("#" + GridValue.allIdsInGridTable[0]).height();
        GridValue.shownRowsCount = parseInt(GridValue.divHeight / GridValue.divRowHeight);
        GridValue.lastIdShownIndex = GridValue.allIdsInGridTable.indexOf(GridValue.allIdsInGridTable[GridValue.shownRowsCount - 1]);
        GridValue.firstIdShownIndex = GridValue.allIdsInGridTable.indexOf(GridValue.allIdsInGridTable[0]);
        GridValues[gridId] = GridValue;
     }

     function HandleDownArrowPress(gridId) {
         if (GridValues[gridId] == null)
             UpdateGridValues(gridId);
         var GridValue = GridValues[gridId];
         GridValue.currentId = GridValue.currentGrid.getGridParam('selrow');
         if (GridValue.allIdsInGridTable.indexOf(GridValue.currentId) == null || isNaN(GridValue.allIdsInGridTable.indexOf(GridValue.currentId)) || parseInt(GridValue.allIdsInGridTable.indexOf(GridValue.currentId)) >= (GridValue.allIdsInGridTable.length - 1))
            return;
        GridValue.currentId = GridValue.allIdsInGridTable[GridValue.allIdsInGridTable.indexOf(GridValue.currentId) + 1];
        if (GridValue.allIdsInGridTable.indexOf(GridValue.currentId) == null || isNaN(GridValue.allIdsInGridTable.indexOf(GridValue.currentId)))
            return;
        GridValue.currentGrid.resetSelection();
        GridValue.currentGrid.setSelection(GridValue.currentId);
        if (GridValue.allIdsInGridTable.indexOf(GridValue.currentId) > GridValue.lastIdShownIndex) {
            GridValue.tableDiv[0].scrollTop += GridValue.divRowHeight;
            GridValue.lastIdShownIndex += 1;
            GridValue.firstIdShownIndex += 1;
         }
                    
    }

    function HandleUpArrowPress(gridId) {
        if (GridValues[gridId] == null)
            UpdateGridValues(gridId);
        var GridValue = GridValues[gridId];
        GridValue.currentId = GridValue.currentGrid.getGridParam('selrow');
        if (GridValue.allIdsInGridTable.indexOf(GridValue.currentId) == null || isNaN(GridValue.allIdsInGridTable.indexOf(GridValue.currentId)) || parseInt(GridValue.allIdsInGridTable.indexOf(GridValue.currentId)) <= 0)
            return;
        GridValue.currentId = GridValue.allIdsInGridTable[GridValue.allIdsInGridTable.indexOf(GridValue.currentId) - 1];
        if (GridValue.allIdsInGridTable.indexOf(GridValue.currentId) == null || isNaN(GridValue.allIdsInGridTable.indexOf(GridValue.currentId)))
            return;
        GridValue.currentGrid.resetSelection();
        GridValue.currentGrid.setSelection(GridValue.currentId);
        if (GridValue.allIdsInGridTable.indexOf(GridValue.currentId) < GridValue.firstIdShownIndex) {
            GridValue.tableDiv[0].scrollTop -= GridValue.divRowHeight;
            GridValue.lastIdShownIndex -= 1;
            GridValue.firstIdShownIndex -= 1;
        }

    }
    //-----------------------
    
    function SelectFirstRecordOnLoadComplete(grid) {

        var allIds = jQuery("#" + grid.id).getDataIDs();
        if(allIds == null || isNaN(allIds[0]))
            return;
        jQuery("#" + grid.id).setSelection(allIds[0]);           
    }
