/* Minification failed. Returning unminified contents.
(1,10): run-time error CSS1031: Expected selector, found 'LiveTrigger('
(1,10): run-time error CSS1025: Expected comma or open brace, found 'LiveTrigger('
(17,10): run-time error CSS1031: Expected selector, found 'hashparam('
(17,10): run-time error CSS1025: Expected comma or open brace, found 'hashparam('
(72,5): run-time error CSS1031: Expected selector, found '$'
(72,5): run-time error CSS1025: Expected comma or open brace, found '$'
(74,10): run-time error CSS1031: Expected selector, found 'FloorGuideViewModel('
(74,10): run-time error CSS1025: Expected comma or open brace, found 'FloorGuideViewModel('
(301,10): run-time error CSS1031: Expected selector, found 'FloorGuideSearchViewModel('
(301,10): run-time error CSS1025: Expected comma or open brace, found 'FloorGuideSearchViewModel('
(338,10): run-time error CSS1031: Expected selector, found 'FloorGroupCollectionViewModel('
(338,10): run-time error CSS1025: Expected comma or open brace, found 'FloorGroupCollectionViewModel('
(354,10): run-time error CSS1031: Expected selector, found 'FloorGroupViewModel('
(354,10): run-time error CSS1025: Expected comma or open brace, found 'FloorGroupViewModel('
(461,10): run-time error CSS1031: Expected selector, found 'RoutingModel('
(461,10): run-time error CSS1025: Expected comma or open brace, found 'RoutingModel('
(611,10): run-time error CSS1031: Expected selector, found 'SceneViewModel('
(611,10): run-time error CSS1025: Expected comma or open brace, found 'SceneViewModel('
(772,10): run-time error CSS1031: Expected selector, found 'ColorGroupViewModel('
(772,10): run-time error CSS1025: Expected comma or open brace, found 'ColorGroupViewModel('
(785,10): run-time error CSS1031: Expected selector, found 'ColorViewModel('
(785,10): run-time error CSS1025: Expected comma or open brace, found 'ColorViewModel('
(795,10): run-time error CSS1031: Expected selector, found 'RoomTypeViewModel('
(795,10): run-time error CSS1025: Expected comma or open brace, found 'RoomTypeViewModel('
(808,10): run-time error CSS1031: Expected selector, found 'RoomViewModel('
(808,10): run-time error CSS1025: Expected comma or open brace, found 'RoomViewModel('
(817,10): run-time error CSS1031: Expected selector, found 'SettingsViewModel('
(817,10): run-time error CSS1025: Expected comma or open brace, found 'SettingsViewModel('
(822,10): run-time error CSS1031: Expected selector, found 'SystemViewModel('
(822,10): run-time error CSS1025: Expected comma or open brace, found 'SystemViewModel('
(962,10): run-time error CSS1031: Expected selector, found 'hideFilters('
(962,10): run-time error CSS1025: Expected comma or open brace, found 'hideFilters('
(982,10): run-time error CSS1031: Expected selector, found 'FloorViewModel('
(982,10): run-time error CSS1025: Expected comma or open brace, found 'FloorViewModel('
(1106,10): run-time error CSS1031: Expected selector, found 'FilterCollectionViewModel('
(1106,10): run-time error CSS1025: Expected comma or open brace, found 'FilterCollectionViewModel('
(1133,10): run-time error CSS1031: Expected selector, found 'FilterGroupViewModel('
(1133,10): run-time error CSS1025: Expected comma or open brace, found 'FilterGroupViewModel('
(1170,10): run-time error CSS1031: Expected selector, found 'FilterOptionViewModel('
(1170,10): run-time error CSS1025: Expected comma or open brace, found 'FilterOptionViewModel('
(1211,10): run-time error CSS1031: Expected selector, found 'CompareViewModel('
(1211,10): run-time error CSS1025: Expected comma or open brace, found 'CompareViewModel('
(1275,10): run-time error CSS1031: Expected selector, found 'SelectionViewModel('
(1275,10): run-time error CSS1025: Expected comma or open brace, found 'SelectionViewModel('
(1339,10): run-time error CSS1031: Expected selector, found 'getComboFilter('
(1339,10): run-time error CSS1025: Expected comma or open brace, found 'getComboFilter('
(1382,1): run-time error CSS1019: Unexpected token, found '$'
(1382,23): run-time error CSS1031: Expected selector, found '='
(1382,23): run-time error CSS1025: Expected comma or open brace, found '='
(1384,1): run-time error CSS1019: Unexpected token, found '$'
(1384,2): run-time error CSS1019: Unexpected token, found '('
(1384,3): run-time error CSS1019: Unexpected token, found ''.dropup''
(1384,12): run-time error CSS1019: Unexpected token, found ')'
(1384,14): run-time error CSS1030: Expected identifier, found 'on('
(1384,14): run-time error CSS1019: Unexpected token, found 'on('
(1384,17): run-time error CSS1019: Unexpected token, found '"click"'
(1384,24): run-time error CSS1019: Unexpected token, found ','
(1384,26): run-time error CSS1019: Unexpected token, found '".dropdown-submenu a.toggle-trigger"'
(1384,62): run-time error CSS1019: Unexpected token, found ','
(1384,73): run-time error CSS1031: Expected selector, found '('
(1384,73): run-time error CSS1025: Expected comma or open brace, found '('
(1388,2): run-time error CSS1019: Unexpected token, found ')'
(1390,10): run-time error CSS1031: Expected selector, found 'ToggleActive('
(1390,10): run-time error CSS1025: Expected comma or open brace, found 'ToggleActive('
(1403,10): run-time error CSS1031: Expected selector, found 'ToggleActiveGroup('
(1403,10): run-time error CSS1025: Expected comma or open brace, found 'ToggleActiveGroup('
(1408,10): run-time error CSS1031: Expected selector, found 'EventLanguage('
(1408,10): run-time error CSS1025: Expected comma or open brace, found 'EventLanguage('
(1417,10): run-time error CSS1031: Expected selector, found 'colorCode('
(1417,10): run-time error CSS1025: Expected comma or open brace, found 'colorCode('
(1439,10): run-time error CSS1031: Expected selector, found 'AnimateAddFavorite('
(1439,10): run-time error CSS1025: Expected comma or open brace, found 'AnimateAddFavorite('
 */
function LiveTrigger(delay, callback, subscribeTo) {
    var self = this;
    self.delay = delay;
    self.callback = callback;
    self.timer = null;
    self.trigger = function () {
        window.clearTimeout(self.timer);
        self.searchTimer = window.setTimeout(self.callback, delay);
    };
    self.stop = function () {
        window.clearTimeout(self.timer);
    };

    if (subscribeTo)
        subscribeTo.subscribe(self.trigger);
}
function hashparam() {
    var main = this;
    main.params = new Array();
    main.remove = function (id) { main.set(id, null); };
    main.clear = function () { main.params = new Array(); };
    main.get = function (id) {
        var a = main.params;
        for (var i = 0; i < a.length; i++)
            if (a[i].id == id)
                return a[i];
    };
    main.set = function (id, value) {
        var a = main.params;
        for (var i = 0; i < a.length; i++) {
            if (a[i].id == id) {
                if (value == null)
                    a.splice(i, 1);
                else
                    a[i].value = value;
                return;
            }
        }

        if (value != null)
            a.push({ id: id, value: value });
    }
    main.update = function () {
        var url = document.URL.indexOf('#') > -1 ? document.URL.substr(0, document.URL.indexOf('#')) : document.URL;
        window.location.href = url + '#' + main.toString();
    };
    main.toString = function () {
        var r = '';
        var a = main.params;
        for (var i = 0; i < a.length; i++) {
            r += a[i].id + '=' + a[i].value + '&';
        } 
        return r.replace(/&*$/gm, '');
    };
    main.load = function () {
        main.params = new Array();
        var x = document.URL.indexOf('#');
        if (x > -1) {
            var hash = document.URL.substr(x + 1);
            var split = hash.split('&');
            for (var i = 0; i < split.length; i++) {
                if (split[i]) {
                    var iv = split[i].split('=');

                    if (iv && iv.length == 2)
                        main.set(iv[0], iv[1]);
                }
            }
        }
    };
}
var $ = jQuery.noConflict();

function FloorGuideViewModel() {

    var self = this;

    self.uniqueID = '';
    self.selected = new SelectionViewModel();
    self.eventPrefix = 'Wood';
    self.floors = ko.observableArray();
    self.settings = new SettingsViewModel(self);
    self.search = new FloorGuideSearchViewModel(self);
	self.filters = new FilterCollectionViewModel();
    self.roomTypes = ko.observableArray();
    self.icons = ko.observableArray();
    self.colorGroups = ko.observableArray();
	self.scene = new SceneViewModel(self);
	self.system = new SystemViewModel(self);
    self.route = new RoutingModel(self);
    self.floorGroups = ko.observableArray();
    self.shownProductCount = ko.observable(24);
    self.productCountTemplate = ko.observable('');
    self.productShowFloorsTemplate = ko.observable('');
    self.sortingOptions = ko.observable([]);
    self.sortingOptionsExpanded = ko.observable(false);
    self.wideSort = ko.observable(false);
    self.sortGroupDefault = function (x, y) {
        return x.minIndex() - y.minIndex();
    };

    self.sortGroupPriceAsc = function (x, y) {
        return x.minPrice() - y.minPrice();
    };

    self.sortGroupPriceDesc = function (x, y) {
        return y.maxPrice() - x.maxPrice();
    };

    self.productCount = ko.computed(function () {
        var group = self.selected.floorGroup();

        if (group == null)
            return 0;

        var count = 0;
        var groups = group.items();

        for (var g = 0; g < groups.length; g++) {
            var floors = groups[g].floors();

            for (var i = 0; i < floors.length; i++)
                if (floors[i].visible())
                    count++;
        }

        return count;
    });
    self.productCountText = ko.computed(function () { return self.productCountTemplate() == null ? null : self.productCountTemplate().replace('{0}', self.productCount()); });
    self.showFloorsText = ko.computed(function () { return self.productShowFloorsTemplate() == null ? null : self.productShowFloorsTemplate().replace('{0}', self.productCount()); });

    self.shouldShowGroupBy = ko.observable(false);
    self.shouldShowFilters = ko.observable(false);
    self.clickTakesUserToProductPage = ko.observable(false);



    self.toggleFilter = function() {
        self.shouldShowFilters(!self.shouldShowFilters());
        $('#filterCollapse').collapse("toggle");

        if (self.system.setTitleHeights)
            self.system.setTitleHeights();

        if (self.shouldShowFilters()) {
            $('#filterSummary').hide();
        } else {
            $('#filterSummary').show();
        }
    };

    self.visibleFloorGroups = ko.computed(function () {
        var result = [];
        var count = 0;
        var fg = self.selected.floorGroup();

        if (!fg)
            return result;

        var fgitems = fg.items();

        // sort
        var sort = self.selected.sortingOption();

        if (sort == null)
            fgitems.sort(self.sortGroupDefault);
        else if (sort.Id == 'PRICE_ASC')
            fgitems.sort(self.sortGroupPriceAsc);
        else if (sort.Id == 'PRICE_DESC')
            fgitems.sort(self.sortGroupPriceDesc);
        else
            fgitems.sort(self.sortGroupDefault);

        // determine which to show
        for (var i = 0; i < fgitems.length; i++) {
            var group = fgitems[i];

            if (!group.visible())
                continue;

            var floors = group.sortedFloors();
            var showGroup = false;

            for (var f = 0; f < floors.length; f++) {
                if (floors[f].visible())
                {
                    floors[f].show(count < self.shownProductCount());

                    if (count < self.shownProductCount()) {
                        count++;
                        showGroup = true;
                    }
                }
                else
                    floors[f].show(false);
            }

            if (showGroup)
                result.push(group);
        }

        return result;
    });

    self.findFloor = function (id) {
        var floors = self.floors();

        for (var i = 0; i < floors.length; i++) {
            if (floors[i].id == id)
                return floors[i];
        }
    };

    self.sharePintrest = function (f) {
        var shareUrl = window.location.href;

        var name = f.name;
        var picture = 'http://' + document.domain + f.getThumbnail();

        var socialurl = 'http://www.pinterest.com/pin/create/button/?url=' + shareUrl + '&media=' + picture + '&description=' + name;
        var socialWin = window.open(socialurl, 'pintrest', 'width=500,height=275');
        socialWin.focus();
    };

    self.updateShown = function () {
        var isos = $('.iso.scroll');

        if (isos.length == 0)
            return;

        var maxtop = $(isos[0]).offset().top;

        for (var i = 1; i < isos.length; i++)
            if (maxtop < $(isos[i]).offset().top)
                maxtop = $(isos[i]).offset().top;

        if ($(window).scrollTop() + $(window).height() > maxtop - 200)
            self.shownProductCount(self.shownProductCount() + 24);
    };

    self.loadData = function (model, nofilter) {

        self.data = model;
        self.productCountTemplate(model.ProductCountText);
        self.productShowFloorsTemplate(model.ProductShowFloorsText);
        self.wideSort(model.WideSort);

		self.floors([]);
		self.roomTypes([]);
		self.colorGroups([]);
        self.floorGroups([]);
        self.eventPrefix = model.GAEventCategoryPrefix;

        for (var i = 0; i < model.Icons.length; i++)
            self.icons.push(model.Icons[i]);

		for (var i = 0; i < model.Floors.length; i++)
            self.floors.push(new FloorViewModel(model.Floors[i], self));

		for (var i = 0; i < model.RoomTypes.length; i++)
			self.roomTypes.push(new RoomTypeViewModel(model.RoomTypes[i], self));

		for (var i = 0; i < model.Colors.length; i++)
			self.colorGroups.push(new ColorGroupViewModel(model.Colors[i], self));

		for (var i = 0; i < model.FloorGroups.length; i++)
            self.floorGroups.push(new FloorGroupCollectionViewModel(model.FloorGroups[i], self));

		if (self.roomTypes().length > 0)
			self.roomTypes()[0].select();

		if (self.colorGroups().length > 0)
			self.colorGroups()[0].select();

        if (model.SortingOptions && model.SortingOptions.length) {
            self.selected.sortingOption(model.SortingOptions[0]);
            self.sortingOptions(model.SortingOptions);
        }

        if (!nofilter)
            self.filters.loadData(model);

        self.shouldShowGroupBy(self.floorGroups().length > 1);

        self.scene.loadData(model);

        self.clickTakesUserToProductPage(model.ClickTakesUserToProductPage);

        Cookies.set('isCommercial', model.IsCommercial);

        //self.selected.filterOptions.subscribe(function (change) {
        //    if (self.shownProductCount() != 10000)
        //        self.shownProductCount(10000);
        //});
        $(window).on('scroll', function (e) { self.updateShown(); });
    };

    self.toggleFilter();
}

function FloorGuideSearchViewModel(root) {

    var self = this;

    self.root = root;
    self.submit = function () { self.liveTrigger.stop(); self.filterWithSearch(true); };
    self.filterWithSearch = ko.observable(false);
    self.query = ko.observable('');
    self.liveTrigger = new LiveTrigger(300, self.submit, self.query);

    self.clear = function () {
        self.query('');
        self.filterWithSearch(false);
    };

    self.createFilter = function () {
        if (self.query() == "") {
            self.filterWithSearch(false);
            return "*";
        }

        return "[data-keywords*='" + self.query().toLowerCase() + "']";

        var parts = self.query().toLowerCase().split(' ');
        var filter = '';

        for (var i = 0; i < parts.length; i++) {
            filter += "[data-keywords*='" + parts[i] + "']";

            if (i + 1 < parts.length)
                filter += ', ';
        }

        return filter;
    };
}

function FloorGroupCollectionViewModel(model, root)
{
    var self = this;
    self.id = model.ID;
    self.text = model.Text;
    self.root = root;
    self.selected = ko.computed(function () { return self.root.selected.floorGroup() != null && self.root.selected.floorGroup().id == self.id });
    self.select = function () {
        self.root.selected.floorGroup(self);
    };
    self.items = ko.observableArray([]);

    for (var i = 0; i < model.Items.length; i++)
        self.items.push(new FloorGroupViewModel(model.Items[i], root));
}

function FloorGroupViewModel(data, root) {
	var self = this;
	self.root = root;
    self.id = data.ID;
    self.index = data.Index;
    self.header = ko.observable(data.Header);
    self.displayHeader = ko.computed(function () { return colorCode(self.header()) });
    self.text = data.Text;
    self.selector = data.Selector;

	self.floors = ko.computed(function () {
		var result = [];
		var src = root.floors();

		for (var i = 0; i < src.length; i++)
			if (self.selector == '*' || (self.selector && src[i].hasCssClass(self.selector.replace('.', ''))))
				result.push(src[i]);

		return result;
    });

    self.minIndex = ko.computed(function () {
        var min = 10000000000;

        var floors = self.floors();

        for (var i = 0; i < floors.length; i++)
            if (floors[i].sortIndex || floors[i].sortIndex == 0)
                min = Math.min(floors[i].sortIndex, min);

        return min;
    });


    self.minPrice = ko.computed(function () {
        var min = 10000000000;

        var floors = self.floors();

        for (var i = 0; i < floors.length; i++)
            if (floors[i].price)
                min = Math.min(floors[i].price, min);

        return min;
    });

    self.maxPrice = ko.computed(function () {
        var max = -10000000000;

        var floors = self.floors();

        for (var i = 0; i < floors.length; i++)
            if (floors[i].price)
                max = Math.max(floors[i].price, max);

        return max;
    });

    self.sortIndexAsc = function (x, y) {
        return x.sortIndex - y.sortIndex;
    };

    self.sortPriceAsc = function (x, y) {
        return x.price - y.price;
    };

    self.sortPriceDesc = function (x, y) {
        return y.price - x.price;
    };

    self.sortedFloors = ko.computed(function () {
        var sort = root.selected.sortingOption();
        var floors = self.floors();


        if (floors == null) {
            return;
        }

        if (sort == null || sort.Id == 'NONE' || !sort.Id) {
            floors.sort(self.sortIndexAsc);
        }
        else if (sort.Id == 'PRICE_ASC') {
            floors.sort(self.sortPriceAsc);
        }
        else if (sort.Id == 'PRICE_DESC') {
            floors.sort(self.sortPriceDesc);
        }
        else {
            floors.sort(self.sortIndexAsc);
        }

        return floors;
    });

    self.visible = ko.computed(function () {
        var floors = self.floors();

        for (var i = 0; i < floors.length; i++) {
            if (floors[i].visible())
                return true;
        }

        return false;
    });
}

function RoutingModel(root) {
	var self = this;
	self.root = root;
    self.hash = new hashparam();
    self.updatesPaused = false;

    self.update = function () {
        if (self.updatesPaused)
            return;

		self.hash.clear();
		var sel = self.root.selected;
		var fo = sel.filterOptions();

		for (var i = 0; i < fo.length; i++) {
			var id = fo[i].group.id();
			var val = fo[i].id();
			var gval = self.hash.get(id);

			if (gval)
				self.hash.set(fo[i].group.id(), gval.value + ',' + val);
			else
				self.hash.set(fo[i].group.id(), val);
        }

        //Cookies.set(self.root.uniqueID + 'floorguide-filters', self.hash.toString()); // save it before setting "g"/group

        self.hash.set('g', root.selected.floorGroup().id);

        self.hash.update();
	};

    self.init = function () {
        if (document.URL.indexOf('clear=all') > -1) {
            //if (self.root) {
            //    Cookies.remove(self.root.uniqueID + 'floorguide-filters');
            //    Cookies.remove(self.root.uniqueID + 'roomId');
            //    Cookies.remove(self.root.uniqueID + 'floorId');
            //}
            //else
            //    console.error('self.root is null');

            self.hash.load();
            self.hash.remove('clear');
            self.hash.update();
        }

        //if (document.URL.indexOf('#') == -1 && Cookies.get(self.root.uniqueID + 'floorguide-filters')) {
        //    var url = document.URL.indexOf('#') > -1 ? document.URL.substr(0, document.URL.indexOf('#')) : document.URL;
        //    window.location.href = url + '#' + Cookies.get(self.root.uniqueID + 'floorguide-filters');
        //    self.hash.load();
        //}

        var selectedFloor = self.hash.get('select-floor');

        self.loadData();

        self.root.selected.filterOptions.subscribe(function (change) { self.update(); });
        self.root.selected.floorGroup.subscribe(function (changes) {
            self.update();

            if (dataLayer && changes) {
                dataLayer.push({ 'event': 'GAEvent', 'eventCategory': self.root.eventPrefix + ' Filter', 'eventAction': 'displaygroup', 'eventLabel': changes.id, 'eventValue': null });
            }
        });

        var floors = self.root.floors();

        if (selectedFloor)
            for (var i = 0; i < floors.length; i++)
                if (floors[i].articleId == selectedFloor.value)
                    floors[i].select();

        window.addEventListener('hashchange', self.hashChanged);
    };

    self.hashChanged = function () {
        if (document.URL.indexOf('clear=all') > -1) {

            //console.log(document.URL);

            //if (self.root) {
            //    Cookies.remove(self.root.uniqueID + 'floorguide-filters');
            //    Cookies.remove(self.root.uniqueID + 'roomId');
            //    Cookies.remove(self.root.uniqueID + 'floorId');
            //}
            //else
            //    console.error('self.root is null');

            self.hash.load();
            self.updatesPaused = true;
            self.root.selected.clearFilters();
            self.loadData();
            self.hash.remove('clear');
            self.updatesPaused = false;
            self.hash.update();
        }
    };

    self.loadData = function () {
		var arr = new Array();

		arr = arr.concat(self.root.filters.otherFilters());
		arr.push(self.root.filters.color);
		arr.push(self.root.filters.wearresistance);
        arr.push(self.root.filters.grading);
        arr.push(self.root.filters.collection);

		for (var g = 0; g < arr.length; g++) {
			var group = arr[g];
			var url = self.hash.get(group.id());

            //console.log(group.id()  + ' : ' + url);

            if (!url)
                continue;

            var selected = url.value.toLowerCase().split(',');
            var options = group.options();
            for (var i = 0; i < options.length; i++) {
                var filter = options[i];

                var found = false;

                for (var s = 0; s < selected.length; s++)
                    if (filter.id().toLowerCase() == selected[s]) {
                        found = true;
                        break;
                    }

                filter.selected(found);
            }
		}

        var groupid = self.hash.get('g');

        if (groupid) {
            for (var i = 0; i < root.floorGroups().length; i++)
                if (root.floorGroups()[i].id == groupid.value)
                    root.floorGroups()[i].select();
        }
        else {
            if (root.floorGroups().length > 0 && root.selected.floorGroup() == null)
                root.floorGroups()[0].select();
        }
    };

    self.hash.load();
}

function SceneViewModel(root) {
	var self = this;
	self.root = root;
	self.url = ko.observable('');
	self.fullscreen = ko.observable(false);
	self.loadingUrl = ko.observable('');
	self.compareUrl = ko.observable(null);
	self.defaultColor = ko.observable(null);
    self.defaultRoomId = ko.observable(0);
    self.defaultRoom = ko.observable(null);
	self.defaultFloor = ko.observable(null);
    self.hideBoxes = ko.observable(false);
    self.iframeLoaded = ko.observable(false);
    self.iframeFloorReady = ko.observable(false);
    self.iframeVisible = ko.computed(function () { return self.root.selected.floor() != null && self.iframeLoaded() && self.iframeFloorReady() });
    self.showIframe = function () {
        if ($('#iframe').length && !$('#iframe').attr('src'))
            $('#iframe').attr('src', $previewUrl);
    };

	self.selectedSceneUrl = function () {
		var s = root.selected;
		return self.makeSceneUrl(s.room(), s.color(), s.direction(), s.floor());
	};

	self.toggleFullscreen = function () {
		self.fullscreen(!self.fullscreen());
	};

    self.makeSceneUrl = function (room, color, direction, floor, size) {
        var roomId = 0;

		if (room == null)
            roomId = self.defaultRoomId();

		if (size == null)
			size = 'original';

		if (color == null)
			color = self.defaultColor();

		if (floor == null)
			floor = self.defaultFloor();

		if (direction == null)
			direction = 0;

        var artnr = null;

        if (floor != null) {
            if (floor.fullArticleId)
                artnr = floor.fullArticleId;

            if (artnr == null && floor.articleId)
                artnr = floor.articleId;

            if (artnr == null && floor.productAONumber)
                artnr = floor.productAONumber;
        }

        var url = '/images/rooms/' + size + '/' +
            (floor == null ? '151XADEKWJ' : artnr) + '__' +
            (room == null ? roomId : room.id()) + '.jpg';

        if (direction > 0)
            url += '?rotation=' + direction;

		if (typeof (Storage) != "undefined") {
			// Strore url
			localStorage.setItem("FGImageUrl", url);
		}

		return url;
	};

	self.selectedDataChanged = function (changes) {
		// add delay if there are a lot of changes (like a reset)
		//self.url(self.selectedSceneUrl());
		self.loadingUrl(self.selectedSceneUrl());
		if (changes)
			$('.compare-1 .image-thumbnail').animate({ 'left': '-250px', opacity: 0 }, 400);
	};

	self.compareChanged = function (changes) {
		var floor = self.root.selected.compare.floor();

		if (floor == null)
			self.compareUrl(null);
		else {
			var s = root.selected;
			self.compareUrl(self.makeSceneUrl(s.room(), s.color(), s.direction(), floor));
        }

        var topelm = $('#iframe');

        if (topelm.length == 0)
            topelm = $('.compare-container');

		//$('html,body').animate({
  //          scrollTop: topelm.offset().top
		//}, 1000);
	};

	self.loadData = function (model) {
		var route = self.root.route;

        if (!model.preventSceneSubscriptions)
            self.createSubscriptions();

        $.each(self.root.floors(), function (idx, elm) {
            if (elm.id == model.DefaultFloorID) {
                self.defaultFloor(elm);
            }
        });

        $.each(self.root.roomTypes(), function (idx, roomType) {
            $.each(roomType.rooms(), function (i2, room) {
                if (room.id() == model.DefaultRoomID) {
                    self.defaultRoom(room);
                    room.select();
                }
            });
        });

        self.defaultRoomId(model.DefaultRoomID);

        $.each(self.root.colorGroups(), function (i, group) {
			$.each(group.colors(), function (i2, color) {
				if (color.id == model.DefaultColorID) {
					self.defaultColor(color);
					color.select();
				}
			});
		});

        self.url(self.selectedSceneUrl());

        if ($('.floor-guide-content img.swap').length > 0)
		    $('.floor-guide-content img.swap')[0].onload = self.swapImageLoaded;
	}

	self.swapImageLoaded = function () {
		var swap = $('.floor-guide-content img.swap');
		swap.animate({ opacity: 1 }, 700, function () {
			self.url(self.loadingUrl());
			swap.css('opacity', 0);
			if (self.root.selected.floor())
				$('.compare-1 .image-thumbnail').animate({ 'left': '50px', opacity: 1 }, 800);
			self.loadingUrl(null);
		});
	};

    self.createSubscriptions = function () {
        self.root.selected.compare.floor.subscribe(self.compareChanged);
        self.root.selected.floor.subscribe(self.selectedDataChanged);
        self.root.selected.direction.subscribe(self.selectedDataChanged);
        self.root.selected.room.subscribe(self.selectedDataChanged);
        self.root.selected.color.subscribe(self.selectedDataChanged);
    };
}

function ColorGroupViewModel(data, root) {
	var self = this;
	self.root = root;
	self.id = data.ID;
	self.name = ko.observable(data.Name);
	self.colors = ko.observableArray();
	self.select = function () { root.selected.colorGroup(self); }
	self.selected = ko.computed(function () { return root.selected.colorGroup() == self; });

	for (var i = 0; i < data.Colors.length; i++)
		self.colors.push(new ColorViewModel(data.Colors[i], root));
}

function ColorViewModel(data, root) {
	var self = this;
	self.root = root;
	self.id = data.ID;
	self.colorCode = data.ColorCode;
	self.name = ko.observable(data.Name);
	self.select = function () { root.selected.color(self); }
	self.selected = ko.computed(function () { return root.selected.color() == self; });
}

function RoomTypeViewModel(data, root) {
	var self = this;
	self.root = root;
	self.id = data.ID;
	self.name = ko.observable(data.Name);
	self.rooms = ko.observableArray();
	self.select = function () { root.selected.roomType(self); }
	self.selected = ko.computed(function () { return root.selected.roomType() == self; });

	for (var i = 0; i < data.Rooms.length; i++)
		self.rooms.push(new RoomViewModel(data.Rooms[i], root));
}

function RoomViewModel(data, root) {
	var self = this;
	self.root = root;
	self.name = data.Name;
	self.id = ko.observable(data.ID);
    self.image = function () { return root.scene.makeSceneUrl(self, null, 0, null, 'medium2x1'); };
	self.select = function () { root.selected.room(self); };
}

function SettingsViewModel(root) {
    var self = this;
    self.defaultFloorCssClasses = 'iso pointer col-md-4 col-6';
}

function SystemViewModel(root) {
	var self = this;
	self.root = root;
	self.resize = function () {
		var height = $(window).height();
		var iheight = $('.compare-container img.preview.main').height();
		height = height * (root.scene.fullscreen() ? 0.9 : 0.65);

		if (iheight != 0 && iheight < height) // if image is smaller, use that height instead
			height = iheight;

		$('.compare-container').height(height);

		var fullWidth = $('.compare-container').width();
		$('.compare-container .compare-2').width(fullWidth / 2);
		$('.compare-container .compare-2').css('left', fullWidth / 2);
		$('.compare-container .compare-2 img.preview').css('margin-left', -fullWidth / 2);
		$('.compare-container .compare-2 img.preview').width(fullWidth);
        self.swatchHeight();
	};

    self.bindMenu = function () {
		$('.floorguide-menu-link').click(function (e) {
			var target = $(e.currentTarget).data('target');
			if ($(target).is(':hidden')) {
				$('.floorguide-bottom-menu').hide();
				$(target).show();
			}

			e.preventDefault();
			e.stopPropagation();
        });

        $('.jsShowMobileFilter').click(function (e) {
            $('.mobile-filter-close').addClass('open');
            $('.filter-wrapper').addClass('open');
        });

        $('.jsHideMobileFilter').click(function (e) {
            $('.mobile-filter-close').removeClass('open');
            $('.filter-wrapper').removeClass('open');
            e.preventDefault();
        });
    };

	// events
	self.renderCompleted = function (a, i) {
        self.checkReadyToStart();
	};

	// ready to start
	self.checkReadyToStart = function () {
		window.setTimeout(function () {
			self.swatchHeight();
            self.bindMenu();
            self.root.route.init();
            $('[data-toggle="popover"]').popover();
            self.root.scene.showIframe();
        }, 70);

        window.setTimeout(function () {
            self.setTitleHeights(); 
        }, 300);
	};

    self.swatchHeight = function () {
        return;
        var width = $('.grid-sizer').width();
        var imgWidth = $('.iso img.img').width();

        if (width < imgWidth)
            width = imgWidth;

        $('.iso img.img').height(width);
    };

    self.setTitleHeights = function () {
        $('#floorguide .title').css('height','auto');

        var height = 21;
        $('#floorguide .title').each(function () {
            height = Math.max($(this).height(), height);
        });
        $('#floorguide .title').height(height);
    }

	$(window).resize(self.resize);

    $(document).ready(function () {
		self.resize();
	});

    $(document).click(function (e) {
		$('[data-toggle="popover"],[data-original-title]').each(function () {
			if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
				(($(this).popover('hide').data('bs.popover') || {}).inState || {}).click = false  // fix for BS 3.3.6
			}

		});

		$('.floorguide-bottom-menu').hide();
	});

    root.selected.filterOptions.subscribe(function (changes) {
        for (var i = 0; i < changes.length; i++) {
            var change = changes[i];

            var value = changes[i].id();
            var group = changes[i].group.id();

            if (dataLayer) {
                dataLayer.push({ 'event': 'GAEvent', 'eventCategory': self.root.eventPrefix + ' Filter', 'eventAction': group, 'eventLabel': value, 'eventValue': null });
            }
        }
    });

	root.selected.floor.subscribe(function (changes) {
		if (!changes)
            return;

        // check mobile mode and go to floor page
        if ($(window).width() < 768 || self.root.clickTakesUserToProductPage()) {
            window.location.href = changes.url;
            return;
        }

        var topelm = $('#iframe');

        if (topelm.length == 0)
            topelm = $('.compare-container');

		//$('html,body').animate({
  //          scrollTop: topelm.offset().top
		//}, 1000);
	});

	root.scene.fullscreen.subscribe(self.resize);
}


function hideFilters() {
    return;

	var filters = $('.the-filters').find('input[type=checkbox]');
    filters.closest('li').show();
	var displayedFloors = $('#floor-container .iso:visible');
	if (displayedFloors.length == 0)
		return;
    $.each(filters, function (i, theFilter) {
        var theF = $(theFilter);
        if (displayedFloors.filter(function (i, f) { return $(f).hasClass(theF[0].id); }).length == 0 && !theF.is(':checked')) {
            theF.prop('disabled', true);
            theF.closest('li').addClass('disabled');
        } else {
            theF.prop('disabled', false);
            theF.closest('li').removeClass('disabled');
		}
	});
}

function FloorViewModel(data, root) {
	var self = this;
	self.id = data.ID;
    self.name = data.Name;
    self.isNew = data.IsNew;
    self.keywords = data.Keywords;
    self.articleId = data.ArticleID;
    self.roomId = data.DefaultRoomID;
    self.recommendedPrice = data.RecommendedPrice;
    self.price = data.Price;
    self.sortIndex = data.SortIndex;
    self.overrideRoomId = null;
    self.fullArticleId = data.FullArticleID;
    self.productAONumber = data.ProductAONumber;
    self.collection = data.Collection;
    self.cssClasses = data.CssClasses;
    self.url = data.Url + ($kioskmode ? "?kioskmode=true" : "");
	self.root = root;
    self.image = data.Image;
    self.show = ko.observable(false);
    self.flavor = data.Flavor;

    self.getIcons = ko.computed(function () {
        var result = [];
        var css = self.cssClasses;
        var icons = self.root.icons();

        for (var i = 0; i < css.length; i++)
            for (var i2 = 0; i2 < icons.length; i2++)
                if (css[i] == icons[i2].Selector)
                    if (!result.includes(icons[i2]))
                        result.push(icons[i2]);

        return result;
    });
    self.getThumbnail = function () { return '/images/swatches/medium7x5/' + self.image; };
    self.getCssClasses = function () { return self.root.settings.defaultFloorCssClasses + ' ' + self.cssClasses.join(' ') };
	self.hasCssClass = function (id) {
		for (var i = 0; i < self.cssClasses.length; i++)
			if (self.cssClasses[i] == id)
				return true;

		return false;
	};

    self.select = function () {
        // dataLayer is related to Google Tag Manager. Have a look in the _Layout.cshtml to see 
        // where it's defined.
        if (dataLayer) {
            dataLayer.push({ 'event': 'GAEvent', 'eventCategory': 'Product grid click', 'eventAction': EventLanguage() + '-Product grid click', 'eventLabel': self.name, 'eventValue': null });
        }

        if (!self.root.clickTakesUserToProductPage()) {
            if (self.root.selected.compare.floor() != null)
                self.root.selected.compare.floor(self);
            else
                self.root.selected.floor(self);
        }
        else {
            window.location.href = self.url;
        }
	};

    self.visible = ko.computed(function () {
        var groups = self.root.selected.filterGroups();
        var query = self.root.search.query();
        var filterWithSearch = self.root.search.filterWithSearch();

        if (groups.length == 0 && !filterWithSearch) {
            return true;
        }

        for (var g = 0; g < groups.length; g++) {
            var filters = groups[g].options();
            var match = false;

            if (filters.length == 0)
                continue;

            for (var i = 0; i < filters.length; i++) {
                if (filters[i].selected() && self.cssClasses.indexOf(filters[i].uniqueID()) > -1) {
                    match = true;
                    break;
                }
            }

            if (!match)
                return false;
        }

        return true;

        //console.log('visible trigger');

        if (filterWithSearch) {
            return self.keywords.indexOf(query.toLowerCase()) > -1;
        }

        return true;
    });

    self.isFavourite = function () { return $.mainViewModel.favourites().hasItem(self.id); };
    self.isCart = function () { return $.mainViewModel.cart().hasItem(self.fullArticleId); };
    self.addCart = function () { $.mainViewModel.cart().add(self.fullArticleId, self.name, { thumb: self.getThumbnail(), url: self.url }); };
	self.toggleCart = function () {
        if (!$.mainViewModel.cart().hasItem(self.fullArticleId))
			self.addCart();
		else
            $.mainViewModel.cart().remove(self.fullArticleId);
	};
    self.toggleFavourite = function () {
        if (!$.mainViewModel.favourites().hasItem(self.fullArticleId)) {
            if (dataLayer)
                dataLayer.push({ 'event': 'GAEvent', 'eventCategory': 'Mark as favorite', 'eventAction': EventLanguage() + '-Mark as favorite', 'eventLabel': null,'eventValue': null});

            $.mainViewModel.favourites().add(self.fullArticleId, self.name, { thumb: self.getThumbnail(), url: self.url });
            if (typeof AnimateAddFavorite === 'function')
                AnimateAddFavorite();
        }
        else
            $.mainViewModel.favourites().remove(self.fullArticleId);
    };
}

function FilterCollectionViewModel(data) {
	var self = this;

	self.color = new FilterGroupViewModel();
	self.wearresistance = new FilterGroupViewModel();
	self.grading = new FilterGroupViewModel();
    self.otherFilters = ko.observableArray();
    self.collection = new FilterGroupViewModel();
	self.loadData = function (model) {
		self.color.loadData(model.ColorFilter);
		self.wearresistance.loadData(model.WearResistanceFilter);
        self.grading.loadData(model.GradingFilter);
        self.collection.loadData(model.CollectionFilter);

		// load other filters
		var filters = new Array();
		for (var i = 0; i < model.OtherFilters.length; i++) {
			filters.push(new FilterGroupViewModel(model.OtherFilters[i]));
        }

		self.otherFilters(filters);
	};

	if (data)
		self.loadData(data);
}

function FilterGroupViewModel(data) {
	var self = this;

	self.id = ko.observable('');
    self.name = ko.observable('');
	self.options = ko.observableArray();
    self.filterDescription = ko.observable(null);
    self.expanded = ko.observable(false);
    self.toggle = function () { self.expanded(!self.expanded()); };
    self.selectedCount = ko.computed(function () {
        return ko.utils.arrayFilter(self.options(), function (item) {
            return item.selected() == true;
        }).length;
    });

    self.loadData = function (model) {
        if (!model)
            return;

        if (model.FilterDescription != null)
            self.name(model.FilterDescription.Title);
        else
            self.name(model.Name);

		self.id(model.ID);
		self.filterDescription(model.FilterDescription);

		var optionsData = new Array();
		for (var i = 0; i < model.Options.length; i++)
			optionsData.push(new FilterOptionViewModel(model.Options[i], this));
		self.options(optionsData);
	};

	if (data)
		self.loadData(data);
}

function FilterOptionViewModel(data, parent) {
	var self = this;

	self.id = ko.observable('');
	self.name = ko.observable('');
    self.url = ko.observable('');
    self.tooltip = ko.observable('');
	self.selected = ko.observable(false);
	self.group = parent;
	self.uniqueID = function () {
		return self.group.id() + '-' + self.id();
    }
    self.visible = ko.observable(true);

	self.select = function () { self.selected(true); };
	self.deselect = function () { self.selected(false); };
	self.toggle = function () { self.selected(!self.selected()); };

	self.loadData = function (model) {
		self.id(model.ID);
		self.name(model.Name);
        self.url(data.Url);
        self.tooltip(model.Tooltip);
	};

	if (data)
		self.loadData(data);

	// subscriptions
    self.selected.subscribe(function (value) {
        $.floorGuideViewModel.search.clear();

		if (value)
			$.floorGuideViewModel.selected.filterOptions.push(self);
		else
            $.floorGuideViewModel.selected.filterOptions.remove(self);

        hideFilters();
	});
}

function CompareViewModel() {
	var self = this;
	self.floor = ko.observable(null);
	self.isDragging = false;
	self.mouseDown = function () { self.isDragging = true; }
	self.floorChanged = function (value) {
		if (value) {
			fullWidth = $('.compare-container').width();
			$('.compare-container .compare.item img').width(fullWidth);
		}
	}

	// todo, bind and unbind on compare through subscription
	// dragging in compare
	self.bindCompare = function () {
		var resize = true;
		var disableDragbar = false;
		if ($('.compare-container').length > 0) {
			if (resize) {
				$('.compare').removeAttr('style');
			}

			if (!disableDragbar) {
				$('.compare-container').mousemove(function (e) {
					if (!self.isDragging)
						return;

                    var fullWidth = $('.compare-container').width();
                    var left = Math.min(Math.max(e.pageX, 380), $(window).width() - 380);
                    var rightPartSize = fullWidth - left;

                    $('.compare-2').css("left", left);
                    $('.compare-2').width(rightPartSize);
                    $('.compare-2 img').css("margin-left", -left);
					$('.compare-2 img').width($('.compare-container').width());
				});
				$(document).mouseup(function (e) {
					if (!self.isDragging)
						return;

					self.isDragging = false;

					//resizeAmountLeft = e.pageX - (($(window).width() - fullWidth) / 2);
					//resizeAmountRight = fullWidth - resizeAmountLeft;
					//if (resizeAmountLeft > (fullWidth - 2) || resizeAmountLeft < 0) {
					//    self.isDragging = false;
					//    return false;
					//} else {
					//    $('.compare-2').css("left", resizeAmountLeft);
					//    //$('.compare-2 img').css("margin-left", -resizeAmountRight);
					//}
				});
			}
		}
	};

	//self.floor.subscribe(function (changes) {
	//    if (changes != null)
	//        self.bindCompare();
	//});
	$(document).ready(self.bindCompare());
	self.floor.subscribe(self.floorChanged);
}

function SelectionViewModel() {
	var self = this;
	self.compare = new CompareViewModel();
	self.direction = ko.observable(0);
	self.floor = ko.observable(null);
	self.direction = ko.observable(0);
	self.room = ko.observable();
	self.roomType = ko.observable();
    self.colorGroup = ko.observable();
    self.floorGroup = ko.observable(null);
	self.color = ko.observable();
    self.filterOptions = ko.observableArray();
    self.sortingOption = ko.observable(null);

    self.sortingOptionSelected = ko.computed(function () {
        return self.sortingOption() != null && self.sortingOption().Id != 'NONE';
    });

    self.sortingOptionText = ko.computed(function () {
        if (self.sortingOption() != null)
            return self.sortingOption().Text;

        return '';
    });


    self.clearFilters = function () {
		var arr = self.filterOptions();
        while (arr.length > 0) {
            arr[0].selected(false);
        }
	};

	self.toggleCompare = function () {
		if (self.compare.floor() == null)
			self.compare.floor(self.floor());
		else
			self.compare.floor(null);
	};

    self.startCompare = function () {
        self.compare.floor(self.floor());
    };

    self.stopCompare = function () {
        self.compare.floor(null);
    };

	self.filterGroups = function () {
		var groups = [];

		$.each(self.filterOptions(), function (i, e) {
			if ($.inArray(e.group, groups) == -1)
				groups.push(e.group);
		});

		return groups;
    };

    //self.room.subscribe(function (changes) {
    //    SendRoom(self.room().id);
    //});
}

function getComboFilter(groups) {
	var i = 0;
	var comboFilters = [];
	var message = [];
	var filters = new Object();

	$.each(groups, function (i, group) {
		filters[group.id()] = [];
		$.each(group.options(), function (i2, option) {
			if (option.selected())
				filters[group.id()].push('.' + option.uniqueID());
		});
	});

	for (var prop in filters) {
		message.push(filters[prop].join(' '));
		var filterGroup = filters[prop];
		// skip to next filter group if it doesn't have any values
		if (!filterGroup.length) {
			continue;
		}
		if (i === 0) {
			// copy to new array
			comboFilters = filterGroup.slice(0);
		} else {
			var filterSelectors = [];
			// copy to fresh array
			var groupCombo = comboFilters.slice(0); // [ A, B ]
			// merge filter Groups
			for (var k = 0, len3 = filterGroup.length; k < len3; k++) {
				for (var j = 0, len2 = groupCombo.length; j < len2; j++) {
					filterSelectors.push(groupCombo[j] + filterGroup[k]); // [ 1, 2 ]
				}
			}
			// apply filter selectors to combo filters for next group
			comboFilters = filterSelectors;
		}
		i++;
	}
	var comboFilter = comboFilters.join(', ');
	return comboFilter ? comboFilter : '*';
}

$.floorGuideViewModel = new FloorGuideViewModel();

$('.dropup').on("click", ".dropdown-submenu a.toggle-trigger", function (e) {
	$(this).next('ul').toggle();
	e.stopPropagation();
	e.preventDefault();
});

function ToggleActive(btn) {
	var container = btn.parent().parent().parent();
	var isActive = container.hasClass("active");
	if (isActive) {
		container.removeClass("active");
        btn.find('.fa').addClass("fa-plus").removeClass("fa-minus");
	}
	else {
        container.addClass("active");
        btn.find('.fa').removeClass("fa-plus").addClass("fa-minus");
	}
}

function ToggleActiveGroup(btn) {
	btn.closest('.container').find('a').removeClass('active');
	btn.addClass("active");
}

function EventLanguage() {
    var lang = $('html').attr('lang').toUpperCase();

    if (lang.indexOf('-'))
        lang = lang.substr(lang.indexOf('-') + 1);

    return lang;
}

function colorCode(text) {
    if (!text)
        return text;

    while (text.indexOf('###') > -1) {
        var original = text;
        var start = text.indexOf('###');
        var color = text.substring(start + 3, start + 9);

        // replace start
        text = text.substring(0, start) + '<span style="color:#' + color + ';">' + text.substring(start + 9);

        var end = text.indexOf('###');

        if (end < 0)
            return original;

        text = text.substring(0, end) + '</span>' + text.substring(end + 3);
    }

    return text;
}
function AnimateAddFavorite() {
    moveFadeElm('.compare-1 .image-thumbnail', '.icon-menu:visible', null, 500);
    delayedAction(function () { openMenu('.icon-menu:visible .menu-favorites'); }, 300);
    delayedAction(function () { closeMenu('.icon-menu:visible .menu-favorites'); }, 3300);
}
