<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg">
  <head>
    <title>Performance Code Browser</title>
    <link rel="stylesheet" href="jquery.ui/themes/flora/flora.all.css" type="text/css" media="print, projection, screen"/>
    <style type="text/css">
    .c { color: #408080; font-style: italic } /* Comment */
.err { border: 1px solid #FF0000 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666666 } /* Operator */
.cm { color: #408080; font-style: italic } /* Comment.Multiline */
.cp { color: #BC7A00 } /* Comment.Preproc */
.c1 { color: #408080; font-style: italic } /* Comment.Single */
.cs { color: #408080; font-style: italic } /* Comment.Special */
.gd { color: #A00000 } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.gr { color: #FF0000 } /* Generic.Error */
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
.gi { color: #00A000 } /* Generic.Inserted */
.go { color: #808080 } /* Generic.Output */
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #0040D0 } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */
.m { color: #666666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */
.na { color: #7D9029 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */
.nc { color: #0000FF; font-weight: bold } /* Name.Class */
.no { color: #880000 } /* Name.Constant */
.nd { color: #AA22FF } /* Name.Decorator */
.ni { color: #999999; font-weight: bold } /* Name.Entity */
.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.nf { color: #0000FF } /* Name.Function */
.nl { color: #A0A000 } /* Name.Label */
.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */
.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.w { color: #bbbbbb } /* Text.Whitespace */
.mf { color: #666666 } /* Literal.Number.Float */
.mh { color: #666666 } /* Literal.Number.Hex */
.mi { color: #666666 } /* Literal.Number.Integer */
.mo { color: #666666 } /* Literal.Number.Oct */
.sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.s2 { color: #BA2121 } /* Literal.String.Double */
.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.sh { color: #BA2121 } /* Literal.String.Heredoc */
.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.sx { color: #008000 } /* Literal.String.Other */
.sr { color: #BB6688 } /* Literal.String.Regex */
.s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */
.vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */
.il { color: #666666 } /* Literal.Number.Integer.Long */
    #main {
        float: left;
        width: 74%;
    }
    #sidebar {
        float: right;
        width: 24%;
    }
    .ui-tabs-panel ul {
        margin-top: 0px;
        padding-left: 10px;
    }
    .fhdr {
        font-size: 16pt;
        font-weight: bold;
    }
    .finfo {
    }
    </style>
    <script src="jquery.js" type="text/javascript"/>
    <script type="text/javascript" src="jquery.history.js"/>
    <!-- <script type="text/javascript" src="jquery.scrollTo.js"></script> -->
    <script src="jquery.ui/ui.tabs.js" type="text/javascript"/>
    <script type="text/javascript">// <![CDATA[
    var tabby_main, tabby_sidebar;
    var view_main;
    var TAB_OVERVIEW = 0;
    var TAB_VIEW = 1;
    var cur_state = {file: null, func: null,
                     overview: null, mtab: TAB_OVERVIEW};
    function _show_overview_complete(data, status) {
        var magnetbox = $("#main_overview");
        magnetbox.empty();
        var adapted = document.adoptNode(data.responseXML.documentElement);
        magnetbox[0].appendChild(adapted);
        // link in to the event party...
        // (I tried to use jQuery's selector on this, but it didn't work...)
        var sf_nodes = $(document.getElementsByClassName('vsf'));
        sf_nodes.each(function (i) {
                $(this).click(show_file);
            });
    }
    function _show_file_complete(data, status) {
        var adapted = document.adoptNode(data.responseXML.documentElement);
        var magnetbox = $("#main_view");
        magnetbox.empty();
        magnetbox[0].appendChild(adapted.childNodes[2]);
        var file_index = $("#sidebar_file");
        file_index.empty();
        file_index[0].appendChild(adapted.childNodes[1]);
        $("#sidebar_file > div > ul > li").each(function (i) {
                $(this).click(show_func);
            });
        var func_list = $("#sidebar_funcs");
        func_list.empty();
        func_list[0].appendChild(adapted.childNodes[0]);
        $("#sidebar_funcs > div > ul > li").each(function (i) {
                $(this).click(show_func);
            });
        if (cur_state.func != null) {
            $('#func|' + cur_state.func).scrollTo();
        }
    }
    function show_file() {
        var barIndex = this.id.indexOf('|');
        var filename;
        if (barIndex >= 0) {
            filename = this.id.substring(barIndex+1);
        } else {
            filename = this.id;
        }
        $.history.load(make_hash(modify_state(cur_state,
                                              'file', filename + '.xml',
                                              'func', null,
                                              'mtab', TAB_VIEW)));
    }
    function show_func() {
        var barIndex = this.id.indexOf('|');
        var funcname;
        if (barIndex >= 0) {
            funcname = this.id.substring(barIndex+1);
        } else {
            funcname = this.id;
        }
        $.history.load(make_hash(modify_state(cur_state,
                                              'func', funcname,
                                              'mtab', TAB_VIEW)));
    }
    function modify_state(base_state) {
        new_state = {};
        // there is presumably some better way to do all this...
        for (var i in base_state) {
             new_state[i] = base_state[i];
        }
        for (var i = 1; i < arguments.length - 1; i += 2) {
            new_state[arguments[i]] = arguments[i+1]
        }
        return new_state;
    }
    function make_hash(state) {
        var hash_parts = [];
        for (var i in state) {
            if (state[i] != null) {
                hash_parts.push(i + '=' + state[i]);
            }
        }
        return hash_parts.join('|');
    }
    function state_from_hash(hash) {
        var new_state = {file: null, func: null, overview: null, mtab: null};
        var hash_bits = hash.split('|');
        for(var i = 0; i < hash_bits.length; ++i) {
            var key_val = hash_bits[i].split('=');
            // maintain types...
            if (typeof cur_state[key_val[0]] == 'number') {
                key_val[1] = parseInt(key_val[1]);
            }
            new_state[key_val[0]] = key_val[1];
        }
        return new_state;
    }
    function page_state_change(hash) {
        // allegedly hash should not include a leading #
        if (hash) {
            var desired_state = state_from_hash(hash);
            var loading_file = false;
            if (desired_state.file != cur_state.file) {
                cur_state.file = desired_state.file;
                if (desired_state.file == null) {
	                var magnetbox = $("#main_view");
	                magnetbox.empty();
                } else {
                    loading_file = true;
		            $.ajax({url: desired_state.file,
		                    dataType: 'xml', type: 'GET',
		                    complete: _show_file_complete});
			    }
	        }
            if (desired_state.overview != cur_state.overview) {
                cur_state.overview = desired_state.overview;
                if (desired_state.overview == null) {
		           magnetbox = $("#main_overview");
		           magnetbox.empty();
                } else {
	                $.ajax({url: desired_state.overview,
	                        dataType: 'xml', type: 'GET',
	                        complete: _show_overview_complete});
			    }
            }
            if (desired_state.mtab != cur_state.mtab) {
                cur_state.mtab = desired_state.mtab;
                if (tabby_main) {
                    tabby_main.tabs('select', parseInt(desired_state.mtab));
                }
            }
            if (desired_state.func != cur_state.func) {
                cur_state.func = desired_state.func;
                if (!loading_file && cur_state.func != null) {
//                    var id_name = 'func|' + cur_state.func;
//                    var dom_obj = document.getElementById(id_name);
//                    if (dom_obj != null) {
//                        $.scrollTo($(dom_obj));
//                    }
                }
            }
        } else {
           var desired_state = {mtab: TAB_OVERVIEW, overview: 'overview.svg'};
           $.history.load(make_hash(desired_state));
        }
    }
    function tab_main_changed(event, ui) {
        var index = ui.instance.$tabs.index(ui.tab);
        if (parseInt(cur_state.mtab) != index) {
            $.history.load(make_hash(modify_state(cur_state,'mtab', index)));
        }
        return true;
    }
    $(function() {
        tabby_main = $("#main > ul");
        tabby_main.tabs();
        tabby_main.bind('show.ui-tabs', tab_main_changed);
        tabby_sidebar = $("#sidebar > ul");
        tabby_sidebar.tabs();
        view_main = $("#main_view");
        $("#sidebar_files > ul > li").each(function (i) {
                $(this).click(show_file);
            });
        $.history.init(page_state_change);
    });
    // ]]>
    </script>
  </head>
  <body>
    <div id="main">
      <ul>
        <li><a href="#main_overview"><span>Overview</span></a></li>
        <li><a href="#main_view"><span>View</span></a></li>
      </ul>
      <div id="main_overview">
      </div>
      <div id="main_view">
      </div>
    </div>
    <div id="sidebar">
      <ul>
        <li><a href="#sidebar_files"><span>Files</span></a></li>
        <li><a href="#sidebar_funcs"><span>Funcs</span></a></li>
        <li><a href="#sidebar_file"><span>File</span></a></li>
      </ul>
      <div id="sidebar_files">
        <ul>
            <li id="aboutDialog_js">aboutDialog.js</li>
            <li id="add-get-delete-event_js">add-get-delete-event.js</li>
            <li id="add-get-delete-events_js">add-get-delete-events.js</li>
            <li id="advanced_js">advanced.js</li>
            <li id="agenda-listbox_js">agenda-listbox.js</li>
            <li id="agenda-listbox_xml">agenda-listbox.xml</li>
            <li id="alarms_js">alarms.js</li>
            <li id="applicationUtil_js">applicationUtil.js</li>
            <li id="attachFile_js">attachFile.js</li>
            <li id="attendee_js">attendee.js</li>
            <li id="autocomplete_xml">autocomplete.xml</li>
            <li id="browser_xml">browser.xml</li>
            <li id="button_xml">button.xml</li>
            <li id="calAlarmMonitor_js">calAlarmMonitor.js</li>
            <li id="calAlarmService_js">calAlarmService.js</li>
            <li id="calApplicationUtils_js">calApplicationUtils.js</li>
            <li id="calAttachment_js">calAttachment.js</li>
            <li id="calAttendee_js">calAttendee.js</li>
            <li id="calCachedCalendar_js">calCachedCalendar.js</li>
            <li id="calCalendarManager_js">calCalendarManager.js</li>
            <li id="calCalendarSearchService_js">calCalendarSearchService.js</li>
            <li id="calCompositeCalendar_js">calCompositeCalendar.js</li>
            <li id="calDateTimeFormatter_js">calDateTimeFormatter.js</li>
            <li id="calDavCalendar_js">calDavCalendar.js</li>
            <li id="calDavCalendarModule_js">calDavCalendarModule.js</li>
            <li id="calEvent_js">calEvent.js</li>
            <li id="calFreeBusyService_js">calFreeBusyService.js</li>
            <li id="calGoogleCalendar_js">calGoogleCalendar.js</li>
            <li id="calGoogleCalendarModule_js">calGoogleCalendarModule.js</li>
            <li id="calGoogleRequest_js">calGoogleRequest.js</li>
            <li id="calGoogleSession_js">calGoogleSession.js</li>
            <li id="calGoogleUtils_js">calGoogleUtils.js</li>
            <li id="calHtmlExport_js">calHtmlExport.js</li>
            <li id="calICSCalendar_js">calICSCalendar.js</li>
            <li id="calICSCalendarModule_js">calICSCalendarModule.js</li>
            <li id="calIcsImportExport_js">calIcsImportExport.js</li>
            <li id="calIcsParser_js">calIcsParser.js</li>
            <li id="calIcsSerializer_js">calIcsSerializer.js</li>
            <li id="calImportExportModule_js">calImportExportModule.js</li>
            <li id="calItemBase_js">calItemBase.js</li>
            <li id="calItemModule_js">calItemModule.js</li>
            <li id="calItipEmailTransport_js">calItipEmailTransport.js</li>
            <li id="calItipItem_js">calItipItem.js</li>
            <li id="calItipProcessor_js">calItipProcessor.js</li>
            <li id="calItipProtocolHandler_js">calItipProtocolHandler.js</li>
            <li id="calListFormatter_js">calListFormatter.js</li>
            <li id="calMemoryCalendar_js">calMemoryCalendar.js</li>
            <li id="calMemoryCalendarModule_js">calMemoryCalendarModule.js</li>
            <li id="calMonthGridPrinter_js">calMonthGridPrinter.js</li>
            <li id="calOutlookCSVImportExport_js">calOutlookCSVImportExport.js</li>
            <li id="calProtocolHandler_js">calProtocolHandler.js</li>
            <li id="calProviderBase_js">calProviderBase.js</li>
            <li id="calRecurrenceInfo_js">calRecurrenceInfo.js</li>
            <li id="calStorageCalendar_js">calStorageCalendar.js</li>
            <li id="calStorageCalendarModule_js">calStorageCalendarModule.js</li>
            <li id="calTodo_js">calTodo.js</li>
            <li id="calTransactionManager_js">calTransactionManager.js</li>
            <li id="calUtils_js">calUtils.js</li>
            <li id="calWcapCalendar_js">calWcapCalendar.js</li>
            <li id="calWcapCalendarItems_js">calWcapCalendarItems.js</li>
            <li id="calWcapCalendarModule_js">calWcapCalendarModule.js</li>
            <li id="calWcapErrors_js">calWcapErrors.js</li>
            <li id="calWcapRequest_js">calWcapRequest.js</li>
            <li id="calWcapSession_js">calWcapSession.js</li>
            <li id="calWcapUtils_js">calWcapUtils.js</li>
            <li id="calWeekPrinter_js">calWeekPrinter.js</li>
            <li id="calWeekTitleService_js">calWeekTitleService.js</li>
            <li id="calendar-alarm-dialog_js">calendar-alarm-dialog.js</li>
            <li id="calendar-alarm-snooze-popup_js">calendar-alarm-snooze-popup.js</li>
            <li id="calendar-alarm-widget_xml">calendar-alarm-widget.xml</li>
            <li id="calendar-attendee-list_xml">calendar-attendee-list.xml</li>
            <li id="calendar-common-sets_js">calendar-common-sets.js</li>
            <li id="calendar-creation_js">calendar-creation.js</li>
            <li id="calendar-daypicker_xml">calendar-daypicker.xml</li>
            <li id="calendar-decorated-base_xml">calendar-decorated-base.xml</li>
            <li id="calendar-decorated-day-view_xml">calendar-decorated-day-view.xml</li>
            <li id="calendar-decorated-month-view_xml">calendar-decorated-month-view.xml</li>
            <li id="calendar-decorated-multiday-base-view_xml">calendar-decorated-multiday-base-view.xml</li>
            <li id="calendar-decorated-multiweek-view_xml">calendar-decorated-multiweek-view.xml</li>
            <li id="calendar-decorated-week-view_xml">calendar-decorated-week-view.xml</li>
            <li id="calendar-dialog-utils_js">calendar-dialog-utils.js</li>
            <li id="calendar-dnd-listener_js">calendar-dnd-listener.js</li>
            <li id="calendar-event-dialog_js">calendar-event-dialog.js</li>
            <li id="calendar-invitations-dialog_js">calendar-invitations-dialog.js</li>
            <li id="calendar-invitations-list_xml">calendar-invitations-list.xml</li>
            <li id="calendar-invitations-manager_js">calendar-invitations-manager.js</li>
            <li id="calendar-item-editing_js">calendar-item-editing.js</li>
            <li id="calendar-management_js">calendar-management.js</li>
            <li id="calendar-minimonth-busy_js">calendar-minimonth-busy.js</li>
            <li id="calendar-month-view_xml">calendar-month-view.xml</li>
            <li id="calendar-multiday-view_xml">calendar-multiday-view.xml</li>
            <li id="calendar-offline_js">calendar-offline.js</li>
            <li id="calendar-publish-dialog_js">calendar-publish-dialog.js</li>
            <li id="calendar-recurrence-dialog_js">calendar-recurrence-dialog.js</li>
            <li id="calendar-subscriptions-dialog_js">calendar-subscriptions-dialog.js</li>
            <li id="calendar-subscriptions-list_xml">calendar-subscriptions-list.xml</li>
            <li id="calendar-summary-dialog_js">calendar-summary-dialog.js</li>
            <li id="calendar-task-editing_js">calendar-task-editing.js</li>
            <li id="calendar-task-tree_js">calendar-task-tree.js</li>
            <li id="calendar-task-tree_xml">calendar-task-tree.xml</li>
            <li id="calendar-task-view_js">calendar-task-view.js</li>
            <li id="calendar-ui-utils_js">calendar-ui-utils.js</li>
            <li id="calendar-unifinder-todo_js">calendar-unifinder-todo.js</li>
            <li id="calendar-unifinder_js">calendar-unifinder.js</li>
            <li id="calendar-view-core_xml">calendar-view-core.xml</li>
            <li id="calendar-views_js">calendar-views.js</li>
            <li id="calendar_js">calendar.js</li>
            <li id="calendarCreation_js">calendarCreation.js</li>
            <li id="calendarProperties_js">calendarProperties.js</li>
            <li id="calendarService_js">calendarService.js</li>
            <li id="calendarWindow_js">calendarWindow.js</li>
            <li id="categories_js">categories.js</li>
            <li id="channel-prefs_js">channel-prefs.js</li>
            <li id="checkbox_xml">checkbox.xml</li>
            <li id="clipboard_js">clipboard.js</li>
            <li id="colorpicker_xml">colorpicker.xml</li>
            <li id="connection_js">connection.js</li>
            <li id="customize-toolbar_js">customize-toolbar.js</li>
            <li id="datetimepicker_xml">datetimepicker.xml</li>
            <li id="datetimepickers_xml">datetimepickers.xml</li>
            <li id="dialog_xml">dialog.xml</li>
            <li id="editor_xml">editor.xml</li>
            <li id="expander_xml">expander.xml</li>
            <li id="findbar_xml">findbar.xml</li>
            <li id="general_js">general.js</li>
            <li id="general_xml">general.xml</li>
            <li id="goToDateDialog_js">goToDateDialog.js</li>
            <li id="groupbox_xml">groupbox.xml</li>
            <li id="head_consts_js">head_consts.js</li>
            <li id="hiddenWindow_js">hiddenWindow.js</li>
            <li id="ics-roundtrip_js">ics-roundtrip.js</li>
            <li id="ics2ics_js">ics2ics.js</li>
            <li id="imip-bar_js">imip-bar.js</li>
            <li id="import-export_js">import-export.js</li>
            <li id="lightning-common-sets_js">lightning-common-sets.js</li>
            <li id="lightning-utils_js">lightning-utils.js</li>
            <li id="lightning_js">lightning.js</li>
            <li id="lightningTextCalendarConverter_js">lightningTextCalendarConverter.js</li>
            <li id="listbox_xml">listbox.xml</li>
            <li id="menu_xml">menu.xml</li>
            <li id="menulist_xml">menulist.xml</li>
            <li id="messenger-overlay-preferences_js">messenger-overlay-preferences.js</li>
            <li id="messenger-overlay-sidebar_js">messenger-overlay-sidebar.js</li>
            <li id="messenger-overlay-toolbar_js">messenger-overlay-toolbar.js</li>
            <li id="migration_js">migration.js</li>
            <li id="minimonth_xml">minimonth.xml</li>
            <li id="mouseoverPreviews_js">mouseoverPreviews.js</li>
            <li id="notification_xml">notification.xml</li>
            <li id="numberbox_xml">numberbox.xml</li>
            <li id="optionsDialog_xml">optionsDialog.xml</li>
            <li id="outlookImportDialog_js">outlookImportDialog.js</li>
            <li id="popup_xml">popup.xml</li>
            <li id="preferences_js">preferences.js</li>
            <li id="preferences_xml">preferences.xml</li>
            <li id="prefs_js">prefs.js</li>
            <li id="printDialog_js">printDialog.js</li>
            <li id="progressmeter_xml">progressmeter.xml</li>
            <li id="publish_js">publish.js</li>
            <li id="publishDialog_js">publishDialog.js</li>
            <li id="radio_xml">radio.xml</li>
            <li id="richlistbox_xml">richlistbox.xml</li>
            <li id="scale_xml">scale.xml</li>
            <li id="scrollbar_xml">scrollbar.xml</li>
            <li id="scrollbox_xml">scrollbox.xml</li>
            <li id="shell_js">shell.js</li>
            <li id="shell_js">shell.js</li>
            <li id="shell_js">shell.js</li>
            <li id="simple-item-mutability_js">simple-item-mutability.js</li>
            <li id="spinbuttons_xml">spinbuttons.xml</li>
            <li id="splitter_xml">splitter.xml</li>
            <li id="stringbundle_xml">stringbundle.xml</li>
            <li id="sun-calendar-event-dialog-attendees_js">sun-calendar-event-dialog-attendees.js</li>
            <li id="sun-calendar-event-dialog-attendees_xml">sun-calendar-event-dialog-attendees.xml</li>
            <li id="sun-calendar-event-dialog-freebusy_xml">sun-calendar-event-dialog-freebusy.xml</li>
            <li id="sun-calendar-event-dialog-recurrence-preview_xml">sun-calendar-event-dialog-recurrence-preview.xml</li>
            <li id="sun-calendar-event-dialog-recurrence_js">sun-calendar-event-dialog-recurrence.js</li>
            <li id="sun-calendar-event-dialog-reminder_js">sun-calendar-event-dialog-reminder.js</li>
            <li id="sun-calendar-event-dialog-timezone_js">sun-calendar-event-dialog-timezone.js</li>
            <li id="sun-calendar-event-dialog_js">sun-calendar-event-dialog.js</li>
            <li id="sunbird-l10n_js">sunbird-l10n.js</li>
            <li id="sunbird_js">sunbird.js</li>
            <li id="synchronization_js">synchronization.js</li>
            <li id="tabbox_xml">tabbox.xml</li>
            <li id="test_attendee_js">test_attendee.js</li>
            <li id="test_datetime_js">test_datetime.js</li>
            <li id="test_freebusy_js">test_freebusy.js</li>
            <li id="test_ics_roundtrip_js">test_ics_roundtrip.js</li>
            <li id="test_providers_js">test_providers.js</li>
            <li id="test_recur_js">test_recur.js</li>
            <li id="text_xml">text.xml</li>
            <li id="textbox_xml">textbox.xml</li>
            <li id="timezones_js">timezones.js</li>
            <li id="today-pane_js">today-pane.js</li>
            <li id="toolbar_xml">toolbar.xml</li>
            <li id="toolbarbutton_xml">toolbarbutton.xml</li>
            <li id="tree_xml">tree.xml</li>
            <li id="views_js">views.js</li>
            <li id="wizard_xml">wizard.xml</li>
        </ul>
      </div>
      <div id="sidebar_funcs">
      </div>
      <div id="sidebar_file">
      </div>
    </div>
  </body>
</html>