﻿function MenuCalculator(){
    var self = this;

    this.busy = false;
    this.queue = [];
    this.items = [];
    this.interpolationIdx = 0;
    this.interpolationInt = 0;
    this.INTERPOLATIONS = 20;
    this.INTERPOLATION_INTERVAL = Math.floor(1000 / this.INTERPOLATIONS);

    this.menuList;
    this.itemList;
    this.childList;
    this.totalList;
    this.selectedItems;

    this.childrenLimit = 0;
    this.numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']
   
    //setup the calc values
    self.categories = ['Calories', 'Fat', 'CaloriesFromFat', 'TransFat', 'SaturatedFat', 'Cholesterol', 'Sodium', 'Carbs', 'Fiber', 'Protein', 'Sugar'];
    self.steps = [];

    this.getMenus = function () {
        var url = lang + '/menu/?format=json';
        $.get(url, function (response) {
            var len = response.length;
            var html = '';
            var item;
            for (var i = 0; i < len; i++) {
                item = response[i];
                html += '<li><a data-id="' + item.MenuID + '"><span>' + item.Name + '</span></a></li>';
            }
            self.menuList.find('ul').html(html);
            self.menuList.find('a').click(self.getMenuItems);

           self.menuList.find('div.pane').data('jsp').reinitialise();
        });
        return false;
    }

    this.getMenuItems = function () {

        self.menuList.find('.selected').removeClass('selected');
        $(this).addClass('selected');

        var url = lang + '/menu/menu/' + $(this).attr('data-id') + '/?format=json&showHidden=false';
        $.get(url, function (response) {
            if (response) {
                self.populateItems(response.Items, self.itemList);
            }
        });
        return false;
    }

    this.populateItems = function (data, list) {
        
        var len = data.length;
        var html = '';
        var item;
        for (var i = 0; i < len; i++) {
            item = data[i];
            html += '<li><div class="menuImage"><a data-id="' + item.MenuItemID + '"><img src="' + item.Thumbnail + '"/></a></div><span><a data-id="' + item.MenuItemID + '">' + item.Name + '</a></span></li>';
        }
       
        list.find('div.pane ul').html(html);
        list.find('a').click(self.getMenuItem);
        list.show();
        list.find('div.pane').data('jsp').reinitialise();
    }

    this.getMenuItem = function () {
        var url = lang + '/menu/item/' + $(this).attr('data-id') + '/?format=json';
        $.get(url, function (response) {
            if (response) {
                if (response.Items.length == 0) {
                    var html = '<li data-id="' + response.MenuItemID + '"><div class="menuImage"><img src="' + response.Thumbnail + '"/></div>';
                    html += '<div class="info"><a class="check" data-id="' + response.MenuItemID + '"><span class="check">&nbsp;</span>';
                    html += '<span class="name">' + response.Name + '</span></a>';
                    html += '</div></li>';
                    html = $(html);
                    html.find('a').click(self.setSelected);

                    self.selectedItems.find('ul:first').append(html);
                    $('#menuCalculator div.selected-items div.pane').data('jsp').reinitialise();
                    self.addItem(response);
                }
                else {
                    var item = response;
                    self.childrenLimit = parseInt(item.ChildrenLimit);

                    var list = self.childList;
                    var data = response.Items;
                    var len = data.length;
                    var html = '<li class="parent" data-id="' + item.MenuItemID + '"><div class="menuImage"><img src="' + item.Thumbnail + '"/></div><span>' + item.Name + '</span>';

                    if (self.childrenLimit > 0) {
                        html += '<h4>Pick any ' + self.numbers[self.childrenLimit] + ' items</h4>';
                    }
                    html += '</li>';

                    for (var i = 0; i < len; i++) {
                        item = data[i];
                        html += '<li class="child"><a data-id="' + item.MenuItemID + '"><div class="cell"><span class="check"></span></div><span class="name">' + item.Name + '</span></a></li>';
                    }

                    html += '<li class="add"><a><span class="name">Add item</span></a></li>';

                    list.find('div.pane ul').html(html);
                    list.find('li.child a').click(self.setSelectedChildren);
                    list.find('li.add a').click(self.addSelectedChildren);
                    list.show();
                    list.find('div.pane').data('jsp').reinitialise();
                }
            }
        });
        return false;
    }


    this.checkSelected = function (target) {
        if (target.hasClass('selected')) {
            target.removeClass('selected');
        } else {
            target.addClass('selected');
        }
    }

    this.setSelected = function () {
        self.checkSelected($(this));
    }

    this.setSelectedChildren = function () {
        var proceed = true;
        if (self.childrenLimit > 0) {

            if ($(this).hasClass('selected') == false) {
                var count = self.childList.find('li a.selected').length;
                if (count >= self.childrenLimit) {
                    proceed = false;
                }
            }
        }

        if (proceed) {
            self.checkSelected($(this));
        }

    }

    this.getSelectedChild = function (id, items) {
        var len = items.length;
        var item;
        for (var i = 0; i < len; i++) {
            item = items[i];
            if (item.MenuItemID == id) {
                return item;
            }
        }
        return null;
    }

    this.addNutritionTo = function (child, parent) {
        var len = self.categories.length;
        var category;
        for (var i = 0; i < len; i++) {
            category = self.categories[i];
            parent[category] += parseInt(child[category]);
        }
    }

    this.resetNutrition = function (item) {
        var len = self.categories.length;
        var category;
        for (var i = 0; i < len; i++) {
            category = self.categories[i];
            item[category] = 0;
        }
    }

    this.addSelectedChildren = function (item) {
        var items = $('div.child-items a.selected');
        var childIds = []
        items.each(function (index, element) {
            childIds.push($(this).attr('data-id'));
        });

        var pid = self.childList.find('li.parent').attr('data-id');

        var url = lang + '/menu/item/' + pid + '/?format=json';
        $.get(url, function (response) {
            if (response) {

                //add parent
                var item = response;

                //create unique for parent based on child ids
                item.MenuItemID = item.MenuItemID + '-' + childIds.join('-');
                self.resetNutrition(item);
                var html = '<li class="parent" data-id="' + response.MenuItemID + '"><div class="menuImage"><img src="' + response.Thumbnail + '"/></div><div class="info"><a class="check" data-id="' + response.MenuItemID + '"><span class="check">&nbsp;</span><span class="name">' + response.Name + '</span>';
                var len = childIds.length;
                var child;

                html += '<ul class="children">';
                var idx;
                for (var i = 0; i < len; i++) {
                    child = self.getSelectedChild(childIds[i], response.Items);

                    if (child) {
                        html += '<li data-id="' + child.MenuItemID + '" class="child"><span class="name">' + child.Name + '</span></li>';
                        //add the nutrition info onto the parent
                        self.addNutritionTo(child, item);
                    }
                }

                html += '</ul></a></div><div class="clear">&nbsp;</div></li>';

                html = $(html);


                self.selectedItems.find('ul:first').append(html);

                html.find('a').click(self.setSelected);


                $('#menuCalculator div.selected-items div.pane').data('jsp').reinitialise();
                self.addItem(item);

            }

        });
    }

    this.addItem = function (item) {

        if (self.busy == false) {
            self.busy = true;
            self.items.push(item);
            var len = self.categories.length;

            for (var i = 0; i < len; i++) {
                self.calculateStep(self.categories[i], item[self.categories[i]]);
            }

            this.updateTotals();
        } else {
            self.queue.push(item);
        }

    }

    this.getItemIndex = function (id) {
        var len = self.items.length;
        var idx = false;
        var item = null;
        for (var i = 0; i < len; i++) {
            item = self.items[i];
            if (item.MenuItemID == id) {
                idx = i;
                break;
            }
        }
        return idx;
    }

    this.getItem = function (id) {
        var idx = self.getItemIndex(id);
        var item = null;
        if (idx !== false) {
            item = self.items[idx];
        }
        return item;
    }

    this.removeItem = function (id) {
        var idx = self.getItemIndex(id);
        var item = null;
        if (idx !== false) {
            item = self.items.splice(idx, 1)[0];
        }
        return item;
    }


    this.calculateStep = function (label, value) {
        if (value == null || isNaN(value)) value = 0;
        var step = parseInt(value) / self.INTERPOLATIONS;
        self.steps[label] = step;
    }

    this.updateTotals = function () {
        self.busy = true;
        self.interpolationIdx = 0;
        self.interpolationInt = setTimeout(self.interpolate, self.INTERPOLATION_INTERVAL);

    }

    this.interpolate = function () {
        if (self.interpolationIdx < self.INTERPOLATIONS) {

            var len = self.categories.length;
            for (var i = 0; i < len; i++) {
                self.setTotal(self.categories[i]);
            }

            self.interpolationIdx++;
            self.interpolationInt = setTimeout(self.interpolate,self.INTERPOLATION_INTERVAL);
        } else {
            self.busy = false;
            self.checkQueue();
        }

    }

    this.setTotal = function (label) {
        var target = self.totalList.find('li.' + label + ' span')
        var currValue = parseFloat(target.attr('data-value'));
        var value = self.steps[label] + currValue;
        if (value < 0) value = 0;
        target.html(Math.round(value));
        target.attr('data-value', value);
    }

    this.checkQueue = function () {
        if (self.queue.length > 0) {
           
            var item = self.queue.pop();
            self.addItem(item);
        } 
    }
   
    

    this.round = function (value) {
        return Math.round(value * 100) / 100;
    }

    this.deleteItems = function () {

        var id;
        var item;
        var cat;
        var removed = [];
        var len = self.categories.length;

        //get removed totals
        for (var i = 0; i < len; i++) {
            removed[self.categories[i]] = 0;
        }

        self.selectedItems.find('a.selected').parent().parent().each(function (index, element) {
            id = $(this).attr('data-id')

            item = self.removeItem(id);
            for (var i = 0; i < len; i++) {
                cat = self.categories[i];
                removed[cat] = removed[cat] - parseInt(item[cat]);
            }
            $(this).remove();

        });

        $('#menuCalculator div.selected-items div.pane').data('jsp').reinitialise();

        if (self.busy == false) {
            for (i = 0; i < len; i++) {
                self.calculateStep(self.categories[i], removed[self.categories[i]]);
            }
            self.updateTotals();
        } else {
            self.queue.push(removed);
        }



    }



    this.printItems = function () {
        var ids = [];
        var len = self.items.length;
        var id;
        for (var i = 0; i < len; i++) {

            ids.push(self.items[i].MenuItemID);
        }

        window.open("/" + lang + "/menu/printcalculator?ids=" + ids);

        return false;
    }

    this.clearItems = function () {
        self.selectedItems.find('ul').html('');
        $('#menuCalculator div.selected-items div.pane').data('jsp').reinitialise();
        self.items = [];

        var removed = [];
        var len = self.categories.length;

        for (var i = 0; i < len; i++) {
            removed[self.categories[i]] = parseInt(self.totalList.find('li.' + self.categories[i] + ' span').html()) * -1;
        }

        for (i = 0; i < len; i++) {
            
            self.calculateStep(self.categories[i], removed[self.categories[i]]);
        }

        self.updateTotals();



    }

    this.closeItemsMenu = function () {
        $('#menuCalculator div.menu-items').hide();
        return false;
    }

    this.closeChildMenu = function () {
        $('#menuCalculator div.child-items').hide();
        return false;
    }

    this.init = function () {

       
        this.menuList = $('#menuCalculator div.menus');
        this.itemList = $('#menuCalculator div.menu-items');
        this.childList = $('#menuCalculator div.child-items');
        this.totalList = $('#menuCalculator div.totals');
        this.selectedItems = $('#menuCalculator div.selected-items');
        this.pointer = $('#menuCalculator div.items div.pointer');

        $('#menuCalculator div.menu-items a.close').click(self.closeItemsMenu);
        $('#menuCalculator div.child-items a.close').click(self.closeChildMenu);

        $('#menuCalculator a.delete').click(self.deleteItems);
        $('#menuCalculator a.print').click(self.printItems);
        $('#menuCalculator a.clear').click(self.clearItems);

        var len = self.categories.length;
        for (var i = 0; i < len; i++) {
            self.steps[self.categories[i]] = 0;
            self.totalList.find('li.' + self.categories[i] + ' span').html(0);
            self.totalList.find('li.' + self.categories[i] + ' span').attr('data-value', 0);

        }

      
        $('#menuCalculator div.menus div.pane').jScrollPane();
        $('#menuCalculator div.menu-items div.pane').jScrollPane();
        $('#menuCalculator div.child-items div.pane').jScrollPane();
        $('#menuCalculator div.selected-items div.pane').jScrollPane();
        self.getMenus();

        //hack to prevent re-init after window has been opened
        self.init = function () {
            
            return false;
        }
    }

    

};
