﻿var ID_SUFFIX = 1000;
var TOTAL_WIDTH = 912;
var GridMode = {"locked": 0, "initial": 1, "preview": 2, "sender": 3, "recipient": 4};
var GridItemType = {"normal": 0, "readOnly": 1, "negotiateAmount": 2, "archived": 3, "history": 4, "edit": 5};
var LayoutMeta = {
    "columns": {
        "edit": {
            "width": 25, "visible": false,
            "header": { "cssClasses": "verticalHeader", "value": "<img src='/images/v2/vertColmnHeader_Change.gif' alt='' />" }
        },
        "sequence": {
            "width": 27, "visible": true,
            "header": { "cssClasses": "orangeHeader", "value": "" }
        },
        "description": {
            "width": 0, "visible": true, "idPrefix": "tbDescription", "isNumeric": false, "isCurrency": false, // Description width is set 0 by default because its going to be auto-calculated
            "header": { "cssClasses": "orangeHeader", "value": "Description" }
        },
        "dateDuration": {
            "width": 100, "visible": false,
            "header": { "cssClasses": "orangeHeader", "value": "Date" }
        },
        "quantity": {
            "width": 50, "visible": true, "idPrefix": "tbQuantity", "isNumeric": true, "isCurrency": false,
            "header": { "cssClasses": "orangeHeader digitColumn", "value": "<div>Qty</div>" }
        },
        "unitPrice": {
            "width": 105, "visible": true, "idPrefix": "tbUnitPrice", "isNumeric": false, "isCurrency": true,
            "header": { "cssClasses": "orangeHeader digitColumn", "value": "<div>Unit Price</div>" }
        },
        "total": {
            "width": 135, "visible": true,
            "header": { "cssClasses": "orangeHeader digitColumn", "value": "<div>Total</div>" }
        },
        "seperator": {
            "width": 10, "visible": true,
            "header": { "cssClasses": "", "value": "" }
        },
        "subtotal": {
            "width": 26, "visible": true,
            "header": { "cssClasses": "verticalHeader", "value": "<img src='/images/v2/vertColmnHeader_Subtotal.gif' alt='' />" }
        },
        "removeItem": {
            "width": 19, "visible": true,
            "header": { "cssClasses": "verticalHeader", "value": "<img src='/images/v2/vertColmnHeader_Removel.gif' alt='' />" }
        }
    },
    "gridMode": GridMode.initial
}

var GridUtil = new Object();
var GridController = new Object();

GridUtil.setGridMode = function(mode) {
    LayoutMeta.gridMode = mode;
}

GridUtil.getGridMode = function() {
    return LayoutMeta.gridMode;
}

GridUtil.getGridItemType = function() {
    switch (GridUtil.getGridMode()) {
        case GridMode.initial: return GridItemType.normal; break;
        case GridMode.preview: return GridItemType.readOnly; break;
        case GridMode.sender: return GridItemType.readOnly; break;
        case GridMode.recipient: return GridItemType.negotiateAmount; break;
    }
}

GridUtil.calculateDescriptionWidth = function() {
    var columnsWidth = 0;
    $.each(LayoutMeta.columns, function(key, value) {
        columnsWidth += value.visible ? value.width : 0;
    });
    LayoutMeta.columns.description.width = TOTAL_WIDTH - columnsWidth;
}

GridUtil.suffixIds = function() {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        subtotal.idSuffix = ++ID_SUFFIX;
        $.each(subtotal.lineItems, function(j, lineItem) {
            lineItem.idSuffix = ++ID_SUFFIX;
            if (lineItem.previous != null) {
                lineItem.previous.idSuffix = ++ID_SUFFIX;
            }
            else {
                lineItem.previous = null;
            }
            if (lineItem.historyItems != null) {
                $.each(lineItem.historyItems, function(k, lineItemHistory) {
                    lineItemHistory.idSuffix = ++ID_SUFFIX;
                });
            }
            else {
                lineItem.historyItems = new Array();
            }
        });
    });
}

GridUtil.findLineItemIndexById = function(ctrlId) {
    if (ctrlId == null) return null;
    var index = null;
    var idSuffix = parseInt(ctrlId.split("_")[1]);
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            if (lineItem.idSuffix == idSuffix) { index = j; return false; }
        });
        if (index != null) {
            index = i + "," + index;
            index = index.split(",");
            index[0] = parseInt(index[0]);
            index[1] = parseInt(index[1]);
            return false;
        }
    });
    return index;
}

GridUtil.findSubtotalIndexById = function(ctrlId) {
    if (ctrlId == null) return null;
    var index = null;
    var idSuffix = parseInt(ctrlId.split("_")[1]);
    $.each(financeMaster.subtotals, function(i, subtotal) {
        if (subtotal.idSuffix == idSuffix) {
            index = i;
            return false;
        }
    });
    return index;
}

GridUtil.paddZero = function(sequence) {
    var totalLineItems = GridUtil.totalLineItems();
    if (totalLineItems < 10) return '0' + sequence + '.';
    while (sequence.toString().length < totalLineItems.toString().length) sequence = '0' + sequence;
    return sequence + '.';
}

GridUtil.totalLineItems = function() {
    var totalLineItems = 0;
    $.each(financeMaster.subtotals, function(i, subtotal) {
        totalLineItems += subtotal.lineItems.length;
    });
    return totalLineItems;
}

GridUtil.initColumns = function() {
    switch (GridUtil.getGridMode()) {
        case GridMode.initial:            
            break;
        case GridMode.preview:
            LayoutMeta.columns.edit.visible = false;
            LayoutMeta.columns.subtotal.visible = false;
            LayoutMeta.columns.removeItem.visible = false;
            LayoutMeta.columns.seperator.visible = false;            
            $('#divAddNewItem').hide();
            break;
        case GridMode.sender:            
            LayoutMeta.columns.edit.visible = true;
            break;
        case GridMode.recipient:            
            LayoutMeta.columns.edit.visible = true;            
            break;
        default:
    }
}

GridUtil.init = function(mode) {
    GridUtil.setGridMode(mode);
    GridUtil.initColumns();
    GridUtil.calculateDescriptionWidth();
}

GridUtil.newSubtotal = function(visible) {
    return new Subtotal('', "Subtotal: ", 0.0, 0.0, 0.0, 0.0, visible, new Array(), ++ID_SUFFIX);
}

GridUtil.newLineItem = function() {
    return new LineItem('', null, null, null, 1, '', 0.0, 0, 0.0, 0.0, 0, 0, null, 0.0, ++ID_SUFFIX);
}

GridUtil.removeEmptySubtotal = function(i) {
    if (financeMaster.subtotals[i].lineItems.length == 0) {
        $('#divGridItemSubtotal' + "_" + financeMaster.subtotals[i].idSuffix).remove();
        financeMaster.subtotals.splice(i, 1);
    }
}

GridUtil.validateBillingData = function(sender, args) {
    var valid = false;

    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            if ((lineItem.description != null && !lineItem.description.blank()) || lineItem.unitPrice > 0) {
                valid = true;
                return;
            }
        });
    });

    args.IsValid = valid;
}

GridController.renderGridHeader = function() {
    var innerHTML = new Array();
    innerHTML.push('<ul class="gridHeader">');
    $.each(LayoutMeta.columns, function(key, value) {
        innerHTML.push(value.visible ? '<li class="' + value.header.cssClasses + '" style="width:' + value.width + 'px;">' + value.header.value + '</li>' : '');
    });
    innerHTML.push('</ul>');
    innerHTML.push('<div id="divHeaderSeparator" class="clearBoth"></div>');
    return innerHTML.join('');
}

GridController.renderAggregateItems = function() {
    var innerHTML = new Array();
    innerHTML.push('<ul class="agreegateItem" style="">');
    innerHTML.push('<li class="" style="width:' + (LayoutMeta.columns.quantity.width + LayoutMeta.columns.unitPrice.width) + 'px;"><div>Subtotal:</div></li>');
    innerHTML.push('<li class="totalColumn" style="width:' + LayoutMeta.columns.total.width + 'px;"><div class="currencySymbol">$</div><div id="divSubtotal" class="totalAmount">0.00</div></li>');
    if (LayoutMeta.columns.seperator.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.seperator.width + 'px;"></li>');
    if (LayoutMeta.columns.subtotal.visible && LayoutMeta.columns.removeItem.visible)
        innerHTML.push('<li class="" style="width:' + (LayoutMeta.columns.subtotal.width + LayoutMeta.columns.removeItem.width) + 'px;"></li>');
    innerHTML.push('</ul>');
    innerHTML.push('<div class="clearBoth gridItemSeparator"></div>');

    innerHTML.push('<ul class="agreegateItem agreegateItemTax">');
    innerHTML.push('<li class="taxColumn" style="width:' + (LayoutMeta.columns.quantity.width + LayoutMeta.columns.unitPrice.width) + 'px;"><div>Tax:</div><div class="percentSymbol">%</div><div class="taxRate">');
    if (LayoutMeta.gridMode == GridMode.initial) innerHTML.push('<input id="tbTaxRate" value="0.00" maxlength="5" type="text" />'); else innerHTML.push('<div id="divTaxRate" class="taxRate"></div>');
    innerHTML.push('</div></li>');
    innerHTML.push('<li class="totalColumn" style="width:' + LayoutMeta.columns.total.width + 'px;"><div class="currencySymbol">$</div><div id="divTax" class="totalAmount">0.00</div></li>');
    if (LayoutMeta.columns.seperator.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.seperator.width + 'px;"></li>');
    if (LayoutMeta.columns.subtotal.visible && LayoutMeta.columns.removeItem.visible)
        innerHTML.push('<li class="" style="width:' + (LayoutMeta.columns.subtotal.width + LayoutMeta.columns.removeItem.width) + 'px;"></li>');
    innerHTML.push('</ul>');

    innerHTML.push('<ul class="agreegateItem">');
    innerHTML.push('<li class="grandTotal" style="width:' + (LayoutMeta.columns.quantity.width + LayoutMeta.columns.unitPrice.width) + 'px;"><div>GRAND TOTAL:</div></li>');
    innerHTML.push('<li class="grandTotal totalColumn" style="width:' + LayoutMeta.columns.total.width + 'px;"><div class="currencySymbol">$</div><div id="divTotal" class="totalAmount">1,995.95</div></li>');
    if (LayoutMeta.columns.seperator.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.seperator.width + 'px;"></li>');
    if (LayoutMeta.columns.subtotal.visible && LayoutMeta.columns.removeItem.visible)
        innerHTML.push('<li class="" style="width:' + (LayoutMeta.columns.subtotal.width + LayoutMeta.columns.removeItem.width) + 'px;"></li>');
    innerHTML.push('</ul>');
    return innerHTML.join('');
}

GridController.renderGridItemSubtotal = function(subtotal, itemType) {
    var ctrlIndex = '_' + subtotal.idSuffix;
    var innerHTML = new Array();
    innerHTML.push('<div id="divGridItemSubtotal' + ctrlIndex + '" class="gridItemSubtotal gridItemNoScroll">');
    innerHTML.push('<ul>');
    if (LayoutMeta.columns.edit.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.edit.width + 'px;"></li>');
    if (LayoutMeta.columns.sequence.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.sequence.width + 'px;"></li>');
    if (LayoutMeta.columns.description.visible) {
        if (itemType == GridItemType.normal)
            innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.description.width + 'px;">' + GridController.renderTextBox('tbSubtotalName' + ctrlIndex, LayoutMeta.columns.description.width - 15, "", "") + '</li>');
        else
            innerHTML.push('<li class="subtotal" style="width:' + LayoutMeta.columns.description.width + 'px;">' + GridController.renderDiv('divSubtotalName' + ctrlIndex, LayoutMeta.columns.description.width - 15, "subtotalName", "") + '</li>');
    }
    if (LayoutMeta.columns.dateDuration.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.dateDuration.width + 'px;"></li>');
    if (LayoutMeta.columns.quantity.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.quantity.width + 'px;"></li>');
    if (LayoutMeta.columns.unitPrice.visible)
        innerHTML.push('<li class="unitPriceColumn" style="width:' + LayoutMeta.columns.unitPrice.width + 'px;"><div class="currencySymbol" style="display: none;">$</div>' + '</li>');
    if (LayoutMeta.columns.total.visible)
        innerHTML.push('<li class="totalColumn" style="width:' + LayoutMeta.columns.total.width + 'px;"><div class="currencySymbol">$</div><div id="divSubtotalTotal' + ctrlIndex + '" class="totalAmount">0.00</div></li>');
    if (LayoutMeta.columns.seperator.visible)
        innerHTML.push('<li style="width:' + LayoutMeta.columns.seperator.width + 'px;"></li>');
    if (LayoutMeta.columns.subtotal.visible)
        innerHTML.push('<li class="" style="width:' + LayoutMeta.columns.subtotal.width + 'px;"></li>');
    if (LayoutMeta.columns.removeItem.visible)
        innerHTML.push('<li class="subtotalAndRemoveColumn" style="width:' + LayoutMeta.columns.removeItem.width + 'px;"><img id="imgRemoveSubtotal' + ctrlIndex + '" src="/images/v2/bttn_remove_small.gif" /></li>');
    innerHTML.push('</ul><div class="clearBoth"></div></div>');
    return innerHTML.join('');
}

GridController.renderGridItem = function(lineItem, itemType) {
    var ctrlIndex = '_' + lineItem.idSuffix;
    var innerHTML = new Array();

    innerHTML.push('<div id="divGridItemCurrent' + ctrlIndex + '">');
    innerHTML.push('<ul>');
    if (itemType == GridItemType.edit) {
        innerHTML.push('<li class="changeColumn gridItemNoScroll" style="width:' + (LayoutMeta.columns.edit.width + LayoutMeta.columns.sequence.width) + 'px;">');
        if (itemType != GridItemType.archived && itemType != GridItemType.history) {
            innerHTML.push('<img id="imgSave' + ctrlIndex + '" src="/images/v2/bttn_save-small.gif" />');
        }
        innerHTML.push('</li>');
    }
    else {
        if (LayoutMeta.columns.edit.visible) {
            innerHTML.push('<li class="changeColumn gridItemNoScroll" style="width:' + LayoutMeta.columns.edit.width + 'px;">');
            if (itemType != GridItemType.history) {
                innerHTML.push('<img id="imgEdit' + ctrlIndex + '" src="/images/v2/bttn_Edit.gif" />');
            }
            innerHTML.push('</li>');
        }
        if (LayoutMeta.columns.sequence.visible) {
            innerHTML.push('<li class="sequenceColumn" style="width:' + LayoutMeta.columns.sequence.width + 'px;">');
            innerHTML.push('<div id="divSequence' + ctrlIndex + '"></div>');
            innerHTML.push('</li>');
        }
    }
    if (LayoutMeta.columns.description.visible) {
        if (itemType == GridItemType.readOnly || itemType == GridItemType.negotiateAmount || itemType == GridItemType.archived || itemType == GridItemType.history)
            innerHTML.push('<li class="description gridItemNoScroll" style="width:' + LayoutMeta.columns.description.width + 'px;">' + GridController.renderDiv("divDescription" + ctrlIndex, LayoutMeta.columns.description.width - 15, "", "") + '</li>');
        else
            innerHTML.push('<li class="gridItemNoScroll" style="width:' + LayoutMeta.columns.description.width + 'px;">' + GridController.renderTextBox("tbDescription" + ctrlIndex, LayoutMeta.columns.description.width - 15, "", "") + '</li>');
    }
    if (LayoutMeta.columns.dateDuration.visible) {
        if (itemType == GridItemType.readOnly || itemType == GridItemType.negotiateAmount || itemType == GridItemType.archived || itemType == GridItemType.history)
            innerHTML.push('<li class="gridItemNoScroll" style="width:' + LayoutMeta.columns.dateDuration.width + 'px;">' + GridController.renderDiv("divDateDuration" + ctrlIndex, LayoutMeta.columns.dateDuration.width - 15, "", "05/05/2010") + '</li>');
        else
            innerHTML.push('<li class="gridItemNoScroll" style="width:' + LayoutMeta.columns.dateDuration.width + 'px;">' + GridController.renderTextBox("tbDateDuration" + ctrlIndex, LayoutMeta.columns.dateDuration.width - 15, "fdcal2", "05/05/2010") + '</li>');
    }
    if (LayoutMeta.columns.quantity.visible) {
        if (itemType == GridItemType.readOnly || itemType == GridItemType.negotiateAmount || itemType == GridItemType.archived || itemType == GridItemType.history)
            innerHTML.push('<li class="quantity gridItemNoScroll" style="width:' + LayoutMeta.columns.quantity.width + 'px;">' + GridController.renderDiv("divQuantity" + ctrlIndex, LayoutMeta.columns.quantity.width - 15, "digitBox", "1") + '</li>');
        else
            innerHTML.push('<li class="gridItemNoScroll" style="width:' + LayoutMeta.columns.quantity.width + 'px;">' + GridController.renderTextBox("tbQuantity" + ctrlIndex, LayoutMeta.columns.quantity.width - 15, "digitBox", "1") + '</li>');
    }
    if (LayoutMeta.columns.unitPrice.visible) {
        if (itemType == GridItemType.readOnly || itemType == GridItemType.archived || itemType == GridItemType.history)
            innerHTML.push('<li class="unitPriceColumn gridItemNoScroll" style="width:' + LayoutMeta.columns.unitPrice.width + 'px;"><div class="currencySymbol">$</div>' + GridController.renderDiv("divUnitPrice" + ctrlIndex, LayoutMeta.columns.unitPrice.width - 25, "unitPrice digitBox", "") + '</li>');
        else
            innerHTML.push('<li class="unitPriceColumn gridItemNoScroll" style="width:' + LayoutMeta.columns.unitPrice.width + 'px;"><div class="currencySymbol">$</div>' + GridController.renderTextBox("tbUnitPrice" + ctrlIndex, LayoutMeta.columns.unitPrice.width - 25, "digitBox inputUnitPrice", "") + '</li>');
    }
    if (LayoutMeta.columns.total.visible)
        innerHTML.push('<li class="totalColumn" style="width:' + LayoutMeta.columns.total.width + 'px;"><div class="currencySymbol">$</div><div id="divLineItemTotal' + ctrlIndex + '" class="totalAmount">0.00</div></li>');
    if (LayoutMeta.columns.seperator.visible)
        innerHTML.push('<li style="width:' + LayoutMeta.columns.seperator.width + 'px;" class="gridItemNoScroll"></li>');
    if (LayoutMeta.columns.subtotal.visible) {
        innerHTML.push('<li class="subtotalAndRemoveColumn gridItemNoScroll" style="width:' + LayoutMeta.columns.subtotal.width + 'px;">');
        if (itemType != GridItemType.archived && itemType != GridItemType.history && itemType != GridItemType.edit)
            innerHTML.push('<img id="imgSubtotal' + ctrlIndex + '" src="/images/v2/bttn_subTotal.gif" />');
        innerHTML.push('</li>');
    }
    if (LayoutMeta.columns.removeItem.visible) {
        innerHTML.push('<li class="subtotalAndRemoveColumn gridItemNoScroll" style="width:' + LayoutMeta.columns.removeItem.width + 'px;">');
        if (itemType != GridItemType.archived && itemType != GridItemType.history)
            innerHTML.push('<img id="imgRemoveItem' + ctrlIndex + '" src="/images/v2/bttn_remove_small.gif" />');
        innerHTML.push('</li>');
    }
    innerHTML.push('</ul></div>');
    return innerHTML.join('');
}

GridController.renderGridItemContainer = function(lineItem, itemType) {
    var ctrlIndex = '_' + lineItem.idSuffix;
    var innerHTML = new Array();
    innerHTML.push('<div id="divGridItem' + ctrlIndex + '" class="gridItem">');
    if (itemType != GridItemType.normal) {
        innerHTML.push(GridController.renderHistoryItems(lineItem));
        if (lineItem.previous != null) innerHTML.push(GridController.renderGridItem(lineItem.previous, GridItemType.archived));
    }
    innerHTML.push(GridController.renderGridItem(lineItem, itemType));
    innerHTML.push('<div class="clearBoth"></div></div>');
    return innerHTML.join('');
}

GridController.renderHistoryItems = function(lineItem) {
    var ctrlIndex = '_' + lineItem.idSuffix;
    var innerHTML = new Array();
    var display = lineItem.historyItems.length > 0 ? '' : 'display: none;';

    innerHTML.push('<div id="divViewHistory' + ctrlIndex + '" class="viewHistory" style="' + display + '">View History</div>');
    innerHTML.push('<div id="divGridItemsHistory' + ctrlIndex + '" style="display: none;">');
    $.each(lineItem.historyItems, function(index, historyItem) {
        innerHTML.push(GridController.renderGridItem(historyItem, GridItemType.history));
    });
    innerHTML.push('</div>');

    return innerHTML.join('');
}

GridController.renderTextBox = function(id, width, cssClasses, value) {
    return '<input id="' + id + '" type="text" value="' + value + '" class="' + cssClasses + '" style="width:' + width + 'px;" AutoComplete="off" />';
}

GridController.renderDiv = function(id, width, cssClasses, value) {
    return '<div id="' + id + '" type="text" class="' + cssClasses + '" style="width:' + width + 'px;">' + value + '</div>';
}

GridController.appendGridHeader = function() {
    $(GridController.renderGridHeader()).appendTo($('#divFormGrid'));
}

GridController.appendGridItemContainer = function(lineItem, gridType) {
    var gridItemContainer = $(GridController.renderGridItemContainer(lineItem, gridType)).appendTo($('#divFormGrid'));
    $('#tbDateDuration_' + lineItem.idSuffix).datepicker();
    return gridItemContainer;
}

GridController.appendGridItemContainers = function(itemType) {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            GridController.appendGridItemContainer(lineItem, itemType);
        });
        if (subtotal.visible) $(GridController.renderGridItemSubtotal(subtotal, itemType)).appendTo($('#divFormGrid'));
    });
}

GridController.appendAggregateItems = function() {
    $(GridController.renderAggregateItems()).appendTo($('#divAggregateItems'));
}

GridController.insertSubtotal = function(subtotal, itemType, ctrlIndex) {    
    $(GridController.renderGridItemSubtotal(subtotal, itemType)).insertAfter('#divGridItem' + ctrlIndex).hide().slideDown(100);
}

GridController.appendGrid = function(itemType) {
    GridController.appendGridHeader();
    GridController.appendGridItemContainers(itemType);
    GridController.appendAggregateItems();
}

GridController.newLineItem = function() {
    var lineItem = GridUtil.newLineItem();
    var i = financeMaster.subtotals.length - 1;
    var j = 0;
    var ctrlIndex = "_" + lineItem.idSuffix;

    if (i == -1 || financeMaster.subtotals[i].visible) { // If there is no subtotal or last subtotal is visible
        var subtotal = GridUtil.newSubtotal(false);
        subtotal.lineItems.push(lineItem);
        financeMaster.subtotals.push(subtotal);
        i++;
    }
    else {
        financeMaster.subtotals[i].lineItems.push(lineItem);
        j = financeMaster.subtotals[i].lineItems.length - 1;
    }

    GridController.appendGridItemContainer(lineItem, GridItemType.normal);
    GridController.bindRemoveLineItemEvent(lineItem.idSuffix);
    GridController.bindSubtotalEvent(lineItem.idSuffix);
    GridController.bindLineItemChangeEvents(lineItem.idSuffix);
    GridController.updateSequenceNumber();
    GridController.updateLineItem(lineItem);
    $('#imgEdit_' + lineItem.idSuffix).fadeTo(0, 0.4);
}

GridController.bindRemoveLineItemEvent = function(idSuffix) {
    var ctrlIndex = "_" + idSuffix;
    $('#imgRemoveItem' + ctrlIndex).click(function() {
        var index = GridUtil.findLineItemIndexById(this.id);
        if (index != null) {
            financeMaster.subtotals[index[0]].lineItems.splice(index[1], 1);
            GridUtil.removeEmptySubtotal(index[0]);
            $('#divGridItem' + ctrlIndex).slideUp(100, function() { $('#divGridItem' + ctrlIndex).remove(); });
            GridController.updateSequenceNumber();
        }
        GridController.calculateAndUpdateTotals();
    });
}

GridController.bindRemoveSubtotalEvent = function(idSuffix) {
    var ctrlIndex = "_" + idSuffix;
    $('#imgRemoveSubtotal' + ctrlIndex).click(function() {
        var index = GridUtil.findSubtotalIndexById(this.id);
        if (index != null) {
            if (financeMaster.subtotals.length == (index + 1)) {
                financeMaster.subtotals[index].visible = false;
            }
            else {
                $.each(financeMaster.subtotals[index].lineItems.reverse(), function(i, lineItem) {
                    financeMaster.subtotals[index + 1].lineItems.unshift(lineItem);
                });
                financeMaster.subtotals.splice(index, 1);
            }
            $('#divGridItemSubtotal' + ctrlIndex).slideUp(100, function() { $('#divGridItemSubtotal' + ctrlIndex).remove(); });
            GridController.calculateAndUpdateTotals();
        }
    });
}

GridController.bindRemoveEvents = function() {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            GridController.bindRemoveLineItemEvent(lineItem.idSuffix);
        });
        GridController.bindRemoveSubtotalEvent(subtotal.idSuffix);
    });
}

GridController.bindSubtotalEvent = function(idSuffix) {
    var ctrlIndex = "_" + idSuffix;
    $('#imgSubtotal' + ctrlIndex).click(function() {
        var index = GridUtil.findLineItemIndexById(this.id);
        if (index != null) {
            if (financeMaster.subtotals[index[0]].lineItems.length == (index[1] + 1)) {
                if (!financeMaster.subtotals[index[0]].visible) {
                    financeMaster.subtotals[index[0]].visible = true;
                    GridController.insertSubtotal(financeMaster.subtotals[index[0]], GridItemType.normal, ctrlIndex);
                    GridController.bindRemoveSubtotalEvent(financeMaster.subtotals[index[0]].idSuffix);
                    GridController.bindSubtotalChangeEvents(financeMaster.subtotals[index[0]].idSuffix);
                }
                else {
                    return;
                }
            }
            else {
                var subtotal = GridUtil.newSubtotal(true);
                $.each(financeMaster.subtotals[index[0]].lineItems, function(_i, lineItem) {
                    subtotal.lineItems.push($.extend({}, lineItem));                    
                    if (index[1] == _i) return false;
                });
                financeMaster.subtotals[index[0]].lineItems.splice(0, index[1] + 1);
                financeMaster.subtotals.splice(index[0], 0, subtotal);
                GridController.insertSubtotal(subtotal, GridItemType.normal, ctrlIndex);
                GridController.bindRemoveSubtotalEvent(subtotal.idSuffix);
                GridController.bindSubtotalChangeEvents(subtotal.idSuffix);
            }
            GridController.calculateAndUpdateTotals();
        }
    });
}

GridController.bindSubtotalEvents = function() {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            GridController.bindSubtotalEvent(lineItem.idSuffix);
        });
    });
}

GridController.bindEditEvent = function(idSuffix) {
    $('#imgEdit_' + idSuffix).click(function() {
        var index = GridUtil.findLineItemIndexById(this.id);
        var lineItem = financeMaster.subtotals[index[0]].lineItems[index[1]];
        var lineItemArchived = $.extend({}, lineItem);
        var lineItemHistory = null;

        lineItemArchived.idSuffix = ++ID_SUFFIX;
        if (lineItem.previous != null) {
            lineItemHistory = $.extend({}, lineItem.previous);
            lineItem.historyItems.push(lineItemHistory);
        }
        lineItem.previous = lineItemArchived;
        if (lineItemHistory != null) {
            $('#divGridItemCurrent_' + lineItemHistory.idSuffix).replaceWith(GridController.renderGridItem(lineItemArchived, GridItemType.archived));
            $(GridController.renderGridItem(lineItemHistory, GridItemType.history)).insertBefore('#divGridItemCurrent_' + lineItemArchived.idSuffix).fadeTo(500, 0.6).addClass('historyItem');
            $('#divGridItemCurrent_' + lineItemArchived.idSuffix).fadeTo(500, 0.6);
        }
        else {
            $(GridController.renderGridItem(lineItemArchived, GridItemType.archived)).insertBefore('#divGridItemCurrent_' + lineItem.idSuffix).fadeTo(500, 0.6);
        }
        $('#divGridItemCurrent_' + lineItem.idSuffix).remove();
        $(GridController.renderGridItem(lineItem, GridItemType.edit)).insertAfter('#divGridItemCurrent_' + lineItemArchived.idSuffix).hide().slideDown(100);
        GridController.bindSaveEvent(lineItem.idSuffix);
        GridController.bindCancelSaveEvent(lineItem.idSuffix);
        GridController.bindLineItemChangeEvents(lineItem.idSuffix);
        GridController.updateLineItem(lineItem);
        GridController.updateSequenceNumber();
    });
}

GridController.bindEditEvents = function() {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            GridController.bindEditEvent(lineItem.idSuffix);
        });
    });
}

GridController.bindSaveEvent = function(idSuffix) {
    $('#imgSave_' + idSuffix).click(function() {
        var index = GridUtil.findLineItemIndexById(this.id);
        var lineItem = financeMaster.subtotals[index[0]].lineItems[index[1]];
        $('#imgEdit_' + lineItem.previous.idSuffix).hide();
        $('#divGridItemCurrent_' + lineItem.previous.idSuffix).addClass('historyItem');
        $('#divGridItemCurrent_' + lineItem.idSuffix).replaceWith(GridController.renderGridItem(lineItem, GridUtil.getGridItemType()));

        if (lineItem.historyItems.length > 0) {
            var divHistory = $('#divGridItemCurrent_' + lineItem.historyItems[lineItem.historyItems.length - 1].idSuffix).fadeTo(0, 1.0).detach();
            $('#divViewHistory_' + lineItem.idSuffix).show();
            $('#divGridItemsHistory_' + lineItem.idSuffix).append(divHistory);
        }

        GridController.bindRemoveLineItemEvent(lineItem.idSuffix);
        GridController.bindSubtotalEvent(lineItem.idSuffix);
        GridController.bindEditEvent(lineItem.idSuffix);
        GridController.updateLineItem(lineItem);
        GridController.updateSequenceNumber();
    });
}

GridController.bindCancelSaveEvent = function(idSuffix) {
    $('#imgRemoveItem_' + idSuffix).click(function() {
        var index = GridUtil.findLineItemIndexById(this.id);
        var lineItem = financeMaster.subtotals[index[0]].lineItems[index[1]];
        $('#divGridItemCurrent_' + lineItem.previous.idSuffix).remove();
        var originalIdSuffix = lineItem.idSuffix;
        lineItem = lineItem.previous;
        lineItem.idSuffix = originalIdSuffix;
        lineItem.previous = null;        

        $('#divGridItemCurrent_' + lineItem.idSuffix).replaceWith(GridController.renderGridItem(lineItem, GridUtil.getGridItemType()));

        financeMaster.subtotals[index[0]].lineItems[index[1]] = lineItem;

        GridController.bindRemoveLineItemEvent(lineItem.idSuffix);
        GridController.bindSubtotalEvent(lineItem.idSuffix);
        GridController.bindEditEvent(lineItem.idSuffix);
        GridController.updateLineItem(lineItem);
        GridController.updateSequenceNumber();
    });
}

GridController.bindLineItemChangeEvents = function(idSuffix) {
    $.each(LayoutMeta.columns, function(key, value) {
        if (value.idPrefix == null) return true;
        $('#' + value.idPrefix + '_' + idSuffix).change(function() {
            var index = GridUtil.findLineItemIndexById(this.id);
            var lineItem = financeMaster.subtotals[index[0]].lineItems[index[1]];

            switch (key) {
                case "quantity":
                    lineItem[key] = this.value.parseQty();
                    break;
                case "unitPrice":
                    lineItem[key] = this.value.parseFloat();
                    break;
                default:
                    lineItem[key] = this.value;
                    break;
            }
            Calculator.calculate();
            GridController.updateLineItem(lineItem);
            GridController.updateSubtotals();
            GridController.updateAggregates();
        });
    });
}

GridController.bindSubtotalChangeEvents = function(idSuffix) {
    $('#tbSubtotalName_' + idSuffix).bind('change blur', function() {
        var index = GridUtil.findSubtotalIndexById(this.id);
        var subtotal = financeMaster.subtotals[index];
        subtotal.name = this.value;
    });
}

GridController.bindChangeEvents = function(i, j) {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            GridController.bindLineItemChangeEvents(lineItem.idSuffix);
        });
        GridController.bindSubtotalChangeEvents(subtotal.idSuffix);
    });

    $('#tbTaxRate').change(function() {
        financeMaster.taxRate = this.value.parseFloat();
        GridController.calculateAndUpdateAggregates();
    });
}

GridController.bindViewHistoryEvents = function(i, j) {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            $('#divViewHistory_' + lineItem.idSuffix).click(function() {
                if ($('#divGridItemsHistory_' + lineItem.idSuffix).is(':visible')) {
                    $('#divGridItemsHistory_' + lineItem.idSuffix).hide();
                    $(this).removeClass('viewHistoryExpanded');
                }
                else {
                    $('#divGridItemsHistory_' + lineItem.idSuffix).fadeTo(0, 0.6).addClass('historyItem');
                    $(this).addClass('viewHistoryExpanded');
                }
            });
        });
    });
}

GridController.bindEvents = function(bind) {
    if (!bind) return;
    GridController.bindRemoveEvents();
    GridController.bindSubtotalEvents();
    GridController.bindEditEvents();
    GridController.bindChangeEvents();
    GridController.bindViewHistoryEvents();
}

/*
    Region Start - Update Controls Section.
*/

GridController.morphControls = function() {
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            if (lineItem.previous != null) {
                $('#divGridItemCurrent_' + lineItem.previous.idSuffix).fadeTo(0, 0.6).addClass('historyItem');
                $('#imgEdit_' + lineItem.previous.idSuffix).hide();
            } 
        });
    });
}

/*
    Region Start - Update Controls Section.
*/

GridController.clearForm = function() {
    if (!confirm('Warning!\n\nThe form data is going to be reset. Press OK, if you are sure.')) return;

    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            lineItem.quantity = 1;
            lineItem.description = null;
            lineItem.unitPrice = 0.0;
            lineItem.date = null;
        });
        subtotal.name = 'Subtotal: ';
    });

    financeMaster.taxRate = 0.0;
    financeMaster.interestRate = 0.0;

    Calculator.calculate();
    GridController.updateControls();
}

var defaultUnitPriceWidth = LayoutMeta.columns.unitPrice.width - 25;
GridController.updateCurrencySymbol = function() {
    var widthReduction = 5 * (parseInt(crncySymbl.length) - 1);    
    if (widthReduction == 0 && ($('.inputUnitPrice').width() != defaultUnitPriceWidth)) {
        $('.inputUnitPrice').width(defaultUnitPriceWidth);
    }
    else if ($('.inputUnitPrice').width() != (defaultUnitPriceWidth - widthReduction)) {
        $('.inputUnitPrice').width(defaultUnitPriceWidth - widthReduction);
    }
    $('.currencySymbol').html(crncySymbl);
}

GridController.updateSequenceNumber = function() {
    var sequenceNumber = 0;
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            $('#divSequence' + "_" + lineItem.idSuffix).html(GridUtil.paddZero(++sequenceNumber));
            if (lineItem.previous != null) {
                $('#divSequence' + "_" + lineItem.previous.idSuffix).html(GridUtil.paddZero(sequenceNumber));
            }
            $.each(lineItem.historyItems, function(k, historyItem) {
                $('#divSequence' + "_" + historyItem.idSuffix).html(GridUtil.paddZero(sequenceNumber));
            });
        });
    });
}

GridController.updateLineItem = function(lineItem) {    
    if (lineItem.previous != null) GridController.updateLineItem(lineItem.previous);
    var idSuffix = "_" + lineItem.idSuffix;
    $('#divDescription' + idSuffix).html(lineItem.description);
    $('#tbDescription' + idSuffix).val(lineItem.description);
    $('#divQuantity' + idSuffix).html(lineItem.quantity);
    $('#tbQuantity' + idSuffix).val(lineItem.quantity);
    $('#divUnitPrice' + idSuffix).html(FDUtil.formatCurrency(lineItem.unitPrice));
    $('#tbUnitPrice' + idSuffix).val(FDUtil.formatCurrency(lineItem.unitPrice));
    $('#divLineItemTotal' + idSuffix).html(FDUtil.formatCurrency(lineItem.total));
    //if (GridUtil.getGridMode() == GridMode.initial) $('#imgEdit' + idSuffix).fadeTo(0, 0.3);
}

GridController.updateLineItems = function() {
    GridController.updateSequenceNumber();
    $.each(financeMaster.subtotals, function(i, subtotal) {
        $.each(subtotal.lineItems, function(j, lineItem) {
            GridController.updateLineItem(lineItem);
            $.each(lineItem.historyItems, function(k, historyItem) {
                GridController.updateLineItem(historyItem);
            });
        });
    });
}

GridController.updateSubtotals = function() {
    var idSuffix;
    $.each(financeMaster.subtotals, function(i, subtotal) {
        idSuffix = "_" + subtotal.idSuffix;        
        $('#divSubtotalName' + idSuffix).html(subtotal.name);
        $('#tbSubtotalName' + idSuffix).val(subtotal.name);        
        $('#divSubtotalTotal' + idSuffix).html(FDUtil.formatCurrency(subtotal.total));
    });
}

GridController.updateAggregates = function() {
    $('#divSubtotal').html(FDUtil.formatCurrency(financeMaster.subTotal));
    $('#tbTaxRate').val(FDUtil.formatCurrency(financeMaster.taxRate));
    $('#divTaxRate').html(FDUtil.formatCurrency(financeMaster.taxRate));
    $('#divTax').html(FDUtil.formatCurrency(financeMaster.tax));
    $('#divTotal').html(FDUtil.formatCurrency(financeMaster.total));
}

GridController.updateControls = function() {
    GridController.updateCurrencySymbol();
    GridController.updateLineItems();
    GridController.updateSubtotals();
    GridController.updateAggregates();
    GridController.morphControls();
}

/*
    Region End - Update Controls Section.
*/

/*
    Region Start - Calculator object
*/

var Calculator = new Object;
Calculator.calculate = function() {
    financeMaster.subTotal = 0.0;
    financeMaster.interest = 0.0;
    financeMaster.tax = 0.0;
    financeMaster.total = 0.0;
    var interestRate;

    if (financeMaster.subtotals != null) {
        $.each(financeMaster.subtotals, function(i, subtotal) {
            subtotal.total = 0.0;
            subtotal.interest = 0.0;
            subtotal.tax = 0.0;
            subtotal.endTotal = 0.0;

            $.each(subtotal.lineItems, function(j, lineItem) {
                lineItem.total = 0.0;
                lineItem.interest = 0.0;
                lineItem.tax = 0.0;
                lineItem.endTotal = 0.0;

                lineItem.total = (lineItem.quantity > 0) ? lineItem.quantity * lineItem.unitPrice : 0;
                lineItem.total = NumberUtil.roundDecimals(lineItem.total, 2);
                subtotal.total += lineItem.total;

                var interestRate = (lineItem.interestRate > 0) ? lineItem.interestRate : financeMaster.interestRate;
                if (interestRate > 0) {
                    if (fastdueForm == FastDueForms.Pastdue && lineItem.total > 0) {
                        lineItem.interest = (isDate(lineItem.interestDate, 'MM/dd/y') == true)
							? FDUtil.findInterest(parseDate(lineItem.interestDate), parseDate(financeMaster.formDate), lineItem.total, interestRate)
							: FDUtil.findInterest(parseDate(lineItem.date), parseDate(financeMaster.formDate), lineItem.total, interestRate);
                    }
                    else {
                        /*
                        lineItem.interest = (isDate(lineItem.interestDate, 'MM/dd/y') == true)
                        ? FDUtil.findInterest(parseDate(financeMaster.formDate), parseDate(lineItem.interestDate), lineItem.total, interestRate)
                        : FDUtil.findInterest(parseDate(financeMaster.formDate), parseDate($F('tbInvoiceDueDate')), lineItem.total, interestRate);
                        */
                        lineItem.interest = 0.0;
                    }

                    lineItem.interest = (isNaN(lineItem.interest) || !isFinite(lineItem.interest)) ? 0.0 : NumberUtil.roundDecimals(lineItem.interest, 2);
                    if (lineItem.interest > 0) { lineItem.interest -= lineItem.total; }
                }
                subtotal.interest += lineItem.interest;

                lineItem.tax = (lineItem.taxRate > 0) ? lineItem.total * (lineItem.taxRate / 100) : lineItem.total * (financeMaster.taxRate / 100);
                lineItem.tax = NumberUtil.roundDecimals(lineItem.tax, 2);
                subtotal.tax += lineItem.tax;

                lineItem.endTotal = lineItem.tax + lineItem.interest + lineItem.total;
                subtotal.endTotal += lineItem.endTotal;
            });

            financeMaster.subTotal += subtotal.total;
            financeMaster.interest += subtotal.interest;
            financeMaster.tax += subtotal.tax;
            financeMaster.total = financeMaster.interest + financeMaster.tax + financeMaster.subTotal;
        });
    }
    if (financeMaster.total > 99999999.99) alert('Total amount too big');
}

/*
    Region End - Calculator object
*/

GridController.validateRequired = function() {
    return true;
}

GridController.calculateAndUpdateLineItems = function() {
    Calculator.calculate();
    GridController.updateLineItems();
}

GridController.calculateAndUpdateTotals = function() {
    Calculator.calculate();
    GridController.updateSubtotals();
    GridController.updateAggregates();
}

GridController.calculateAndUpdateAggregates = function() {
    Calculator.calculate();    
    GridController.updateAggregates();
}

GridController.calculateAndUpdateAll = function() {
    Calculator.calculate();
    GridController.updateControls();
}

GridController.init = function(gridMode) {
    GridUtil.init(gridMode);
    Calculator.calculate();
    GridController.appendGrid(GridUtil.getGridItemType());
    GridController.updateControls();
    GridController.bindEvents(GridUtil.getGridMode() != GridMode.preview);
}

/*
    Region Start - JQuery Sortable config
*/

$(function() {
    $("#divFormGrid").sortable({
        cancel: '.gridItemNoScroll',
        cursor: 'move',
        update: function(event, ui) {
            var index = GridUtil.findLineItemIndexById(ui.item.attr('id'));
            var siblingIndex = GridUtil.findLineItemIndexById(ui.item.next().attr('id'));
            if (siblingIndex == null) { // If a line item was dragged at the end of a subtotal then get previous sibling
                siblingIndex = GridUtil.findLineItemIndexById(ui.item.prev().attr('id'));
                if (siblingIndex == null) { // if line item has no siblings
                    var subtotal = GridUtil.newSubtotal(false);
                    subtotal.lineItems.push($.extend({}, financeMaster.subtotals[index[0]].lineItems[index[1]]));
                    financeMaster.subtotals.push(subtotal);
                    financeMaster.subtotals[index[0]].lineItems.splice(index[1], 1);

                    GridUtil.removeEmptySubtotal(index[0]);
                    GridController.updateSequenceNumber();
                    GridController.calculateAndUpdateTotals();
                    return;
                }
                siblingIndex[1]++;
            }
            var lineItem = $.extend({}, financeMaster.subtotals[index[0]].lineItems[index[1]]);
            //lineItem.encryptedId = '';
            // If item is moved on top an item within same section then increment original index to main position (since new item is pushed on top)
            if (index[0] == siblingIndex[0] && index[1] > siblingIndex[1]) index[1]++;

            financeMaster.subtotals[siblingIndex[0]].lineItems.splice(siblingIndex[1], 0, lineItem); // Add item to its newly dragged position
            financeMaster.subtotals[index[0]].lineItems.splice(index[1], 1); // Remove item from its old index
            GridUtil.removeEmptySubtotal(index[0]);
            GridController.updateSequenceNumber();
            GridController.calculateAndUpdateTotals();
        },
        start: function(event, ui) {
            ui.item.addClass('gridItemDragging');
        },
        stop: function(event, ui) {
            ui.item.removeClass('gridItemDragging');
        },
        placeholder: 'sortPlaceHolder'

    });

    //$("#divFormGrid div").disableSelection();
});

/*
    Region End - JQuery Sortable config
*/

var QnaItemType = { "draft": 0, "respond": 1, "readOnly": 2 };
var QnaController = new Object();

QnaController.renderQnaItem = function(qna, index, itemType) {
    var ctrlIndex = "_" + index;
    var innerHTML = new Array();

    innerHTML.push('<div id="divQuestion' + ctrlIndex + '">');
    innerHTML.push('<ul>');
    innerHTML.push('<li class="questionNo"><div id="divSeq'  + ctrlIndex + '"></div></li>');
    innerHTML.push('<li class="question"><input id="tbQuestion' + ctrlIndex + '" type="text" /></li>');
    innerHTML.push('<li class="yesNo"><input id="rbYes' + ctrlIndex + '" type="radio" name="groupYesNo' + ctrlIndex + '" /></li>');
    innerHTML.push('<li class="yesNo"><input id="rbNo' + ctrlIndex + '" type="radio" name="groupYesNo' + ctrlIndex + '" /></li>');
    innerHTML.push('<li class="answer"><input id="tbAnswer' + ctrlIndex + '" type="text" /></li>');
    innerHTML.push('<li class="remove"><img id="imgRemoveQuestion' + ctrlIndex + '" src="/images/v2/bttn_remove_larger_lgt-blue-bckgrnd.gif" alt="" /></li>');
    innerHTML.push('</ul>');
    innerHTML.push('<div class="clearBoth"></div></div>');

    return innerHTML.join('');
}

QnaController.appendQna = function(qna, index, itemType) {
    $(QnaController.renderQnaItem(qna, index, itemType)).appendTo($("#divPartyQuestions"));    
}

QnaController.appendQnas = function(itemType) {
    $.each(qnas, function(i, qna) {
        QnaController.appendQna(qna, i, itemType);
    });
}

QnaController.newQna = function() {
    var qna = new Qna('', '', null, '');
    qnas.push(qna);
    var index = qnas.length - 1;
    QnaController.appendQna(qna, index);
    QnaController.bindRemoveQna(index);
    QnaController.bindChangeAndClickEvents(index);
    QnaController.transformQnaControls(index);
    QnaController.updateSequenceNumber();
}

QnaController.updateQna = function(qna, index) {
    var ctrlIndex = "_" + index;
    $("#tbQuestion" + ctrlIndex).val(qna.question);
    $("#tbAnswer" + ctrlIndex).val(qna.answer);
    if (qna.yesNo != null) {
        if (qna.yesNo) $("#rbYes" + ctrlIndex).attr("checked", "checked"); else $("#rbNo" + ctrlIndex).attr("checked", "checked");
    }
    $("#tbAnswer" + ctrlIndex).attr("disabled", "disbaled"); 
}

QnaController.transformQnaControls = function(index) {
    var ctrlIndex = "_" + index;
    
    $("#tbAnswer" + ctrlIndex).attr("disabled", "disabled");
    $("#rbYes" + ctrlIndex).attr("disabled", "disabled");
    $("#rbNo" + ctrlIndex).attr("disabled", "disabled");

    $("#tbAnswer" + ctrlIndex).fadeTo(0, 0.4);
    $("#rbYes" + ctrlIndex).fadeTo(0, 0.4);
    $("#rbNo" + ctrlIndex).fadeTo(0, 0.4);
    //$("#imgRemoveQuestion" + ctrlIndex).fadeTo(0, 0.4);
}

QnaController.updateQnas = function() {
    $.each(qnas, function(i, qna) {
        QnaController.updateQna(qna, i);
        QnaController.transformQnaControls(i);
    });
    QnaController.updateSequenceNumber();
}

QnaController.bindRemoveQna = function(index) {
    var ctrlIndex = "_" + index;
    $('#imgRemoveQuestion' + ctrlIndex).click(function() {
        $('#divQuestion' + ctrlIndex).slideUp(100, function() { $('#divQuestion' + ctrlIndex).remove(); });
        qnas[index] = null;
        QnaController.updateSequenceNumber();
    });
}

QnaController.bindChangeAndClickEvents = function(index) {
    var ctrlIndex = "_" + index;
    $('#tbQuestion' + ctrlIndex).change(function() { qnas[index].question = this.value; });
    $('#tbAnswer' + ctrlIndex).change(function() { qnas[index].answer = this.value; });
    $('#rbYes' + ctrlIndex).click(function() { qnas[index].yesNo = true; });
    $('#rbNo' + ctrlIndex).click(function() { qnas[index].yesNo = false; });
}

QnaController.bindEvents = function() {
    $.each(qnas, function(i, qna) {
        QnaController.bindRemoveQna(i);
        QnaController.bindChangeAndClickEvents(i);
    });
}

QnaController.updateSequenceNumber = function() {
    var sequenceNumber = 0;
    $.each(qnas, function(i, qna) {
        if (qna != null) $('#divSeq' + "_" + i).html(GridUtil.paddZero(++sequenceNumber));        
    });
}

QnaController.init = function() {
    QnaController.appendQnas();
    QnaController.updateQnas();
    QnaController.bindEvents();
}

