﻿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], {

    constructor: function (p) {

        if (p.id.toLowerCase().indexOf('route') > -1) {  // check what type of poi filter this is (route filter or standard poi filter)
            if (!gdClientData.routeCategoryItems)
                gdClientData.routeCategoryItems = [];
            this.categoryItems = gdClientData.routeCategoryItems;
            this.cookieName = "routeInitialOpenItemIds";
            this.syncPoiFilter = "thePoiFilter";
            this.tabHeaderID = "map_tabheader_route";
            this.expandable = false;
            this.isRouteListings = true;

            var viewAllBtn = dojo.byId("routeListingsViewAllBtn");
            if (viewAllBtn)
                dojo.connect(viewAllBtn, "onclick", this, function (event) {
                    gdMapPage.tabManager.showTab("map_tabheader_listings");
                    if (event) dojo.stopEvent(event);
                });
        }

        else {  // standard poi filter
            if (!gdClientData.categoryItems)
                gdClientData.categoryItems = [];
            this.categoryItems = gdClientData.categoryItems;
            this.cookieName = "InitialOpenItemIds";
            this.syncPoiFilter = "theRoutePoiFilter";
            this.tabHeaderID = "map_tabheader_listings";
            this.expandable = true;
        }

    },

    isRouteListings: false,
    expandable: null,
    syncPoiFilter: null,
    tabHeaderID: null,
    categoryItems: null,
    cookieName: null,
    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: '',
    baseIconUrl: "/images/map/categories/no_arrow/",
    store: null,
    model: null,
    tree: null,
    initialPoiCount: null,
    updatePoiCount: function (poiCount) {  // updates poi count (number in pharanthesis) in list
        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 + ')');
                                //  if (item.label.indexOf('stay') > -1)
                                //    alert(item.label + ': ' + item.name);
                            }
                    }
                    });
                }, this);
            }
            else
                this.initialPoiCount = poiCount;
        }
        catch (err) {
            alert("PoiFilter: " + err);
        }
        this.updateTreeClasses(true);
    },

    setup: function (p) {

        this.data.items = this.categoryItems;
        dojo.forEach(this.data.items, function (item) {
            if (item.childrenArray && item.childrenArray.length > 0 && item.childrenArray[0] != null) {  // sjekker om kategorien har under-kategorier
                item.children = item.childrenArray[0];  // populerer children-elementet til gjeldene kategori                
            }
        });
        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(this.cookieName, this.getInitialOpenItems(this.data.items), { expires: 1 });

        this.tree = new dijit.Tree({
            model: this.model,
            showRoot: false,
            persist: true,
            cookieName: this.cookieName,
            openOnClick: true,
            expandable: this.expandable,
            // Override _onClick method to prevent expanding a node when the checkbox is clicked.
            _onClick: function (/*TreeNode*/nodeWidget, /*Event*/e) {

                // summary: Translates click events into commands for the controller to process
                var domElement = e.target;
                var isExpandoClick = this.isExpandoNode(domElement, nodeWidget);

                // VisitNorway: We override this method to change the line below:
                //if ((this.openOnClick && nodeWidget.isExpandable) || isExpandoClick) {
                if ((((this.openOnClick && nodeWidget.isExpandable && domElement != nodeWidget.checkBoxNode) || isExpandoClick)) && (this.expandable)) {
                    // expando node was clicked, or label of a folder node was clicked; open it

                    if (nodeWidget.isExpandable) {
                        this._onExpandoClick({ node: nodeWidget });  // dette kallet fører til JS-feil i Firebug-consollet (TypeError: ed is undefined)
                        setTimeout("gdMapPage.tabManager.updateTabHeight('" + this.poiFilter.tabHeaderID + "')", 200); // delay resize because tree animation takes some time
                    }

                } else {
                    this._publish("execute", { item: nodeWidget.item, node: nodeWidget, evt: e });
                    this.onClick(nodeWidget.item, nodeWidget, e);
                    this.focusNode(nodeWidget);
                }
                dojo.stopEvent(e);
            },
            getIconClass: function (dataItem, opened) {
                return "";
            }
        });
        dojo.connect(this.tree, "onClick", this, "nodeClicked");

        // 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"));
        this.setup('t');
    },
    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 = null;
        var nodes = this.poiFilter.tree._itemNodesMap[identity];
        if (nodes)
            node = nodes[0];
        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);


            if ((node.item.icon) && (this.isRouteListings)) {  // listings in route tab category image override
                dojo.style(node.expandoNode, "backgroundImage", "url('" + this.poiFilter.baseIconUrl + node.item.icon + "')"); 
                dojo.style(node.expandoNode, "width", "20px");
                dojo.style(node.expandoNode, "height", "20px");
            }

        }
        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);
        if (this.expandable) {
            node.expandoNode.setAttribute("alt", etip);
            node.expandoNode.setAttribute("title", etip);
        }
        // Content node can lead to expand or click, depending...
        if ((node.isExpandable) && (this.expandable)) {
            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);
        }
    },
    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);
    },
    getSyncDataItem: function (dataItem) {  // get the same category dataitem in other poi filter (same name/id)
        var syncPoiFilter = dijit.byId(this.syncPoiFilter);
        if (syncPoiFilter) {
            for (i = 0; i < syncPoiFilter.categoryItems.length; i++) {
                if (syncPoiFilter.categoryItems[i].name * 1 == dataItem.name * 1)  // search for the same dataitem in other poi filter
                    return syncPoiFilter.categoryItems[i];
            }
        }
    },
    syncNodeClicked: function (dataItem, checked) {
        var syncPoiFilter = dijit.byId(this.syncPoiFilter);  // get reference to other poi filter that should by synchronized (route poi filter)
        if (syncPoiFilter) {
            var syncDataItem = this.getSyncDataItem(dataItem);
            if (syncDataItem) { // check/uncheck the same category (and sub-categories) in other poi filter for it to be in sync
                syncPoiFilter.poiFilter.setChecked(syncDataItem, checked);
                syncPoiFilter.poiFilter.checkChildItems(syncDataItem, checked);
            }
        }
    },
    nodeClicked: function (dataItem, node) {  // click on poi category checkbox

        var checked = this.poiFilter.getChecked(dataItem);
        checked = !(checked);  // toggle checkbox status
        this.poiFilter.setChecked(dataItem, checked);
        this.poiFilter.checkChildItems(dataItem, checked);
        this.poiFilter.updateTreeClasses();
        this.syncNodeClicked(dataItem, checked);  // sync other poi filter
        gdCallbackManager.requestContent('updatecontent');  // request poi data from server
    },
    checkAll: function (checked, event) {

        this.setChecked(this.model.root, checked);
        this.checkChildItems(this.model.root, checked);

        // sync other poi filter with correct checkbox status:
        var syncPoiFilter = dijit.byId(this.syncPoiFilter);
        if (syncPoiFilter) {
            for (var i = 0; i < this.model.root.children.length; i++) {
                var dataItem = this.model.root.children[i];
                var syncDataItem = this.getSyncDataItem(dataItem);
                if (syncDataItem) {
                    syncPoiFilter.setChecked(syncDataItem, checked);
                    syncPoiFilter.checkChildItems(syncDataItem, 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;
    }

});

