﻿dojo.require("dojo.data.ItemFileWriteStore");
dojo.require("dojo.fx");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dijit._Container");
dojo.require("dijit.Tree");
dojo.require("dojo.cookie");
dojo.provide("vn.PoiFilter");

dojo.declare("vn.PoiFilter", [dijit._Widget, dijit._Templated], {
	templateString: '<div class="PoiFilter" dojoAttachPoint="poiFilterNode"></div>',
    data: 
    { identifier: 'name',
      label: 'label',
      items: null
/*
      [
         { label:'Getting here and around', name:'GettingHereAndAround', level: 1, type: 'Category' },
         { label:'Tourist information', name:'TouristInformation', level: 1, type: 'Pois' },
         { label:'What to do', name:'WhatToDo', level: 1, type: 'Category',
            children:[{_reference:'ActivitiesAndSports'}, {_reference:'AttractionsAndCulture'}, {_reference:'FoodAndDrink'}, {_reference:'Shopping'}, {_reference:'ToursAndSafaris'}] },
         { label:'Activities & Sports', name:'ActivitiesAndSports', level: 2, type: 'Category', icon: 'vn_hiking.png',
            children:[{_reference:'Biking'}, {_reference:'ExtremeSports'}, {_reference:'FamilyAndFun'}, {_reference:'FarmActivities'},
                {_reference:'Fishing'}, {_reference:'Golfing'}, {_reference:'Hiking'}, {_reference:'Hunting'},
                {_reference:'RecreationAndSpa'}, {_reference:'RidingAndSledging'}, {_reference:'Skiing'}, {_reference:'SummerAndIndoorSports'},
                {_reference:'WaterActivites'}, {_reference:'WinterWithoutSkis'}] },
         { label:'Biking', name:'Biking', level: 3, type: 'Pois', icon: 'vn_bicycling.png' },
         { label:'Extreme sports', name:'ExtremeSports', level: 3, type: 'Pois' },
         { label:'Family & Fun', name:'FamilyAndFun', level: 3, type: 'Pois', icon: 'vn_amusementparks.png' },
         { label:'Farm activities', name:'FarmActivities', level: 3, type: 'Pois' },
         { label:'Fishing', name:'Fishing', level: 3, type: 'Pois', icon: 'vn_fishing.png' },
         { label:'Golfing', name:'Golfing', level: 3, type: 'Pois', icon: 'vn_golf.png' },
         { label:'Hiking', name:'Hiking', level: 3, type: 'Pois', icon: 'vn_hiking.png' },
         { label:'Hunting', name:'Hunting', level: 3, type: 'Pois', icon: 'vn_hunting.png' },
         { label:'Recreation & Spa', name:'RecreationAndSpa', level: 3, type: 'Pois' },
         { label:'Riding & Sledging', name:'RidingAndSledging', level: 3, type: 'Pois' },
         { label:'Skiing', name:'Skiing', level: 3, type: 'Pois', icon: 'vn_skiing.png' },
         { label:'Summer- & Indoor sports', name:'SummerAndIndoorSports', level: 3, type: 'Pois' },
         { label:'Water activites', name:'WaterActivites', level: 3, type: 'Pois', icon: 'vn_wateractivities.png' },
         { label:'Winter without skis', name:'WinterWithoutSkis', level: 3, type: 'Pois' },
         { label:'Attractions & Culture', name:'AttractionsAndCulture', level: 2, type: 'Category', icon: 'vn_culturalheritage.png' },
         { label:'Food & Drink', name:'FoodAndDrink', level: 2, type: 'Category', icon: 'vn_restaurants.png' },
         { label:'Shopping', name:'Shopping', level: 2, type: 'Category', icon: 'vn_shopping.png' },
         { label:'Tours & Safaris', name:'ToursAndSafaris', level: 2, type: 'Category', icon: 'vn_sightseeing.png' },
         { label:'What\'s on', name:'WhatsOn', level: 1, type: 'Category' },
         { label:'Where to stay', name:'WhereToStay', level: 1, type: 'Category' }
    ]
*/
    },
    defaultIcon: '', //"vn_hiking.png",
    //baseIconUrl: "/images/icons/categories/",
    baseIconUrl: "/images/map/categories/no_arrow/",
    store: null,
    model: null,
    tree: null,
    initialPoiCount: null,
    updatePoiCount: function(poiCount) {
        try
        {
        if(this.store) {
            this.initialPoiCount = null;
            dojo.forEach(poiCount, function(poiCountItem) {
                this.poiFilter.store.fetchItemByIdentity({identity: poiCountItem.name, scope: this, onItem: function(item) {
                    if(this.store.isItemLoaded(item))
                        if(this.store.hasAttribute(item, 'labelroot'))
                        {
                            var labelroot = this.store.getValue(item, 'labelroot');
                            //this.store.setValue(item, 'label', this.store.getValue(item, 'labelroot') + ' <span class="PoiFilterCount">(' + poiCountItem.count + ')</span>');
                            this.store.setValue(item, 'label', labelroot + ' |(' + poiCountItem.count + ')');
                        }
                }});
            }, this);
        }
        else
            this.initialPoiCount = poiCount;
        }
        catch(err)
        {
            alert(err);
        }
        this.updateTreeClasses(true);
    },
    setup: function() {
        if(!gdClientData.categoryItems) gdClientData.categoryItems = [];
	    this.data.items = gdClientData.categoryItems;
	    dojo.forEach(this.data.items, function(item) {
	        if(item.childrenArray && item.childrenArray.length > 0 && item.childrenArray[0] != null)
	            item.children = item.childrenArray[0];
	    });
		this.store = new dojo.data.ItemFileWriteStore({data:this.data});
		this.model = new dijit.tree.ForestStoreModel({
			store: this.store,
			rootId: "Root",
			rootLabel: "Root",
			query: {level: 2},
			childrenAttrs: ["children"]
		});
	    dojo.cookie("InitialOpenItemIds", this.getInitialOpenItems(this.data.items), { expires: 1 });

		this.tree = new dijit.Tree({
			model: this.model,
			showRoot: false,
			persist: true,
			cookieName: "InitialOpenItemIds",
			openOnClick: true, // In addition, _onClick function in Tree.js was hacked.
			//initialOpenItems: this.getInitialOpenItems(this.data.items) //'Root,All,3446257' // postCreate function in Tree.js was hacked.
	        _onClick: function(/*Event*/ e){
		        // summary: translates click events into commands for the controller to process
		        var domElement = e.target;

		        // find node
		        var nodeWidget = dijit.getEnclosingWidget(domElement);	
		        if(!nodeWidget || !nodeWidget.isTreeNode){
			        return;
		        }

                // VisitNorway: We override this method to change the line below:
		        //if( (this.openOnClick && nodeWidget.isExpandable) ||
		        if( (this.openOnClick && nodeWidget.isExpandable && domElement != nodeWidget.checkBoxNode) ||
			        (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText) ){
			        // expando node was clicked, or label of a folder node was clicked; open it
			        if(nodeWidget.isExpandable){
				        this._onExpandoClick({node:nodeWidget});
			        }
		        }else{
			        this._publish("execute", { item: nodeWidget.item, node: nodeWidget} );
			        this.onClick(nodeWidget.item, nodeWidget);
			        this.focusNode(nodeWidget);
		        }
		        dojo.stopEvent(e);
            }
		});
		dojo.connect(this.tree, "onClick", this, "nodeClicked");
		this.tree.getIconClass = this.getIconClass;

		// HACK:
		this.tree.poiFilter = this;
		this.poiFilter = this;
		
		this.tree.startup();
        this.updateTreeClasses();
        if(typeof(gdInitialPoiCount) != 'undefined')
            this.initialPoiCount = gdInitialPoiCount;
        if(this.initialPoiCount != null)
            this.updatePoiCount(this.initialPoiCount);
		this.poiFilterNode.appendChild(this.tree.domNode);
		
    },
	postCreate: function() {
	    // Avoid Operation aborted error in IE: don't modify DOM until after page has loaded.
	    dojo.addOnLoad(dojo.hitch(this, "setup"));
	},
    getInitialOpenItems: function(allItems) {
		var ary = [];
		ary.push('Root');
		ary.push('All');
        for(var i = 0, len = allItems.length; i < len; i++)
        {
            var item = allItems[i];
            if(item.expanded)
			    ary.push(item.name);
        }
		return ary.join(",");
    },
	getNode: function(dataItem) {
        var identity = this.poiFilter.store.getIdentity(dataItem);
        var node = this.poiFilter.tree._itemNodeMap[identity];
        if(node)
        {
            node.setLabelNode = function(label) {
		        this.labelNode.innerHTML="";
		        var labelParts = label.split("|");
		        this.labelNode.appendChild(dojo.doc.createTextNode(labelParts[0]));
		        if(labelParts.length > 1)
		        {
		            var numberNode = dojo.doc.createElement('span');
		            dojo.addClass(numberNode, "numberText");
		            numberNode.appendChild(dojo.doc.createTextNode(labelParts[1]));
		            this.labelNode.appendChild(numberNode);
		        }
	        };
            node.setLabelNode(this.poiFilter.store.getValue(dataItem, 'label'));

		    node.collapse = function() {
                this.inherited("collapse", arguments);
                this.poiFilter.setExpanded(this.item, false);
                this.poiFilter.updateTreeClasses();
		    };
		    node.expand = function() {
                this.inherited("expand", arguments);
                this.poiFilter.setExpanded(this.item, true);
                this.poiFilter.updateTreeClasses();
		    };
		    node.poiFilter = this.poiFilter;
		    
            if(!(node.checkBoxNode)) {
                // Create right-aligned check box node
                var level = this.poiFilter.getLevel(dataItem);
                dojo.addClass(node.domNode, "treeNodeLevel" + level);
                node.checkBoxNode = document.createElement("div");
                node.checkBoxNode.className = "dijitTreeCheckboxIcon uncheckedNode";
                var table = document.createElement("table");
                table.className = "contentTable";
                var tr = document.createElement("tr");
                var iconCell = document.createElement("td");
                iconCell.className = "iconCell";
                var labelCell = document.createElement("td");
                labelCell.className = "labelCell" + level;
                var checkBoxCell = document.createElement("td");
                checkBoxCell.className = "checkBoxCell";
                tr.appendChild(iconCell);
                tr.appendChild(labelCell);
                tr.appendChild(checkBoxCell);
                var tbody = document.createElement("tbody");
                tbody.appendChild(tr);
                table.appendChild(tbody);
                iconCell.appendChild(node.iconNode);
                labelCell.appendChild(node.labelNode);
                checkBoxCell.appendChild(node.checkBoxNode);
                node.contentNode.appendChild(table);
                node.labelCell = labelCell;
                if(node.isExpandable) {
                    dojo.connect(node.labelCell, "onmouseover", node, function() {
                        dojo.addClass(this.labelCell, "labelCellHover");
                    });
                    dojo.connect(node.labelCell, "onmouseout", node, function() {
                        dojo.removeClass(this.labelCell, "labelCellHover");
                    });
                    dojo.connect(checkBoxCell, "onmouseover", node, function() {
                        dojo.addClass(this.checkBoxNode.parentNode, "checkBoxHover");
                    });
                    dojo.connect(checkBoxCell, "onmouseout", node, function() {
                        dojo.removeClass(this.checkBoxNode.parentNode, "checkBoxHover");
                    });
                }
                else
                {
                    dojo.connect(node.labelCell, "onmouseover", node, function() {
                        dojo.addClass(this.labelCell, "labelCellHover");
                        dojo.addClass(this.checkBoxNode.parentNode, "checkBoxHover");
                        dojo.addClass(this.checkBoxNode.parentNode, "checkBoxHoverLeaf");
                    });
                    dojo.connect(node.labelCell, "onmouseout", node, function() {
                        dojo.removeClass(this.labelCell, "labelCellHover");
                        dojo.removeClass(this.checkBoxNode.parentNode, "checkBoxHoverLeaf");
                        dojo.removeClass(this.checkBoxNode.parentNode, "checkBoxHover");
                    });
                    dojo.connect(checkBoxCell, "onmouseover", node, function() {
                        dojo.addClass(this.labelCell, "labelCellHover");
                        dojo.addClass(this.checkBoxNode.parentNode, "checkBoxHover");
                        dojo.addClass(this.checkBoxNode.parentNode, "checkBoxHoverLeaf");
                    });
                    dojo.connect(checkBoxCell, "onmouseout", node, function() {
                        dojo.removeClass(this.labelCell, "labelCellHover");
                        dojo.removeClass(this.checkBoxNode.parentNode, "checkBoxHoverLeaf");
                        dojo.removeClass(this.checkBoxNode.parentNode, "checkBoxHover");
                    });
                }
        		//dojo.connect(node.checkBoxNode, "onclick", this.poiFilter, "nodeClicked");
                var icon = this.poiFilter.store.getValue(dataItem, "icon");
                if(!(icon))
                    icon = this.poiFilter.defaultIcon;
                if(icon && icon != '')
                {
                    dojo.style(node.iconNode, "backgroundImage", 'url("' + this.poiFilter.baseIconUrl + icon + '")');
                }
                else
                {
                    dojo.style(node.iconNode, "width", '0px');
                }
                if(level <= 2 && !node.isExpandable)
                {
                    // Align top level, non-expandable nodes with the expandable ones:
                    dojo.style(node.contentNode, "margin", "0px");
                }
                this.poiFilter.setNodeToolTips(node, dataItem);
            }
            node._updateItemClasses(dataItem);
            node.checkBoxNode.className = "dijitTreeCheckboxIcon " + this.getIconClass2(dataItem);
        }
        return node;
	},
	setNodeToolTips: function(node, dataItem) {
        var ctip = this.poiFilter.getCheckBoxToolTip(dataItem);
        var etip = this.poiFilter.getExpandoToolTip(dataItem);
        node.checkBoxNode.setAttribute("alt", ctip);
        node.checkBoxNode.setAttribute("title", ctip);
        node.expandoNode.setAttribute("alt", etip);
        node.expandoNode.setAttribute("title", etip);
        // Content node can lead to expand or click, depending...
        if(node.isExpandable)
        {
            node.contentNode.setAttribute("alt", etip);
            node.contentNode.setAttribute("title", etip);
        }
        else
        {
            //dojo.style(node.contentNode, "cursor", "default");
            //ctip = "";
            node.contentNode.setAttribute("alt", ctip);
            node.contentNode.setAttribute("title", ctip);
        }
	},
	getIconClass: function(dataItem, opened) {
	    return "";
	},
	getIconClass2: function(dataItem, opened) {
        var cs = this.poiFilter.getCS(dataItem);
        var checked = this.poiFilter.getChecked(dataItem);
        if(!(cs) || cs == "nochildren")
        {
            if(checked)
                return "checkedNode";
            else
                return "uncheckedNode";
        }
        else
        {
            if(cs == "allchecked")
                return "checkedNode";
            else if(cs == "nochecked")
                return "uncheckedNode";
            else
            {
                if(checked)
                    return "partiallyCheckedNode";
                else
                    return "partiallyUncheckedNode";
            }
        }
    },
    updateTreeClasses: function(updateLabels) {
        this.poiFilter.updateNodeClasses(this.poiFilter.tree, this.poiFilter.tree.model.root, updateLabels);
        this.poiFilter.tree.rootNode._updateItemClasses(this.poiFilter.tree.model.root);
    },
    nodeClicked: function(dataItem, node) {
        var checked = this.poiFilter.getChecked(dataItem);
        checked = !(checked);
        this.poiFilter.setChecked(dataItem, checked);
        this.poiFilter.checkChildItems(dataItem, checked);
        this.poiFilter.updateTreeClasses();
        gdDoCallback('operation=updatecontent');
    },
    checkAll: function(checked) {
        this.setChecked(this.model.root, checked);
        this.checkChildItems(this.model.root, checked);
        this.updateTreeClasses();
    },
//    nodeOpened: function(dataItem, node) {
//        alert('Opened');
//        this.poiFilter.updateNodeClasses(this.poiFilter.tree, dataItem);
//    },
    getCheckedCategories: function(onComplete) {
        this.poiFilter.store.fetch({query: {isChecked: true, type: 'Pois'}, onComplete: onComplete});
    },
    updateNodeClasses: function(tree, dataItem, updateLabels) {
        var result = "nochildren";
        if(dataItem.children)
        {
            for(var i = 0, len = dataItem.children.length; i < len; i++)
            {
                var childItem = dataItem.children[i];
                if(childItem != null)
                {
                    this.poiFilter.updateNodeClasses(tree, childItem);
                    var cs = this.poiFilter.getCS(childItem);
                    var checked = this.poiFilter.getChecked(childItem);
                    if(cs && cs != "nochildren")
                    {
                        if(cs == "allchecked") {
                            if(result == "nochildren")
                                result = "allchecked";
                            else if(result == "nochecked")
                                result = "somechecked";
                        }
                        else if(cs == "nochecked") {
                            if(result == "nochildren")
                                result = "nochecked";
                            else if(result == "allchecked")
                                result = "somechecked";
                        }
                        else if(cs == "somechecked") {
                            result = "somechecked";
                        }
                    }
                    else
                    {
                        if(checked) {
                            if(result == "nochildren")
                                result = "allchecked";
                            else if(result == "nochecked")
                                result = "somechecked";
                        }
                        else {
                            if(result == "nochildren")
                                result = "nochecked";
                            else if(result == "allchecked")
                                result = "somechecked";
                        }
                    }
                }
            }
        }
        this.poiFilter.setCS(dataItem, result);
        if(result == "allchecked")
            this.poiFilter.setChecked(dataItem, true);
        else if(result == "nochecked")
            this.poiFilter.setChecked(dataItem, false);
        var node = this.poiFilter.getNode(dataItem);
        if(node)
        {
            var unexpandedClass = "treeNodeLevel" + this.poiFilter.getLevel(dataItem);
            var expandedClass = "treeNodeExpandedLevel" + this.poiFilter.getLevel(dataItem);
            if(this.getExpanded(dataItem))
            {
                dojo.addClass(node.domNode, expandedClass);
                dojo.removeClass(node.domNode, unexpandedClass);
            }
            else
            {
                dojo.addClass(node.domNode, unexpandedClass);
                dojo.removeClass(node.domNode, expandedClass);
            }
            this.poiFilter.setNodeToolTips(node, dataItem);
            if(updateLabels)
                node.setLabelNode(node.tree.getLabel(dataItem));
         }
    },
    checkChildItems: function(dataItem, check) {
        if(dataItem.children)
        {
            for(var i = 0, len = dataItem.children.length; i < len; i++)
            {
                var childItem = dataItem.children[i];
                if(childItem != null)
                {
                    this.poiFilter.setChecked(childItem, check);
                    this.poiFilter.checkChildItems(childItem, check);
                }
            }
        }
    },
    getChecked: function(dataItem) {
        if(dataItem._S)
        {
            if(dataItem._S.hasAttribute(dataItem, "isChecked"))
                return dataItem._S.getValue(dataItem, "isChecked");
            else
                return false;
        }
        else
        {
            if(dataItem.isChecked)
                return true;
            else
                return false;
        }
    },
    setChecked: function(dataItem, checked) {
        if(dataItem._S)
            dataItem._S.setValue(dataItem, "isChecked", checked);
        else
            dataItem.isChecked = checked;
    },
    getCS: function(dataItem) {
        if(dataItem._S)
        {
            if(dataItem._S.hasAttribute(dataItem, "childState"))
                return dataItem._S.getValue(dataItem, "childState");
            else
                return false;
        }
        else
            return dataItem.childState;
    },
    setCS: function(dataItem, childState) {
        if(dataItem._S)
            dataItem._S.setValue(dataItem, "childState", childState);
        else
            dataItem.childState = childState;
    },
    getExpanded: function(dataItem) {
        if(dataItem._S)
        {
            if(dataItem._S.hasAttribute(dataItem, "expanded"))
                return dataItem._S.getValue(dataItem, "expanded");
            else
                return false;
        }
        else
            return dataItem.root || dataItem.expanded;
    },
    setExpanded: function(dataItem, expanded) {
        if(dataItem._S)
            dataItem._S.setValue(dataItem, "expanded", expanded);
        else
            dataItem.expanded = expanded;
    },
    getCheckBoxToolTip: function(dataItem) {
        if(this.getChecked(dataItem))
        {
            if(dataItem._S)
                if(dataItem._S.hasAttribute(dataItem, 'checkedBoxTip'))
                    return dataItem._S.getValue(dataItem, 'checkedBoxTip');
            if(dataItem.checkedBoxTip)
                return dataItem.checkedBoxTip;
            return "";
        }
        else
        {
            if(dataItem._S)
                if(dataItem._S.hasAttribute(dataItem, 'uncheckedBoxTip'))
                    return dataItem._S.getValue(dataItem, 'uncheckedBoxTip');
            if(dataItem.uncheckedBoxTip)
                return dataItem.uncheckedBoxTip;
            return "";
        }
    },
    getExpandoToolTip: function(dataItem) {
        if(this.getExpanded(dataItem))
        {
            if(dataItem._S)
                if(dataItem._S.hasAttribute(dataItem, 'expandedTip'))
                    return dataItem._S.getValue(dataItem, 'expandedTip');
            if(dataItem.expandedTip)
                return dataItem.expandedTip;
            return "";
        }
        else
        {
            if(dataItem._S)
                if(dataItem._S.hasAttribute(dataItem, 'collapsedTip'))
                    return dataItem._S.getValue(dataItem, 'collapsedTip');
            if(dataItem.collapsedTip)
                return dataItem.collapsedTip;
            return "";
        }
    },
    getLevel: function(dataItem) {
        var level = 2;
        if(dataItem._S)
            if(dataItem._S.hasAttribute(dataItem, 'level'))
                level = dataItem._S.getValue(dataItem, 'level');
        return level;
    }

});
