| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562 | var currentNodeUrl = '';var allNodeUrls = [];var openNextPage = $axure.player.openNextPage = function () {    var index = allNodeUrls.indexOf(currentNodeUrl) + 1;    if(index >= allNodeUrls.length) return;    var nextNodeUrl = allNodeUrls[index];    currentNodeUrl = nextNodeUrl;    $('.sitemapPageLink[nodeUrl="' + nextNodeUrl + '"]').parent().mousedown();};var openPreviousPage = $axure.player.openPreviousPage = function () {    var index = allNodeUrls.indexOf(currentNodeUrl) - 1;    if(index < 0) return;    var nextNodeUrl = allNodeUrls[index];    currentNodeUrl = nextNodeUrl;    $('.sitemapPageLink[nodeUrl="' + nextNodeUrl + '"]').parent().mousedown();};// use this to isolate the scope(function() {    var SHOW_HIDE_ANIMATION_DURATION = 0;    var HIGHLIGHT_INTERACTIVE_VAR_NAME = 'hi';    var currentPageLoc = '';    var currentPlayerLoc = '';    var currentPageHashString = '';    $(window.document).ready(function() {        $axure.player.createPluginHost({            id: 'sitemapHost',            context: 'project',            title: 'Project Pages',            gid: 1,        });        $(window.document).bind('keyup', function (e) {            if (e.target.localName == "textarea" || e.target.localName == "input" || event.target.isContentEditable) return;            switch(e.which) {                case 188:                    openPreviousPage();                    break;                case 190:                    openNextPage();                    break;                default: return; // exit this handler for other keys            }        });        generateSitemap();        var pageCount = $('.sitemapPageLink').length;                $('.leftArrow').click(openPreviousPage);        $('.rightArrow').click(openNextPage);        $('.sitemapPlusMinusLink').click(collapse_click);        $('.sitemapPageLink').parent().mousedown(node_click);        $('#interfaceAdaptiveViewsListContainer').hide();        $('#projectOptionsShowHotspots').click(showHotspots_click);        $('#searchIcon').click(searchBoxClose_click);        $('#searchDiv').click(searchBoxExpand_click);        $('#searchBox').keyup(search_input_keyup);        // bind to the page load        $axure.page.bind('load.sitemap', function() {            currentPageLoc = $axure.page.location.split("#")[0];            var decodedPageLoc = decodeURI(currentPageLoc);            currentNodeUrl = decodedPageLoc.substr(decodedPageLoc.lastIndexOf('/') ? decodedPageLoc.lastIndexOf('/') + 1 : 0);            currentPlayerLoc = $(location).attr('href').split("#")[0].split("?")[0];            currentPageHashString = '#p=' + currentNodeUrl.substr(0, currentNodeUrl.lastIndexOf('.'));            $axure.player.setVarInCurrentUrlHash(PAGE_ID_NAME, $axure.player.getPageIdByUrl(currentNodeUrl));            $axure.player.setVarInCurrentUrlHash(PAGE_URL_NAME, currentNodeUrl.substring(0, currentNodeUrl.lastIndexOf('.html')));            $('#sitemapTreeContainer').find('.sitemapHighlight').removeClass('sitemapHighlight');            var $currentNode = $('.sitemapPageLink[nodeUrl="' + currentNodeUrl + '"]');            $currentNode.parent().parent().addClass('sitemapHighlight');            var pageName = $axure.page.pageName;            $('.pageNameHeader').html(pageName);            if ($currentNode.length > 0 && pageCount > 1) {                var currentNode = $currentNode[0];                var currentNum = $('.sitemapPageLink').index(currentNode) + 1;                $('.pageCountHeader').html('(' + currentNum + ' of ' + pageCount + ')');            } else $('.pageCountHeader').html('');            //If highlight var is present and set to 1 or else if            //sitemap highlight button is selected then highlight interactive elements            var hiVal = $axure.player.getHashStringVar(HIGHLIGHT_INTERACTIVE_VAR_NAME);            if(hiVal.length > 0 && hiVal == 1) {                $('#showHotspotsOption').find('.overflowOptionCheckbox').addClass('selected');                if ($('#projectOptionsHotspotsCheckbox').length > 0) $('#projectOptionsHotspotsCheckbox').addClass('selected');                $axure.messageCenter.postMessage('highlightInteractive', true);            } else if ($('#showHotspotsOption').find('.overflowOptionCheckbox').hasClass('selected')) {                $axure.messageCenter.postMessage('highlightInteractive', true);            }            generateAdaptiveViews(false);            if (MOBILE_DEVICE) generateAdaptiveViews(true);            $axure.player.suspendRefreshViewPort = true;            //Set the current view if it is defined in the hash string            //If the view is invalid, set it to 'auto' in the string            //ELSE set the view based on the currently selected view in the toolbar menu            var viewStr = $axure.player.getHashStringVar(ADAPTIVE_VIEW_VAR_NAME);            if(viewStr.length > 0) {                var $view = $('.adaptiveViewOption[val="' + viewStr + '"]');                if($view.length > 0) $view.click();                else $('.adaptiveViewOption[val="auto"]').click();            } else if($('.selectedRadioButton').length > 0) {                var $viewOption = $('.selectedRadioButton').parents('.adaptiveViewOption');                $viewOption.click();            }            updateAdaptiveViewHeader();            function setDefaultScaleForDevice() {                if(MOBILE_DEVICE && $axure.player.isMobileMode()) {                    $('.projectOptionsScaleRow[val="0"]').click();                } else {                    $('.vpScaleOption[val="0"]').click();                }            }            var scaleStr = $axure.player.getHashStringVar(SCALE_VAR_NAME);            if(scaleStr.length > 0) {                var $scale = $('.vpScaleOption[val="' + scaleStr + '"]');                if($scale.length > 0) $scale.click();                else setDefaultScaleForDevice();            } else {                setDefaultScaleForDevice();            }            var rotateStr = $axure.player.getHashStringVar(ROT_VAR_NAME);            if(rotateStr.length > 0) {                $('#vpRotate').prop('checked', true);            }            $axure.player.suspendRefreshViewPort = false;            if (!$axure.player.isViewOverridden()) $axure.messageCenter.postMessage('setAdaptiveViewForSize', { 'width': $('#mainPanel').width(), 'height': $('#mainPanel').height() });            $axure.player.refreshViewPort();            $axure.messageCenter.postMessage('finishInit');            showMainPanel();            return false;        });        var $vpContainer = $('#interfaceScaleListContainer');                var scaleOptions = '<div class="vpScaleOption" val="0"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Default Scale</div>';        scaleOptions += '<div class="vpScaleOption" val="1"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Scale to Width</div>';        scaleOptions += '<div class="vpScaleOption" val="2"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Scale to Fit</div>';        $(scaleOptions).appendTo($vpContainer);        $('#overflowMenuContainer').append('<div id="showHotspotsOption" class="showOption" style="order: 1"><div class="overflowOptionCheckbox"></div>Show Hotspots</div>');        $('#overflowMenuContainer').append($vpContainer);        $vpContainer.show();        $('#showHotspotsOption').click(showHotspots_click);        $('.vpScaleOption').click(vpScaleOption_click);        $('.vpScaleOption').mouseup(function (event) {            event.stopPropagation();        });        if (MOBILE_DEVICE) {            var scaleOptions = '<div class="projectOptionsScaleRow" val="1"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Scale to fit width</div>';            scaleOptions += '<div class="projectOptionsScaleRow" val="0"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Original size (100%)</div>';            scaleOptions += '<div class="projectOptionsScaleRow" val="2" style="border-bottom: solid 1px #c7c7c7"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Fit all to screen</div>';            $(scaleOptions).appendTo($('#projectOptionsScaleContainer'));            $('.projectOptionsScaleRow').click(vpScaleOption_click);        }        $('#searchBox').focusin(function() {            if($(this).is('.searchBoxHint')) {                $(this).val('');                $(this).removeClass('searchBoxHint');            }        }).focusout(function() {            if($(this).val() == '') {                $(this).addClass('searchBoxHint');            }        });        $('#searchBox').focusout();    });    var _formatViewDimension = function(dim) {        if(dim == 0) return 'any';        if(dim.toString().includes('.')) return dim.toFixed(2);        return dim;    };    function generateAdaptiveViews(forProjectOptions) {        var $container = forProjectOptions ? $('#projectOptionsAdaptiveViewsContainer') : $('#interfaceAdaptiveViewsListContainer');        var $viewSelect = forProjectOptions ? $('#projectOptionsViewSelect') : $('#viewSelect');        var adaptiveViewOptionClass = forProjectOptions ? 'projectOptionsAdaptiveViewRow' : 'adaptiveViewOption';        var currentViewClass = forProjectOptions ? '' : 'currentAdaptiveView';        $container.empty();        $viewSelect.empty();        //Fill out adaptive view container with prototype's defined adaptive views, as well as the default, and Auto        var viewsList = '<div class="' + adaptiveViewOptionClass + '" val="auto"><div class="adapViewRadioButton selectedRadioButton"><div class="selectedRadioButtonFill"></div></div>Adaptive</div>';        var viewSelect = '<option value="auto">Adaptive</option>';        if (typeof $axure.page.defaultAdaptiveView.name != 'undefined') {            //If the name is a blank string, make the view name the width if non-zero, else 'any'            var defaultView = $axure.page.defaultAdaptiveView;            var defaultViewName = defaultView.name;            var widthString = _formatViewDimension(defaultView.size.width);            var heightString = _formatViewDimension(defaultView.size.height);            var viewString = defaultViewName + ' (' + widthString + ' x ' + heightString + ')';            viewsList += '<div class="' + adaptiveViewOptionClass + ' ' + currentViewClass + '" val="default"data-dim="' + defaultView.size.width + 'x' + defaultView.size.height + '">' +                '<div class="adapViewRadioButton"><div class="selectedRadioButtonFill"></div></div>' + viewString + '</div>';            viewSelect += '<option value="default">' + viewString + '</option>';        }        var useViews = $axure.document.configuration.useViews;        var hasViews = false;        if(useViews) {            for(var viewIndex = 0; viewIndex < $axure.page.adaptiveViews.length; viewIndex++) {                var currView = $axure.page.adaptiveViews[viewIndex];                var widthString = _formatViewDimension(currView.size.width);                var heightString = _formatViewDimension(currView.size.height);                var viewString = currView.name + ' (' + widthString + ' x ' + heightString + ')';                viewsList += '<div class="' + adaptiveViewOptionClass +                    ((forProjectOptions && (viewIndex == $axure.page.adaptiveViews.length - 1)) ? '" style="border-bottom: solid 1px #c7c7c7; margin-bottom: 15px;' : '') +                     '" val="' +                    currView.id +                    '"  data-dim="' +                    currView.size.width +                    'x' +                    currView.size.height +                    '"><div class="adapViewRadioButton"><div class="selectedRadioButtonFill"></div></div>' +                    viewString +                    '</div>';                viewSelect += '<option value="' + currView.id + '">' + viewString + '</option>';                hasViews = true;            }        }        $container.append(viewsList);        $viewSelect.append(viewSelect);        if (!hasViews) {            if (forProjectOptions) {                $('#projectOptionsAdaptiveViewsHeader').hide();                $('#projectOptionsAdaptiveViewsContainer').hide();            } else $('#interfaceAdaptiveViewsContainer').hide();        } else {            if (forProjectOptions) {                $('#projectOptionsAdaptiveViewsHeader').show();                $('#projectOptionsAdaptiveViewsContainer').show();            } else $('#interfaceAdaptiveViewsContainer').show();        }        $(('.' + adaptiveViewOptionClass)).click(adaptiveViewOption_click);        if (!forProjectOptions) {            $(('.' + adaptiveViewOptionClass)).mouseup(function (event) {                event.stopPropagation();            });        }    }    function collapse_click(event) {        if($(this).children('.sitemapPlus').length > 0) {            expand_click($(this));        } else {            $(this)                .children('.sitemapMinus').removeClass('sitemapMinus').addClass('sitemapPlus').end()                .closest('li').children('ul').hide(SHOW_HIDE_ANIMATION_DURATION);        }        event.stopPropagation();    }    function expand_click($this) {        $this            .children('.sitemapPlus').removeClass('sitemapPlus').addClass('sitemapMinus').end()            .closest('li').children('ul').show(SHOW_HIDE_ANIMATION_DURATION);    }    function searchBoxExpand_click(event) {        if (!$('#searchIcon').hasClass('sitemapToolbarButtonSelected')) {            $('#searchIcon').addClass('sitemapToolbarButtonSelected')            $('#searchBox').width(0);            $('#searchBox').show();            $('#searchBox').animate({ width: '95%' }, { duration: 200, complete: function () { $('#searchBox').focus(); } });        }    }    function searchBoxClose_click(event) {        if ($('#searchIcon').hasClass('sitemapToolbarButtonSelected')) {            $('#searchBox').animate({ width: '0%' }, { duration: 200,                complete: function () {                    $('#searchBox').hide();                    $('#searchIcon').removeClass('sitemapToolbarButtonSelected')                }});            $('#searchBox').val('');            $('#searchBox').keyup();        }    }    function node_click(event) {        hideMainPanel();        $('#sitemapTreeContainer').find('.sitemapHighlight').removeClass('sitemapHighlight');        $(this).parent().addClass('sitemapHighlight');        $axure.page.navigate($(this).children('.sitemapPageLink')[0].getAttribute('nodeUrl'), true);    }    function hideMainPanel() {        $('#mainPanel').css('opacity', '0');        $('#clippingBounds').css('opacity', '0');    }    function showMainPanel() {        $('#mainPanel').animate({ opacity: 1 }, 10);        $('#clippingBounds').animate({ opacity: 1 }, 10);    }    $axure.messageCenter.addMessageListener(function(message, data) {        if(message == 'adaptiveViewChange') {            $('.adaptiveViewOption').removeClass('currentAdaptiveView');            if(data.viewId) {$('.adaptiveViewOption[val="' + data.viewId + '"]').addClass('currentAdaptiveView');}            else $('.adaptiveViewOption[val="default"]').addClass('currentAdaptiveView');            //when we set adaptive view through user event, we want to update the checkmark on sitemap            if(data.forceSwitchTo) {                $('.adapViewRadioButton').find('.selectedRadioButtonFill').hide();                $('.adapViewRadioButton').removeClass('selectedRadioButton');                $('div[val="' + data.forceSwitchTo + '"]').find('.adapViewRadioButton').addClass('selectedRadioButton');                $('div[val="' + data.forceSwitchTo + '"]').find('.selectedRadioButtonFill').show();            }            updateAdaptiveViewHeader();            $axure.player.refreshViewPort();        } else if(message == 'previousPage') {            openPreviousPage();        } else if(message == 'nextPage') {            openNextPage();        }    });    $axure.player.toggleHotspots = function (val) {        var overflowMenuCheckbox = $('#showHotspotsOption').find('.overflowOptionCheckbox');        if ($(overflowMenuCheckbox).hasClass('selected')) {            if (!val) $('#showHotspotsOption').click();        } else {            if (val) $('#showHotspotsOption').click();        }    }    function showHotspots_click(event) {        var overflowMenuCheckbox = $('#showHotspotsOption').find('.overflowOptionCheckbox');        var projOptionsCheckbox = $('#projectOptionsHotspotsCheckbox');        if ($(overflowMenuCheckbox).hasClass('selected')) {            overflowMenuCheckbox.removeClass('selected');            if (projOptionsCheckbox.length > 0 ) projOptionsCheckbox.removeClass('selected');            $axure.messageCenter.postMessage('highlightInteractive', false);            //Delete 'hi' hash string var if it exists since default is unselected            $axure.player.deleteVarFromCurrentUrlHash(HIGHLIGHT_INTERACTIVE_VAR_NAME);        } else {            overflowMenuCheckbox.addClass('selected');            if (projOptionsCheckbox.length > 0) projOptionsCheckbox.addClass('selected');            $axure.messageCenter.postMessage('highlightInteractive', true);            //Add 'hi' hash string var so that stay highlighted across reloads            $axure.player.setVarInCurrentUrlHash(HIGHLIGHT_INTERACTIVE_VAR_NAME, 1);        }    }    function adaptiveViewOption_click(event) {        var currVal = $(this).attr('val');        $('.adaptiveViewOption').removeClass('currentAdaptiveView');        if(currVal) {$('.adaptiveViewOption[val="' + currVal + '"]').addClass('currentAdaptiveView');}        else $('.adaptiveViewOption[val="default"]').addClass('currentAdaptiveView');        $('.adapViewRadioButton').find('.selectedRadioButtonFill').hide();        $('.adapViewRadioButton').removeClass('selectedRadioButton');        $('div[val="' + currVal + '"]').find('.adapViewRadioButton').addClass('selectedRadioButton');        $('div[val="' + currVal + '"]').find('.selectedRadioButtonFill').show();        selectAdaptiveView(currVal);        $axure.player.closePopup();        updateAdaptiveViewHeader();    }    var selectAdaptiveView = $axure.player.selectAdaptiveView = function(currVal) {        if (currVal == 'auto') {            $axure.messageCenter.postMessage('setAdaptiveViewForSize', { 'width': $('#mainPanel').width(), 'height': $('#mainPanel').height() });            $axure.player.deleteVarFromCurrentUrlHash(ADAPTIVE_VIEW_VAR_NAME);        } else {            currentPageLoc = $axure.page.location.split("#")[0];            var decodedPageLoc = decodeURI(currentPageLoc);            var nodeUrl = decodedPageLoc.substr(decodedPageLoc.lastIndexOf('/')                ? decodedPageLoc.lastIndexOf('/') + 1                : 0);            var adaptiveData = {                src: nodeUrl            };            adaptiveData.view = currVal;            $axure.messageCenter.postMessage('switchAdaptiveView', adaptiveData);            $axure.player.setVarInCurrentUrlHash(ADAPTIVE_VIEW_VAR_NAME, currVal);        }    }    $axure.player.updateAdaptiveViewHeader = updateAdaptiveViewHeader = function () {        var hasDefinedDim = true;        var dimensionlessViewStr = '(any x any)';        var viewString = $('.adaptiveViewOption.currentAdaptiveView').text();        if (viewString != null && viewString.indexOf(dimensionlessViewStr) >= 0) hasDefinedDim = false;        if (!hasDefinedDim) {            var viewName = viewString.substring(0, viewString.lastIndexOf(' ('));            var widthString = $('#mainPanelContainer').width();            viewString = viewName + ' (' + widthString + ' x any)';        }        $('.adaptiveViewHeader').html(viewString);    }    $axure.player.selectScaleOption = function (scaleVal) {        var $scale = $('.vpScaleOption[val="' + scaleVal + '"]');        if ($scale.length > 0) $scale.click();    }    function vpScaleOption_click(event) {        var scaleCheckDiv = $(this).find('.scaleRadioButton');        var scaleVal = $(this).attr('val');        if (scaleCheckDiv.hasClass('selectedRadioButton')) return false;        var $selectedScaleOption = $('.vpScaleOption[val="' + scaleVal + '"], .projectOptionsScaleRow[val="' + scaleVal + '"]');        var $allScaleOptions = $('.vpScaleOption, .projectOptionsScaleRow');        $allScaleOptions.find('.scaleRadioButton').removeClass('selectedRadioButton');        $allScaleOptions.find('.selectedRadioButtonFill').hide();        $selectedScaleOption.find('.scaleRadioButton').addClass('selectedRadioButton');        $selectedScaleOption.find('.selectedRadioButtonFill').show();        if (scaleVal == '0') {            $axure.player.deleteVarFromCurrentUrlHash(SCALE_VAR_NAME);        } else if (typeof scaleVal !== 'undefined') {            $axure.player.setVarInCurrentUrlHash(SCALE_VAR_NAME, scaleVal);        }        $axure.player.refreshViewPort();    }    function search_input_keyup(event) {        var searchVal = $(this).val().toLowerCase();        //If empty search field, show all nodes, else grey+hide all nodes and        //ungrey+unhide all matching nodes, as well as unhide their parent nodes        if(searchVal == '') {            $('.sitemapPageName').removeClass('sitemapGreyedName');            $('.sitemapNode').show();        } else {            $('.sitemapNode').hide();            $('.sitemapPageName').addClass('sitemapGreyedName').each(function() {                var nodeName = $(this).text().toLowerCase();                if(nodeName.indexOf(searchVal) != -1) {                    $(this).removeClass('sitemapGreyedName').parents('.sitemapNode:first').show().parents('.sitemapExpandableNode').show();                }            });        }    }    function generateSitemap() {        var treeUl = "<div id='sitemapHeader'' class='sitemapHeader'>";        treeUl += "<div id='sitemapToolbar' class='sitemapToolbar'>";        treeUl += '<div id="searchDiv"><span id="searchIcon" class="sitemapToolbarButton"></span><input id="searchBox" type="text"/></div>';        treeUl += "<div class='leftArrow sitemapToolbarButton'></div>";        treeUl += "<div class='rightArrow sitemapToolbarButton'></div>";        treeUl += "</div>";        treeUl += "</div>";        ///////////////////        var sitemapTitle = $axure.player.getProjectName();        if (!sitemapTitle) sitemapTitle = "Pages";        treeUl += "<div class='sitemapPluginNameHeader pluginNameHeader'>" + sitemapTitle + "</div>";        treeUl += "<div id='sitemapTreeContainer'>";        treeUl += "<ul class='sitemapTree' style='clear:both;'>";        var rootNodes = $axure.document.sitemap.rootNodes;        for(var i = 0; i < rootNodes.length; i++) {            treeUl += generateNode(rootNodes[i], 0);        }        treeUl += "</ul></div>";        if (!MOBILE_DEVICE) {            treeUl += "<div id='changePageInstructions' class='pageSwapInstructions'>Use  ";            treeUl += '<span class="backKeys"></span>';            treeUl += "  and  ";            treeUl += '<span class="forwardKeys"></span>';            treeUl += "  keys<br>to move between pages";            treeUl += "</div>";        }        $('#sitemapHost').html(treeUl);    }    function generateNode(node, level) {        var hasChildren = (node.children && node.children.length > 0);        var margin, returnVal;        if(hasChildren) {            margin = (9 + level * 17);            returnVal = "<li class='sitemapNode sitemapExpandableNode'><div><div class='sitemapPageLinkContainer' style='margin-left:" + margin + "px'><a class='sitemapPlusMinusLink'><span class='sitemapMinus'></span></a>";        } else {            margin = (19 + level * 17);            returnVal = "<li class='sitemapNode sitemapLeafNode'><div><div class='sitemapPageLinkContainer' style='margin-left:" + margin + "px'>";        }        var isFolder = node.type == "Folder";        if(!isFolder) {            returnVal += "<a class='sitemapPageLink' nodeUrl='" + node.url + "'>";            allNodeUrls.push(node.url);        }        returnVal += "<span class='sitemapPageIcon";		if(node.type == "Flow"){ returnVal += " sitemapFlowIcon";}        if(isFolder) { returnVal += " sitemapFolderIcon"; }        returnVal += "'></span><span class='sitemapPageName'>";        returnVal += $('<div/>').text(node.pageName).html();        returnVal += "</span>";        if(!isFolder) returnVal += "</a>";        returnVal += "</div></div>";        if(hasChildren) {            returnVal += "<ul>";            for(var i = 0; i < node.children.length; i++) {                var child = node.children[i];                returnVal += generateNode(child, level + 1);            }            returnVal += "</ul>";        }        returnVal += "</li>";        return returnVal;    }})();
 |