﻿var lang = $.cookie('hl'); //.split('-', 1)[0]; lang = (lang == 'en') ? '' : lang;

if (LILIUM == undefined) var LILIUM = {};

/************************** HELPER FNC **************************/

function error(text) {
    $.pnotify({ pnotify_title: LILIUM.errorTitle, pnotify_text: text, pnotify_type: 'error', pnotify_history: false });
}

function success(text) {
    $.pnotify({ pnotify_title: LILIUM.successTitle, pnotify_text: text, pnotify_type: 'success', pnotify_history: false });
}

String.format = function () {
    var s = arguments[0], reg, i;

    for (i = 0; i < arguments.length - 1; i++) {
        reg = new RegExp("\\{" + i + "\\}", "gm");
        s = s.replace(reg, arguments[i + 1]);
    }

    return s;
};

String.prototype.endsWith = function (suffix) {
    return (this.substr(this.length - suffix.length) === suffix);
};

String.prototype.startsWith = function (prefix) {
    return (this.substr(0, prefix.length) === prefix);
};

function selectOptionValue(selectItems, value) {
    var text = value;

    if (value === null || value.toString() === "") {
        return text;
    }

    var key;
    for (key in selectItems) {
        if (selectItems[key].Value === value.toString()) {
            text = selectItems[key].Text;
            break;
        }
    }

    return text;
}

function messageStateFormatter(selectItems, value) {
    var text = selectOptionValue(selectItems, value);

    /* 0-Queued, 5-Receiving, 1-Sent, 3-Sending,  2-Canceled, 4-Invalid,  6-Debt */
    var color = "#222222";

    if (value === 0 || value === 5) {
        color = "#058DC7";
    }
    else if (value === 1) {
        color = "#50B432";
    }
    else if (value === 3) {
        color = "#c0c0c0";
    }
    else if (value === 2 || value === 4 || value === 6) {
        color = "#ED561B";
    }

    return $("<span />").attr("style", "color:" + color).text(text);
}

function dlrStateFormatter(selectItems, value) {
    var text = selectOptionValue(selectItems, value);

    /*Scheduled = 0, Enroute = 1, Delivered = 2,Expired = 3, Deleted = 4, Undeliverable = 5, Accepted = 6, Unknown = 7, Rejected = 8, Skipped = 9,*/
    var color;

    if (value === 0) {
        color = "#222222";
    }
    else if (value === 1) {
        color = "silver";
    }
    else if (value === 2) {
        color = "#50B432";
    }
    else {
        color = "#ED561B";
    }

    return $("<span />").attr("style", "color:" + color).text(text);
}
/************************** END HELPER FNC **************************/


/************************** HTML HELPER **************************/

function buildInput(type, id, name, value, disabled, cssClass) {
    var $el = $("<input />").attr("type", type).attr("id", id).attr("name", name).val(value);

    if (type == "password") {
        $el.attr("autocomplete", "off");
    }

    if (typeof cssClass != "undefined") {
        $el.attr("class", cssClass);
    }

    if (typeof disabled != "undefined" && disabled) {
        $el.attr("disabled", "disabled");
    }

    return $el;
}

function buildTextarea(id, name, value, disabled, cssClass) {
    var $el = $("<textarea />").attr("id", id).attr("name", name).attr("rows", "5").val(value);

    if (typeof cssClass != "undefined") {
        $el.attr("class", cssClass);
    }

    if (typeof disabled != "undefined" && disabled) {
        $el.attr("disabled", "disabled");
    }

    return $el;
}

function buildLabel(forId, text) {
    return $("<label />").attr("for", forId).html(text + " : ");
}

function buildButton(id, name, text, cssClass) {
    var $el = $("<button />").attr("id", id).attr("name", name).html(text);

    if (typeof cssClass != "undefined") {
        $el.attr("class", cssClass);
    }

    return $el;
}

function buildLink(href, text, cssClass) {
    var $el = $("<a />").attr("href", href).html(text);

    if (typeof cssClass != "undefined") {
        $el.attr("class", cssClass);
    }

    return $el;
}

function buildSelectOption(value, text) {
    //return $("<option />").attr("value", value).attr("text", htmlDecode(text));
    return $("<option></option>").val(value).html(text);
}

function buildSelectList(id, name, selectedValue, optionList, disabled, cssClass) {

    if (typeof disabled != "undefined" && disabled) {
        return buildInput("text", id, name, selectOptionValue(optionList, selectedValue), true, cssClass);
    }

    var $el = $("<select />").attr("id", id).attr("name", name);

    if (typeof cssClass != "undefined") {
        $el.attr("class", cssClass);
    }

    $.each(optionList, function (index, item) {
        buildSelectOption(item.Value, item.Text).appendTo($el);
    });

    if (typeof selectedValue != "undefined") {
        $el.val(selectedValue.toString());
    }
    else {
        $el[0].selectedIndex = 0;
    }

    return $el;
}

function buildSelectListEmpty(id, name, cssClass) {

    var $el = $("<select />").attr("id", id).attr("name", name);

    if (typeof cssClass != "undefined") {
        $el.attr("class", cssClass);
    }

    return $el;
}

function buildCheckBox(id, name, value, checked, disabled, cssClass) {
    var $el = $("<input type='checkbox' />").attr("id", id).attr("name", name).val(value);

    if (typeof cssClass != "undefined") {
        $el.attr("class", cssClass);
    }

    if (typeof disabled != "undefined" && disabled) {
        $el.attr("disabled", "disabled");
    }

    if (typeof checked != "undefined" && checked) {
        $el.attr("checked", "checked");
    }

    return $el;
}

function buildCheckList(id, name, value, optionList, disabled) {
    if (typeof disabled == "undefined") {
        disabled = false;
    }

    var intValue = parseInt(value, 10);
    var $el = $("<ul class='block' />");

    $.each(optionList, function (index, item) {
        var itemValue = parseInt(item.Value, 10);

        var $li = $("<li />").appendTo($el);

        var $cb = buildCheckBox(id + "_" + index, name, item.Value);

        //var $cb = $("<input type='checkbox' />").attr("id", id + "_" + index).attr("name", name).val(item.Value);

        if (itemValue & intValue) {
            $cb.attr("checked", "checked");
        }

        if (disabled) {
            $cb.attr("disabled", "disabled");
        }

        var $label = $("<label />").attr("for", id + "_" + index).html(item.Text);

        $li.append($cb).append(" ").append($label);
    });

    return $el;
}

/************************** END HTML HELPER ***************************/


if (typeof jQuery === "undefined") {
    throw "Lilium.Grid requires jquery module to be loaded";
}

/* 
* Lilium.Grid (Data table)
*/
(function ($) {

    function liliumGrid($container, columns, options, extraSearchableColumns) {

        // Grid and Pager ids
        var gridId = $container.attr("id") + "DataTable";
        var toolbar = $container.attr("id") + "Toolbar";
        var extraContainerId = $container.attr("id") + "Extra";
        var chartContainerId = $container.attr("id") + "Chart";
        var mapContainerId = $container.attr("id") + "Map";
        var pagerId = $container.attr("id") + "Pager";
        var gotoId = gridId + "Goto";
        var pageCountId = gridId + "PageCount";
        var pageInfoId = gridId + "PageInfo";
        var rowPerPageId = gridId + "RowPerPage";
        var filterIdIndex = Math.round(1000000 * Math.random());
        var filterIdMaximum = 5;
        var filterIdCount = 0;
        var searchableColumns;

        if (typeof extraSearchableColumns == "undefined") {
            searchableColumns = columns;
        }
        else {
            searchableColumns = columns.concat(extraSearchableColumns);
        }

        // Defaults
        var defaults = {
            baseUrl: '',
            formId: 'dgForm',
            url: '/',
            urlSave: '',
            urlDelete: '',
            dialogId: 'Dialog',
            searchContainerId: 'search-container',
            searchConditionId: 'SearchCondition',
            searchOperatorId: 'SearchOperator',
            searchValueId: 'SearchValue',
            applyFilterId: 'ApplyFilter',
            newButtonId: 'New',
            searchButtonId: 'Search',
            filter: [{ id: "Main", base: false}],
            extraFilter: [],
            buttons: [],
            dialogHeight: 0,
            dialogWidth: 0,
            allowPrimaryColumnInsert: false,
            // Grid options
            autoHeight: false,
            isSearchVisible: false,
            editing: true,
            dateRangePicker: false,
            sort: 'ASC',
            sortBy: '',
            // Titles
            title: 'Maradit',
            toolbar: true
        };

        var columnDefaults = {
            name: "",
            resizable: true,
            sortable: true,
            minWidth: 30,
            rerenderOnResize: false,
            unselectable: false,
            searchable: true,
            insertable: true,
            type: 'string',
            required: false,
            baseSearchable: false,
            visible: true,
            detailedSearch: false
        };

        var filterDefaults = {
            coditionOperator: 'Equals',
            column: '',
            value: '',
            defaultSelectedItem: '',
            defaultValue: '',
            isStatic: false,
            deletable: true
        };

        var extraFilterDefaults = {
            coditionOperator: 'Equals',
            column: '',
            value: '',
            defaultSelectedItem: '',
            defaultValue: '',
            onChangeFill: null,
            idToFill: '',
            url: ''
        };

        // Locals
        var grid;
        var $chartContainer;
        var $mapContainer;
        var dataTable;
        var sort = 'ASC';
        var sortBy = '';
        var pageSize = 20;
        var maxPage = 1;
        var rowCount = 20;
        var pageNumber = 1;
        var primaryColumn = 'Id';

        function init() {
            //jQuery.ajaxSettings.traditional = true;

            // If userId is presented then add userId filter
            var userBaseId = $("#userBaseId").val();
            if (userBaseId !== undefined && userBaseId !== '' && userBaseId >= 0) {
                options.filter.push({ id: "UserId", base: false, defaultSelectedItem: "UserId", defaultValue: $("#userBaseId").val() });
            }

            options = $.extend(true, {}, defaults, options);

            options.dialogId = gridId + options.dialogId;
            options.searchContainerId = gridId + options.searchContainerId;
            options.searchConditionId = gridId + options.searchConditionId;
            options.searchOperatorId = gridId + options.searchOperatorId;
            options.searchValueId = gridId + options.searchValueId;
            options.applyFilterId = gridId + options.applyFilterId;
            options.newButtonId = gridId + options.newButtonId;
            options.searchButtonId = gridId + options.searchButtonId;

            if (options.baseUrl !== '') {
                options.url = options.baseUrl + "index";
                options.urlSave = options.baseUrl + "save";
                options.urlDelete = options.baseUrl + "delete";
            }

            var i;
            for (i = 0; i < columns.length; i++) {
                columns[i] = $.extend({}, columnDefaults, columns[i]);

                if (columns[i].SelectItems !== undefined) {
                    columns[i].SelectItems = $.parseJSON(columns[i].SelectItems);
                }
            }

            for (i = 0; i < searchableColumns.length; i++) {
                searchableColumns[i] = $.extend({}, columnDefaults, searchableColumns[i]);
            }

            for (i = 0; i < options.filter.length; i++) {
                options.filter[i] = $.extend({}, filterDefaults, options.filter[i]);
            }

            for (i = 0; i < options.extraFilter.length; i++) {
                options.extraFilter[i] = $.extend({}, extraFilterDefaults, options.extraFilter[i]);
            }

            $.each(columns, function (index, value) {
                if (value.primaryColumn) {
                    primaryColumn = value.field;
                }
            });

            // From init
            sortBy = options.sortBy;
            sort = options.sort;

            if (sortBy === '') {
                sortBy = primaryColumn;
            }

            if (options.toolbar) {
                constructorToolbarUI();
            }

            $container.html("");
            $("#" + options.searchContainerId).remove();

            constructorFilterUI();

            if (options.editing) {
                constructorDialogUI();
            }

            constructGridUI();

            constructPagerUI();

            search();
        }

        // UI Constructor
        function constructorToolbarUI() {
            $container.before("<div id='" + toolbar + "' class='toolbar ui-widget-header ui-corner-all' />");
            var $toolbar = $("#" + toolbar);

            if (options.editing) {
                buildButton(options.newButtonId, options.newButtonId, LILIUM.newButtonText, "ui-priority-primary")
                   .button({
                       icons: { primary: "ui-icon-plusthick" }
                   })
                    .click(function () {
                        newRow();
                        return false;
                    })
                    .appendTo($toolbar);
            }

            // search container (show/hide)
            buildButton(options.searchButtonId, options.searchButtonId, LILIUM.searchButtonText)
                .button({
                    icons: { secondary: "ui-icon-triangle-1-s" }
                })
                .click(function () {
                    $("#" + options.searchContainerId).toggle();
                    return false;
                })
                .appendTo($toolbar);

            // extra buttons
            $.each(options.buttons, function (index, value) {
                buildButton(value.id, value.id, value.text)
                    .button()
                    .click(function () {
                        value.onClickAction();
                        return false;
                    })
                    .appendTo($toolbar);
            });
        }

        function constructorFilterUI() {
            var $searchContainer = $("<div class='search-container' />").attr("id", options.searchContainerId);

            if (!options.isSearchVisible) {
                $searchContainer.attr("class", "search-container none");
            }

            $container.before($searchContainer);

            var $placeHolder = $("<table class='filter' />").attr("id", options.searchContainerId + "TFilter").appendTo($searchContainer);
            var filterIndex = 0;

            // Filter
            $.each(options.filter, function (index, filterItem) {

                if (filterItem.id == "DateRange") {
                    constructorDateRange($placeHolder, filterItem);
                }
                else {
                    constructorFilterRow($placeHolder, filterItem, (filterIndex === 0));

                    $("#" + filterItem.id + options.searchConditionId).change(function () {
                        filterValueType(filterItem, (filterIndex === 0));
                    }).change();
                }

                filterIndex++;
            });

            // extraFilter
            $.each(options.extraFilter, function (index, filterItem) {
                constructorExtraFilterRow($placeHolder, filterItem);
            });

            $("#" + options.applyFilterId).button({
                icons: {
                    primary: "ui-icon-search"
                }
            }).click(function () {
                pageNumber = 1;
                $("#" + gotoId).val(pageNumber);

                search();

                return false;
            });
        }

        //DATERANGE
        function constructorDateRange($placeHolder, filterItem) {
            $.datepicker.setDefaults($.datepicker.regional[lang]);

            $.datepicker.setDefaults({
                showOn: 'button',
                buttonImage: LILIUM.baseUrl + '/content/style/images/calendar.gif',
                buttonImageOnly: true,
                changeMonth: true,
                changeYear: true
            });

            var $row = $("<tr />").attr("id", filterItem.id).prependTo($placeHolder);

            var $td1 = $("<td/>").appendTo($row);
            var $td2 = $("<td/>").appendTo($row);
            $("<td>-</td>").appendTo($row);         // var $td3 = 
            var $td4 = $("<td/>").appendTo($row);
            $("<td/>").appendTo($row);              // var $td5 = 
            $("<td/>").appendTo($row);              // var $td6 = 

            // Condition
            var conditionId = filterItem.id + options.searchConditionId;
            var $select = buildSelectListEmpty(conditionId, conditionId).appendTo($td1);

            $.each(filterItem.searchableColumns, function (index, columnItem) {
                buildSelectOption(columnItem.field, columnItem.name).appendTo($select);
            });

            // Value range
            var sdateId = filterItem.id + options.searchValueId + "_Start";
            var $sdate = buildInput("text", sdateId, sdateId, "", false, "text uidate").appendTo($td2);
            $sdate.datepicker().datepicker("setDate", filterItem.startDate);

            var edateId = filterItem.id + options.searchValueId + "_End";
            var $edate = buildInput("text", edateId, edateId, "", false, "text uidate").appendTo($td4);
            $edate.datepicker().datepicker("setDate", filterItem.endDate);

            // Analysis
            //$td5.append(String.format("<input type='checkbox' name='{0}{1}_Analysis' id='{0}{1}_Analysis'/> <label for='{0}{1}_Analysis' style='display:inline;font-size:0.9em'>{2}</label>", filterItem.id, options.searchValueId, LILIUM.analysis));
        }

        // EXTRA FILTER
        function constructorExtraFilterRow($placeHolder, filterItem) {
            var $row = $("<tr />").attr("id", filterItem.id).prependTo($placeHolder);

            var $td1 = $("<td/>").appendTo($row);
            var $td2 = $("<td/>").appendTo($row);
            $("<td>:</td>").appendTo($row);         // var $td3 = 
            var $td4 = $("<td/>").appendTo($row);
            $("<td/>").appendTo($row);              // var $td5 = 
            $("<td/>").appendTo($row);              // var $td6 = 

            // Condition
            var conditionId = filterItem.id + options.searchConditionId;
            var $select = buildSelectListEmpty(conditionId, conditionId).appendTo($td1);
            buildSelectOption(-1, filterItem.Text).appendTo($select);

            // Operator
            var operatorId = filterItem.id + options.searchOperatorId;
            $select = buildSelectListEmpty(operatorId, operatorId).appendTo($td2);
            buildSelectOption(0, selectOptionValue(LILIUM.operatorOptions, 0)).appendTo($select); // Equals

            // Value
            var valueId = filterItem.id + options.searchValueId;
            $select = buildSelectListEmpty(valueId, valueId).appendTo($td4);
            $.each(filterItem.optionList, function (index, option) {
                buildSelectOption(option.Value, option.Text).appendTo($select);
            });

            var copyToItem;
            var indexItem = -1;
            $.each(columns, function (index, value) {
                if (value.field == filterItem.copyTo) {
                    copyToItem = value;
                    indexItem = index;
                }
            });

            if (filterItem.onChangeFill !== null) {
                $select.change(function () {
                    filterItem.onChangeFill($("#" + filterItem.idToFill), $select.val(), filterItem.url, copyToItem);

                    var $dialogForm = $("#" + filterItem.copyTo).empty();

                    columns[indexItem] = copyToItem;

                    $.each(copyToItem.selectItems, function (index, value) {
                        buildSelectOption(value.Value, value.Text).appendTo($dialogForm);
                    });

                }).change();
            }
        }

        //ROW FILTER
        function constructorFilterRow($placeHolder, filterItem, mainFilter) {
            var $row = $("<tr />").attr("id", filterItem.id).prependTo($placeHolder);

            var $td1 = $("<td/>").appendTo($row);
            var $td2 = $("<td/>").appendTo($row);
            $("<td>:</td>").appendTo($row);         // var $td3 = 
            var $td4 = $("<td/>").appendTo($row);
            var $td5 = $("<td/>").appendTo($row);
            var $td6 = $("<td/>").appendTo($row);

            // Condition
            var conditionId = filterItem.id + options.searchConditionId;
            var $conditionSelect = buildSelectListEmpty(conditionId, conditionId).appendTo($td1);

            $.each(searchableColumns, function (index, columnItem) {

                if (filterItem.isStatic) {
                    if (filterItem.formId === columnItem.field) {
                        buildSelectOption(columnItem.field, columnItem.name).appendTo($conditionSelect);

                        var newFilter = { id: filterItem.formId, base: false };
                        options.filter.push(newFilter);
                        filterIdCount++;
                    }
                }
                else {
                    if ((filterItem.base && columnItem.baseSearchable) || (!filterItem.base && columnItem.searchable)) {
                        buildSelectOption(columnItem.field, columnItem.name).appendTo($conditionSelect);
                    }
                }
            });

            $conditionSelect.val(filterItem.defaultSelectedItem);

            // Operator
            var operatorId = filterItem.id + options.searchOperatorId;
            buildSelectList(operatorId, operatorId, "", LILIUM.operatorOptions).appendTo($td2);

            // Value
            var valueId = filterItem.id + options.searchValueId;
            var valueSelectId = valueId + "Select";

            buildSelectListEmpty(valueSelectId, valueSelectId, "none").appendTo($td4); // var $select = 
            buildInput("text", valueId, valueId, (filterItem.defaultValue === undefined ? "" : filterItem.defaultValue), false, "text")
                .keyup(function (e) {
                    if (e.keyCode === 13) {
                        $("#" + options.applyFilterId).click();
                    }
                })
                .appendTo($td4);

            if (mainFilter) {
                // Add new filter
                buildLink("#", "+ " + LILIUM.newFilterText)
                    .click(function () {
                        if (filterIdCount < filterIdMaximum) {
                            var newFilter = { id: "Sub_" + filterIdIndex, base: false, deletable: true };

                            options.filter.push(newFilter);
                            constructorFilterRow($placeHolder, newFilter, false);

                            filterIdIndex++;
                            filterIdCount++;
                        }
                    })
                    .appendTo($td5);

                // Applay Filter button
                buildButton(options.applyFilterId, options.applyFilterId, LILIUM.applyFilterText).appendTo($td6);
            }
            else if (filterItem.deletable) {
                // Delete filter
                buildLink("#", "- " + LILIUM.deleteFilterText)
                    .click(function () {
                        var newFilter = { id: filterItem.id, base: false };

                        var i;
                        for (i = 0; i < options.filter.length; i++) {
                            if (options.filter[i] == newFilter) {
                                options.filter.splice(i, 1);  //delete options.filter[i];
                            }
                        }

                        $row.remove();

                        filterIdCount--;
                    })
                    .appendTo($td5);
            }

            $conditionSelect[0].selectedIndex = 0;
            $conditionSelect.change(function () {
                filterValueType(filterItem, mainFilter);
            }).change();
        }
        //NEW END

        function filterValueType(filter, mainFilter) {
            var $searchCondition = $("#" + filter.id + options.searchConditionId);
            var $searchFilter = $("#" + filter.id + options.searchOperatorId);
            var $searchValue = $("#" + filter.id + options.searchValueId);
            var $searchValueSelect = $("#" + filter.id + options.searchValueId + "Select");

            var searchConditionValue = $searchCondition.val();
            var currentColumn;
            $.each(searchableColumns, function (index, value) {
                if (searchConditionValue == value.field && currentColumn == undefined) {
                    currentColumn = value;
                    filter.column = value.field;
                }
            });

            if (currentColumn.type == 'select') {
                $searchValueSelect.empty();

                $.each(currentColumn.selectItems, function (index, value) {
                    buildSelectOption(value.Value, value.Text).appendTo($searchValueSelect);
                });

                if (filter.base) {
                    //$searchValueSelect.val($("#" + $searchValueSelect.attr("id") + " option:first").val());
                    $searchValueSelect[0].selectedIndex = 0;
                }

                $searchValueSelect.show();
                $searchValue.hide();
                $searchFilter.empty();

                $.each(LILIUM.operatorOptions, function (index, value) {
                    if (value.Value == "Equals" || value.Value == "0") {
                        buildSelectOption(value.Value, value.Text).appendTo($searchFilter);
                    }
                    else if (!mainFilter && (value.Value == "DoesNotEqual" || value.Value == "1")) {
                        buildSelectOption(value.Value, value.Text).appendTo($searchFilter);
                    }
                });
            }
            else {
                $searchValueSelect.hide();
                $searchValue.show();
                $searchFilter.empty();

                $.each(LILIUM.operatorOptions, function (index, value) {
                    buildSelectOption(value.Value, value.Text).appendTo($searchFilter);
                });

                var dialogOpener = filter.id + "DialogOpener";

                if (currentColumn.detailedSearch) {
                    $("#" + currentColumn.extraId + "AppendId").val($searchValue.attr("id"));

                    if ($("#" + dialogOpener).length === 0) {
                        var $dialogOpener = $("<span style='float:right;cursor:pointer;margin:3px' class='ui-state-default ui-corner-all' />").appendTo($searchValue.parent());
                        $dialogOpener.attr("id", dialogOpener);
                        $dialogOpener.append($("<span class='ui-icon ui-icon-search' />"));

                        $dialogOpener.click(function () {
                            $("#" + currentColumn.extraId + "Dialog").dialog("open");
                        });
                    }
                    else {
                        $("#" + dialogOpener).show();
                    }
                }
                else {
                    if ($("#" + dialogOpener).length > 0) {
                        $("#" + dialogOpener).hide();
                    }
                }
            }
        }

        function constructorDialogUI() {
            if (options.dialogId === '') {
                return;
            }

            var $tmpContainer = $("<div />").attr("id", options.dialogId).appendTo($container.parent());
            $tmpContainer = $("<form method='post' />").attr("id", options.formId).attr("action", options.urlSave).appendTo($tmpContainer);
            $tmpContainer = $("<fieldset />").appendTo($tmpContainer);
            buildInput("hidden", "update", "update", "").appendTo($tmpContainer);

            $.each(columns, function (index, value) {

                if (value.id == primaryColumn) {
                    buildInput("hidden", "UniqueId", value.field, "").appendTo($tmpContainer);
                }

                if (value.insertable) {
                    //currentColumn = value;
                    var $tmp = $("<div class='row' />").appendTo($tmpContainer);
                    buildLabel(value.field, value.name).appendTo($tmp);

                    if (value.required) {
                        $tmp.append("<span class='req'>*</span>");
                    }

                    if (value.type == 'bool') {
                        buildCheckBox(value.field, value.field, true);
                    }
                    else if (value.type == 'select') {
                        buildSelectList(value.field, value.field, "", value.selectItems).appendTo($tmp);
                    }
                    else if (value.type == 'flag') {
                        buildCheckList(value.field, value.field, 0, value.selectItems).appendTo($tmp);
                    }
                    else if (value.type == 'longtext') {
                        buildTextarea(value.field, value.field, "").appendTo($tmp);
                    }
                    else {
                        buildInput("text", value.field, value.field, "").appendTo($tmp);
                    }

                    // HINT
                    if (LILIUM["hint" + value.field] !== undefined) {
                        $("<div class='subp' />").text(LILIUM["hint" + value.field]).appendTo($tmp);
                    }
                }
            });

            var $form = $("#" + options.formId);

            $form.submit(function () {
                var formdata = $(this).serialize();
                $.ajax({ type: $(this).attr('method'), url: $(this).attr('action'), dataType: 'json', data: formdata,
                    beforeSend: $.busyDialog.show(),
                    error: function (xhr) {
                        $.busyDialog.hide();

                        if (xhr.statusText == "parsererror") {
                            location.reload();
                        }
                        else {
                            error(xhr.statusText);
                        }
                    },
                    success: function (data) {
                        $.busyDialog.hide();

                        if (data.Success) {
                            success(data.Text);
                            getData(true);
                            $("#" + options.dialogId).dialog("close");
                        }
                        else {
                            error(data.Text);
                        }
                    }
                });

                return false;
            });

            $("#" + options.dialogId).dialog({
                autoOpen: false,
                title: options.title,
                height: (options.dialogHeight === 0) ? 'auto' : options.dialogHeight,
                width: (options.dialogWidth === 0) ? 'auto' : options.dialogWidth,
                modal: true,
                buttons: {
                    "ok": {
                        text: LILIUM.dialogOkText,
                        className: 'ui-priority-primary ui-button-ok',
                        click: function () {
                            $form.submit();
                        }
                    },
                    "cancel": {
                        text: LILIUM.dialogCancelText,
                        className: 'cancel',
                        click: function () {
                            $(this).dialog("close");
                        }
                    }
                }
            });
        }

        function constructorGrid() {
            var gridOptions = {
                editable: false,
                enableAddRow: false,
                enableCellNavigation: false,
                autoHeight: options.autoHeight
            };

            grid = new Slick.Grid("#" + gridId, dataTable.Items, columns, gridOptions);
            grid.autosizeColumns();
            $("#" + gridId).show();

            $(".slick-cell").live("hover", function () {
                $(this).parent().toggleClass("row-highlight");
            });

            grid.onSort.subscribe(function (e, args) {
                sort = args.sortAsc ? 'ASC' : 'DESC';
                sortBy = args.sortCol.field;

                getData();
            });

            grid.onClick.subscribe(function (e) {
                var cell = grid.getCellFromEvent(e);

                if (columns[cell.cell].id === "Edit") {
                    editRow(dataTable.Items[cell.row]);
                }
                else if (columns[cell.cell].id === "Delete") {
                    deleteRow(dataTable.Items[cell.row]);
                }
                else if (columns[cell.cell].id === "VariantId") {
                    listVariantId(dataTable.Items[cell.row]);
                }
                else if (columns[cell.cell].id === "UseValue") {
                    useValue(dataTable.Items[cell.row]);
                }
            });
        }

        function constructGridUI() {
            $("<div class='container' />").attr("id", extraContainerId).appendTo($container).hide();
            $chartContainer = $("<div class='container' />").attr("id", chartContainerId).appendTo($container).hide();
            $mapContainer = $("<div class='container' />").attr("id", mapContainerId).appendTo($container).hide();

            $("<div />").attr("id", gridId).attr("class", (options.autoHeight ? 'grid-auto-height' : 'grid')).appendTo($container);
            $("<div />").attr("id", pagerId).attr("class", (options.autoHeight ? 'none' : 'paging ui-state-default')).appendTo($container);
            $container.append("<br />");

            if (options.autoHeight) {
                pageSize = 0;
            }
        }

        function constructPagerUI() {
            var $pager = $("#" + pagerId);

            // Goto
            var $tmp = $("<span />").text(LILIUM.gotoText + " : ").appendTo($pager);
            var $goto = buildInput("text", gotoId, gotoId, 1, false, "text").attr("style", "width: 30px")
                .blur(function () {
                    var gotoValue = parseInt($(this).val(), 10);

                    if (gotoValue > 0 && gotoValue <= maxPage) {
                        if (gotoValue != pageNumber) {
                            pageNumber = gotoValue;

                            getData();
                        }
                        else {
                            $(this).val(pageNumber);
                        }
                    }
                    else {
                        $(this).val(pageNumber);
                    }
                })
                .appendTo($tmp);

            $("<span />").text(" / ").appendTo($pager);

            // Total page count
            $("<span />").attr("id", pageCountId).text("0").appendTo($pager);
            $("<span />").text(" ").appendTo($pager);

            // Rows per page
            $tmp = $("<span />").text(LILIUM.rowsPerPageText + " : ").appendTo($pager);
            var $select = buildSelectListEmpty(rowPerPageId, rowPerPageId, "textauto")
                .change(function () {
                    pageSize = $(this).val();
                    pageNumber = 1;
                    $goto.val(pageNumber);

                    getData(true);
                })
                .appendTo($tmp);

            buildSelectOption(20, 20).appendTo($select);
            buildSelectOption(50, 50).appendTo($select);
            buildSelectOption(100, 100).appendTo($select);
            buildSelectOption(500, 500).appendTo($select);
            $("<span />").text(" ").appendTo($pager);

            // Page info
            $("<span />").attr("id", pageInfoId).text("0").appendTo($pager);
            $("<span />").text(" ").appendTo($pager);

            // Previous and Next buttons
            $tmp = $("<span />").appendTo($pager);

            buildLink("#prev", "<span class='ui-icon ui-icon-triangle-1-w'></span>", "ui-button ui-state-default")
                .hover(function () {
                    $(this).toggleClass("ui-state-hover");
                })
                .click(function () {
                    if (pageNumber - 1 > 0 && pageNumber <= maxPage) {
                        pageNumber--;
                        $goto.val(pageNumber);

                        getData();
                    }
                })
                .appendTo($tmp);

            buildLink("#next", "<span class='ui-icon ui-icon-triangle-1-e'></span>", "ui-button ui-state-default")
                .hover(function () {
                    $(this).toggleClass("ui-state-hover");
                })
                .click(function () {
                    if (pageNumber + 1 <= maxPage) {
                        pageNumber++;
                        $goto.val(pageNumber);

                        getData();
                    }
                })
                .appendTo($tmp);

            $("<span />").text(" ").appendTo($pager);

            // Wrap all pager elements 
            $pager.children().wrapAll("<span class='paging-pager' />");
        }

        // METHODS
        function setPager() {
            maxPage = parseInt(rowCount / pageSize, 10);

            if (rowCount % pageSize !== 0) {
                maxPage++;
            }

            $("#" + pageCountId).text(maxPage);
        }

        function updatePager() {
            var from = pageSize * (pageNumber - 1) + 1;
            var to = pageSize * pageNumber;
            to = (to > rowCount) ? rowCount : to;
            $("#" + pageInfoId).text(String.format("{0} - {1} ({2})", from, to, rowCount));
        }

        function getData(refreshPager) {
            if (refreshPager === undefined) {
                refreshPager = false;
            }

            var postData = {};
            postData.Columns = [];

            postData.SortBy = sortBy;
            postData.PageSize = pageSize;
            postData.PageNumber = pageNumber;
            postData.Sort = sort;

            var filterIndex = 0;
            $.each(options.filter, function (index, filterItem) {
                if (filterItem.column !== undefined) {

                    if (filterItem.id == "DateRange") {
                        postData.startDate = $("#" + filterItem.id + options.searchValueId + "_Start").val();
                        postData.endDate = $("#" + filterItem.id + options.searchValueId + "_End").val();
                        postData.rangeColumn = $("#" + filterItem.id + options.searchConditionId).val();
                    }
                    else {
                        if (filterItem.formId !== undefined) {
                            postData["" + filterItem.formId] = filterItem.value;
                        }
                        else {
                            postData.Columns.push({ Operator: filterItem.coditionOperator, Column: filterItem.column, Value: filterItem.value, Index: filterIndex });
                            filterIndex++;
                        }
                    }
                }
            });

            $.ajax({
                type: "POST", url: options.url, data: $.postify(postData), dataType: "json",
                beforeSend: $.busyDialog.show(),
                error: function (xhr) {
                    $.busyDialog.hide();

                    if (xhr.statusText == "parsererror") {
                        location.reload();
                    }
                    else {
                        error(xhr.statusText);
                    }
                },
                success: function (data) {
                    $.busyDialog.hide();

                    if (data.Success) {
                        dataTable = data;

                        if (grid === undefined) {
                            constructorGrid();
                        }
                        else {
                            grid.invalidateAllRows();
                            grid.setData(dataTable.Items, true);
                            grid.render();
                        }

                        if (refreshPager) {
                            rowCount = dataTable.Count;
                            setPager();
                        }

                        updatePager();

                        constructChartUI(data.OverviewItems);
                        constructMap($mapContainer, data.NetworkItem);
                    }
                    else {
                        error(data.Text);

                        dataTable = null;
                        grid.invalidateAllRows();
                        $chartContainer.empty();
                        $chartContainer.hide();

                        $mapContainer.empty();
                        $mapContainer.hide();

                        rowCount = 0;
                        updatePager();
                    }
                }
            });
        }

        function constructChartUI(data) {
            $chartContainer.empty();

            if (data !== null && data !== undefined && data.length > 0) {
                $chartContainer.show();

                $.each(data, function (index, overview) {

                    var holderId = gridId + "_holder_" + index;
                    $("<div class='chart' />").attr("id", holderId).appendTo($chartContainer); // var $holder = 

                    // Pie chart
                    var r = Raphael(holderId, 300, 120);
                    r.g.txtattr.font = "11px 'Fontin Sans', Fontin-Sans, sans-serif";

                    var values = [];
                    var legends = [];
                    var total = 0;

                    var numberFormat = overview.IsDecimal ? LILIUM.formatDecimalOptions : LILIUM.formatOptions;

                    $.each(overview.Items, function (overviewIndex, overviewItem) {

                        if (overviewItem.Count > 0) {
                            values.push(overviewItem.Count);
                            legends.push(String.format("%%.%% - {0} ({1})", overviewItem.Text, $.formatNumber(overviewItem.Count, numberFormat)));
                            total += overviewItem.Count;
                        }
                    });

                    // Chart title and sum
                    r.g.text(120, 100, String.format("{0} | {1}", overview.Title, $.formatNumber(total, numberFormat))).attr({ "font-size": 13, "fill": "#006600" });

                    var pie = r.g.piechart(50, 50, 30, values, { legend: legends, legendpos: "east" });
                    // , href: ["http://raphaeljs.com", "http://g.raphaeljs.com"]

                    var tooltip;

                    pie.hover(function () {
                        this.sector.stop();
                        this.sector.scale(1.1, 1.1, this.cx, this.cy);

                        if (this.label) {
                            this.label[0].stop();
                            this.label[0].scale(1.5);
                            this.label[1].attr({ "font-weight": 800 });
                        }

                        var that = this.sector;
                        pie.each(function () {
                            if (this.sector.id === that.id) {
                                tooltip = r.g.text(this.x, this.y, $.formatNumber(this.sector.value.value, numberFormat)).attr({ "font-size": 11, "fill": "#000", "font-weight": 800 });
                            }
                        });

                    }, function () {
                        this.sector.animate({ scale: [1, 1, this.cx, this.cy] }, 500, "bounce");

                        if (this.label) {
                            this.label[0].animate({ scale: 1 }, 500, "bounce");
                            this.label[1].attr({ "font-weight": 400 });
                        }

                        tooltip.remove();
                    });

                });
            }
            else {
                $chartContainer.hide();
            }
        }

        function editRow(row) {
            $("#update").val(true);

            $("#UniqueId").val(row[primaryColumn]);
            $("#UniqueId").removeAttr("disabled");

            $.each(columns, function (index, value) {

                var field = $("#" + value.field);

                if (value.type == 'flag') {

                    var val = parseInt(row[value.field].toString(), 10);

                    $.each(value.selectItems, function (flagIndex, item) {
                        var $flag = $("#" + value.field + "_" + flagIndex);

                        if ((val & (parseInt(item.Value, 10))) > 0) {
                            $flag.attr("checked", "checked");
                        }
                        else {
                            $flag.removeAttr("checked");
                        }
                    });
                }
                else if (field.length == 1) {

                    if (field.is(':checkbox')) {

                        if (row[value.field]) {
                            field.attr('checked', 'checked');
                        }
                        else {
                            field.removeAttr('checked');
                        }
                    }
                    else {
                        var tmp = row[value.field] === null ? "" : row[value.field].toString();
                        field.val(tmp);

                        if (value.field == primaryColumn) {
                            field.attr('disabled', 'disabled');
                        }
                    }
                }
            });

            $("#" + options.dialogId).dialog("open");
        }

        function newRow() {
            $("#update").val(false);
            $("#UniqueId").val('-1');

            if (options.allowPrimaryColumnInsert) {
                $("#UniqueId").attr("disabled", "disabled");
                $("#" + primaryColumn).removeAttr("disabled");
            }
            else {
                $("#UniqueId").removeAttr("disabled");
            }

            $("#" + options.formId).clearForm();
            $("#" + options.dialogId).dialog("open");
        }

        function search() {
            var i;
            for (i = 0; i < options.filter.length; i++) {

                var filterItem = options.filter[i];

                filterItem.column = $("#" + filterItem.id + options.searchConditionId).val();
                filterItem.coditionOperator = $("#" + filterItem.id + options.searchOperatorId).val();
                filterItem.column = $("#" + filterItem.id + options.searchConditionId).val();

                if ($("#" + filterItem.id + options.searchValueId).is(':visible')) {
                    filterItem.value = $("#" + filterItem.id + options.searchValueId).val();
                }
                else {
                    filterItem.value = $("#" + filterItem.id + options.searchValueId + "Select").val();
                }
            }

            getData(true);
        }

        function deleteRow(row) {

            if (!confirm(LILIUM.deleteConfirm)) {
                return;
            }

            var postData = {};
            postData[primaryColumn] = row[primaryColumn];

            $.each(columns, function (index, value) {
                if (value.required) {
                    postData[value.field] = row[value.field];
                }
            });

            $.post(options.urlDelete, postData)
                .success(function (data) {
                    if (data.Success) {
                        success(data.Text);
                        getData(true);
                    }
                    else {
                        error(data.Text);
                    }
                })
                .error(function (xhr) {
                    error(xhr.statusText);
                });
        }

        function listVariantId(row) {

            var $el = $("#variant-dialog");

            if ($el.length === 0) {
                $el = $("<div id='variant-dialog' title='' />").appendTo($("body"));
                $el.dialog({ height: 300, width: 600 });

                var $tmpContainer = $("<fieldset />").appendTo($el);

                var $tmp = $("<div class='row' />").appendTo($tmpContainer);
                buildLabel("ServiceCode", LILIUM.serviceCodeText).appendTo($tmp);
                buildInput("text", "ServiceCode", "ServiceCode", "").appendTo($tmp);

                $tmp = $("<div class='row' />").appendTo($tmpContainer);
                buildLabel("VariantId", LILIUM.variantIdText).appendTo($tmp);
                buildInput("text", "VariantId", "VariantId", "").appendTo($tmp);

                $tmp = $("<div class='row' />").appendTo($tmpContainer);
                buildLabel("MSISDN", LILIUM.msisdnText).appendTo($tmp);
                buildInput("text", "MSISDN", "MSISDN", "").appendTo($tmp);

                $tmp = $("<div class='row' />").appendTo($tmpContainer);
                buildLabel("ServiceId", LILIUM.serviceIdText).appendTo($tmp);
                buildInput("text", "ServiceId", "ServiceId", "").appendTo($tmp);

                $tmp = $("<div class='row' />").appendTo($tmpContainer);
                buildLabel("Sender", LILIUM.senderText).appendTo($tmp);
                $("<ul id='SenderList' class='variant-list'/>").appendTo($tmp);

                buildInput("hidden", "Id", "Id", "").appendTo($tmp);
                $tmp = $("<div class='row'></div>").appendTo($tmpContainer);
                $tmp.append("<label />");
                var $button = buildButton("ToggleVisible", "ToggleVisible", LILIUM.toggleVisibleText, "ui-button-ok").button().appendTo($tmp);

                $button.click(function () {
                    $.post(options.baseUrl + "togglevisible", { id: $("#Id").val() })
                    .success(function (data) {
                        if (data.Success) {
                            success(data.Text);
                            getData(true);
                        }
                        else {
                            error(data.Text);
                        }
                    })
                    .error(function (xhr) {
                        error(xhr.statusText);
                    });
                });
            }

            var $ul = $("#SenderList");
            $ul.html("");

            $("#Id").val(row["Id"]);
            $("#ServiceCode").val(row["ServiceCode"]);
            $("#VariantId").val(row["VariantId"]);
            $("#MSISDN").val(row["MSISDN"]);
            $("#ServiceId").val(row["ServiceId"]);

            $.each(row["Sender"].split('|'), function (variantIndex, value) {

                var $li = $("<li />").appendTo($ul);
                buildInput("text", "vid_" + variantIndex, "Sender", value, false, "").appendTo($li);
            });

            $el.dialog("open");
        }

        function useValue(row) {
            var i;
            for (i = 0; i < columns.length; i++) {
                if (columns[i].field === 'UseValue') {

                    var appendId = $("#" + columns[i].appendId + "AppendId").val();

                    $("#" + appendId).val(row[columns[i].valueId]);
                    $("#" + columns[i].appendId + "Dialog").dialog("close");
                    break;
                }
            }
        }

        init();
    }

    // Lilium.Grid
    $.extend(true, window, { Lilium: { Grid: liliumGrid} });
} (jQuery));

// String fucions

function htmlEncode(value) {
    return $('<div/>').text(value).html();
}

function htmlDecode(value) {
    return $('<div/>').html(value).text();
}


$.postify = function (value) {
    var result = {};

    var buildResult = function (object, prefix) {
        var key;
        for (key in object) {

            var postKey = isFinite(key) ? (prefix !== "" ? prefix : "") + "[" + key + "]" : (prefix !== "" ? prefix + "." : "") + key;

            switch (typeof (object[key])) {
                case "number":
                case "string":
                case "boolean":
                    result[postKey] = object[key];
                    break;

                case "object":
                    if (object[key] === null) {
                        result[postKey] = "";
                    }
                    else if (object[key].toUTCString) {
                        result[postKey] = object[key].toUTCString().replace("UTC", "GMT");
                    }
                    else {
                        buildResult(object[key], postKey !== "" ? postKey : key);
                    }
            }
        } // end for
    };

    buildResult(value, "");

    return result;
};

(function ($) {
    var step = 60000;

    $.fn.clock = function (options) {
        options = jQuery.extend({ timeInMilliseconds: 0 }, options);

        var el = $("<div id='serverTime' style='display:none' />").attr("title", LILIUM.serverTime).appendTo("body");
        el.append("<div style='text-align:center' id='serverTimeValue' />");

        el.dialog({ height: 80, width: 250, autoOpen: false, modal: true });

        $(this).click(function () {
            el.dialog("open");
            return false;
        });

        return $.fn.clock.start($(this), new Date(options.timeInMilliseconds - step));
    };

    $.fn.clock.start = function (element, time) {

        time.setSeconds(time.getSeconds() + parseInt(step / 1000, 10));

        var hours = padDigit(time.getUTCHours());
        var minutes = padDigit(time.getUTCMinutes());
        //var seconds = padDigit(time.getUTCSeconds());
        var datePart = time.getUTCFullYear() + "-" + padDigit(time.getUTCMonth() + 1) + "-" + padDigit(time.getUTCDay() + 1);

        element.html(hours + ":" + minutes + " (UTC)");
        $("#serverTimeValue").html(datePart + " " + hours + ":" + minutes + " (UTC)");
        element.timerID = setTimeout(function () { $.fn.clock.start(element, time); }, step);
    };

    function padDigit(digit) {
        return (digit < 10) ? "0" + digit : digit;
    }

} (jQuery));

$.languageDialog = {

    init: function () {
        var el = $("<div id='languageDialog' style='display:none' title='" + LILIUM.selectYourLanguage + "' />");
        var $tbl = $("<ul />").appendTo(el);

        $.each(LILIUM.languageOptions, function (index, item) {
            if (item.Visible) {
                $tbl.append(String.format("<li><a href='#' id='{0}'>{1}</a></li>", item.Value, item.Text));
            }
        });

        $('body').append(el);

        $("#languageDialog a").click(function () {
            $.cookie("hl", this.id, { expires: 30, path: '/' });
            window.location.reload();
        });

        el.dialog({
            height: 140,
            autoOpen: false,
            modal: true
        });

        $("#hl").click(function () {
            el.dialog("open");
            return false;
        });
    }
};

$.busyDialog = {

    hide: function () {
        $("#busyDialog").hide();
    },

    show: function () {
        $("#busyDialog").show();
    }
};


$.userSearch = {

    dataMap: function (response, data) {
        response($.map(data, function (item) {
            return { label: item.Text, value: item.Value };
        }));
    },

    init: function () {
        var search = $("#searchuser");

        if (search.length === 0) {
            return;
        }

        var cache = {};
        search.autocomplete({
            minLength: 2,
            source: function (request, response) {

                var term = request.term;
                if (term in cache) {
                    $.userSearch.dataMap(response, cache[term]);
                    return;
                }

                $.post("/sub/user/search", { username: search.val() })
                    .success(function (data) {
                        cache[term] = data;
                        $.userSearch.dataMap(response, data);
                    }
                );
            },
            select: function (event, ui) {
                //search.val(ui.item.label);
                document.location = '/user/info/' + ui.item.value;
            }
        }).data("autocomplete")._renderItem = function (ul, item) {
            return $("<li></li>").data("item.autocomplete", item).append(buildLink("/user/info/" + item.value, item.label)).appendTo(ul);
        };
    }
};

$(document).ready(function () {
    $.userSearch.init();
    $.languageDialog.init();

    if ($("#InfoMessage").val() != "") {

        if ($("#InfoMessageType").val() == "success") {
            success($("#InfoMessage").val());
        }
        else {
            error($("#InfoMessage").val());
        }
    }
});

/* Map */
function constructMap($mapContainer, data) {
    var i, indexedCountry = {}, indexedNetwork = {};

    for (i = 0; i < LILIUM.countryOptions.length; i++) {
        if (LILIUM.countryOptions[i].Visible) {
            indexedCountry[LILIUM.countryOptions[i].Value] = LILIUM.countryOptions[i].Text;
        }
    }

    for (i = 0; i < LILIUM.networkOptions.length; i++) {
        if (LILIUM.networkOptions[i].Visible) {
            indexedNetwork[LILIUM.networkOptions[i].Value] = { Name: LILIUM.networkOptions[i].Text, Country: LILIUM.networkOptions[i].Text.substring(0, 2) };
        }
    }

    $mapContainer.empty();
    var mapId = $mapContainer.attr("id") + "Inner";
    $("<div id='" + mapId + "' style='height: 400px; width: 100%;'></div>").appendTo($mapContainer);

    if (data !== null && data !== undefined && data.Items.length > 0) {
        $mapContainer.show();

        var netData = {}, netDataDetails = {}, country, network;

        // Build map data
        $.each(data.Items, function (index, item) {
            network = indexedNetwork[item.Text];

            if (network !== undefined) {
                country = network.Country.toLowerCase();

                if (netData[country] === undefined) {
                    netData[country] = item.Count;
                }
                else {
                    netData[country] += item.Count;
                }

                if (netDataDetails[country] === undefined) {
                    netDataDetails[country] = [];
                }

                netDataDetails[country].push({ Text: item.Text, Count: item.Count });
            }
        });

        // Show map
        $('#' + mapId).vectorMap({
            values: netData, scaleColors: ['#ff7713', '#d14300'],
            normalizeFunction: 'polynomial', hoverOpacity: 0.7, hoverColor: false,
            onLabelShow: function (event, label, code) {

                if (netDataDetails[code] !== undefined) {
                    var $table = $("<table />");
                    var $tr = $("<tr />").appendTo($table);

                    $("<th style='color:#090' colspan='4' />").append($("<h4/>").text(indexedCountry[code.toUpperCase()])).appendTo($tr);

                    // Get total value
                    var total = 0;
                    $.each(netDataDetails[code], function (index, item) {
                        if (item.Count > 0) {
                            total += item.Count;
                        }
                    });

                    $.each(netDataDetails[code], function (index, item) {
                        var percent = 100 * item.Count / total;
                        $tr = $("<tr style='' />").appendTo($table);

                        $("<th style='text-align:left' />").text(indexedNetwork[item.Text].Name).appendTo($tr);
                        $("<td />").text(':').appendTo($tr);
                        $("<td style='text-align:right' />").text($.formatNumber(item.Count, LILIUM.formatOptions)).appendTo($tr);
                        $("<td style='text-align:right' />").text('(' + $.formatNumber(percent, LILIUM.formatOptions) + '%)').appendTo($tr);
                    });

                    $tr = $("<tr />").appendTo($table);
                    $("<th style='text-align:left' />").html('&sum;').appendTo($tr);
                    $("<td />").text(':').appendTo($tr);
                    $("<td style='text-align:right' />").text($.formatNumber(total, LILIUM.formatOptions)).appendTo($tr);
                    $("<td />").appendTo($tr);
                    
                    label.html($table);
                }
                else {
                    label.html(indexedCountry[code.toUpperCase()]);
                }
            }
        });

    }
    else {
        $mapContainer.hide();
    }
}

