You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2011/06/25 01:07:38 UTC

svn commit: r1139458 [23/24] - in /lucene/dev/branches/solr2193: ./ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/ dev-tools/idea/solr/ dev-tools/idea/solr/contrib/clustering/ dev-tools/maven/ dev-tools/maven/modules/analysis/icu/ dev-...

Modified: lucene/dev/branches/solr2193/solr/src/webapp/web/js/script.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/webapp/web/js/script.js?rev=1139458&r1=1139457&r2=1139458&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/webapp/web/js/script.js (original)
+++ lucene/dev/branches/solr2193/solr/src/webapp/web/js/script.js Fri Jun 24 23:07:10 2011
@@ -36,26 +36,31 @@ var sammy = $.sammy
             'ping',
             function( event )
             {
-                var element = $( this.params.element );
-                
                 $.ajax
                 (
                     {
-                        url : element.attr( 'href' ) + '?wt=json',
+                        url : $( this.params.element ).attr( 'rel' ) + '?wt=json&ts=' + (new Date).getTime(),
                         dataType : 'json',
+                        context: this.params.element,
                         beforeSend : function( arr, form, options )
                         {
-                            loader.show( element );
+                            loader.show( this );
                         },
-                        success : function( response )
+                        success : function( response, text_status, xhr )
                         {
-                            var qtime_element = $( '.qtime', element );
+                            $( this )
+                                .removeAttr( 'title' );
+                            
+                            $( this ).parents( 'li' )
+                                .removeClass( 'error' );
+                                
+                            var qtime_element = $( '.qtime', this );
                             
                             if( 0 === qtime_element.size() )
                             {
                                 qtime_element = $( '<small class="qtime"> (<span></span>)</small>' );
                                 
-                                element
+                                $( this )
                                     .append
                                     (
                                         qtime_element
@@ -65,12 +70,17 @@ var sammy = $.sammy
                             $( 'span', qtime_element )
                                 .html( response.responseHeader.QTime + 'ms' );
                         },
-                        error : function()
+                        error : function( xhr, text_status, error_thrown )
                         {
+                            $( this )
+                                .attr( 'title', '/admin/ping is not configured (' + xhr.status + ': ' + error_thrown + ')' );
+                            
+                            $( this ).parents( 'li' )
+                                .addClass( 'error' );
                         },
-                        complete : function()
+                        complete : function( xhr, text_status )
                         {
-                            loader.hide( element );
+                            loader.hide( this );
                         }
                     }
                 );
@@ -258,9 +268,11 @@ var sammy = $.sammy
         // #/cores
         this.get
         (
-            /^#\/cores$/,
+            /^#\/(cores)$/,
             function( context )
             {
+                delete app.cores_template;
+
                 sammy.trigger
                 (
                     'cores_load_data',
@@ -286,7 +298,7 @@ var sammy = $.sammy
         // #/cores
         this.get
         (
-            /^#\/cores\//,
+            /^#\/(cores)\//,
             function( context )
             {
                 var content_element = $( '#content' );
@@ -386,25 +398,24 @@ var sammy = $.sammy
                                             );
 
                                         var core_names = [];
-                                        var core_selects = $( '.swap select', cores_element );
+                                        var core_selects = $( '#actions select', cores_element );
 
                                         for( var key in cores )
                                         {
-                                            core_names.push( '<option>' + key + '</option>' )
+                                            core_names.push( '<option value="' + key + '">' + key + '</option>' )
                                         }
 
-                                        
                                         core_selects
                                             .html( core_names.join( "\n") );
                                         
-                                        $( 'option[value=' + current_core + ']', core_selects.filter( '.core' ) )
+                                        $( 'option[value="' + current_core + '"]', core_selects.filter( '#swap_core' ) )
                                             .attr( 'selected', 'selected' );
 
-                                        $( 'option[value=' + current_core + ']', core_selects.filter( '.other' ) )
+                                        $( 'option[value="' + current_core + '"]', core_selects.filter( '.other' ) )
                                             .attr( 'disabled', 'disabled' )
                                             .addClass( 'disabled' );
                                         
-                                        $( '.rename input[name=core]', cores_element )
+                                        $( 'input[name="core"]', cores_element )
                                             .val( current_core );
 
                                         // layout
@@ -445,6 +456,57 @@ var sammy = $.sammy
                                                 }
                                             );
 
+                                        $( 'form a.submit', button_holder_element )
+                                            .die( 'click' )
+                                            .live
+                                            (
+                                                'click',
+                                                function( event )
+                                                {
+                                                    var element = $( this );
+                                                    var form_element = element.parents( 'form' );
+                                                    var action = $( 'input[name="action"]', form_element ).val().toLowerCase();
+
+                                                    form_element
+                                                        .ajaxSubmit
+                                                        (
+                                                            {
+                                                                url : app.config.solr_path + app.config.core_admin_path + '?wt=json',
+                                                                dataType : 'json',
+                                                                beforeSubmit : function( array, form, options )
+                                                                {
+                                                                    //loader
+                                                                },
+                                                                success : function( response, status_text, xhr, form )
+                                                                {
+                                                                    delete app.cores_data;
+
+                                                                    if( 'rename' === action )
+                                                                    {
+                                                                        context.redirect( path_parts[1] + $( 'input[name="other"]', form_element ).val() );
+                                                                    }
+                                                                    else if( 'swap' === action )
+                                                                    {
+                                                                        window.location.reload();
+                                                                    }
+                                                                    
+                                                                    $( 'a.reset', form )
+                                                                        .trigger( 'click' );
+                                                                },
+                                                                error : function( xhr, text_status, error_thrown )
+                                                                {
+                                                                },
+                                                                complete : function()
+                                                                {
+                                                                    //loader
+                                                                }
+                                                            }
+                                                        );
+
+                                                    return false;
+                                                }
+                                            );
+
                                         $( 'form a.reset', button_holder_element )
                                             .die( 'click' )
                                             .live
@@ -452,12 +514,101 @@ var sammy = $.sammy
                                                 'click',
                                                 function( event )
                                                 {
+                                                    $( this ).parents( 'form' )
+                                                        .resetForm();
+
                                                     $( this ).parents( '.button-holder' )
                                                         .trigger( 'toggle' );
+                                                    
+                                                    return false;
                                                 }
                                             );
 
-                                        $( '#actions .optimize', cores_element )
+                                        var reload_button = $( '#actions .reload', cores_element );
+                                        reload_button
+                                            .die( 'click' )
+                                            .live
+                                            (
+                                                'click',
+                                                function( event )
+                                                {
+                                                    $.ajax
+                                                    (
+                                                        {
+                                                            url : app.config.solr_path + app.config.core_admin_path + '?wt=json&action=RELOAD&core=' + current_core,
+                                                            dataType : 'json',
+                                                            context : $( this ),
+                                                            beforeSend : function( xhr, settings )
+                                                            {
+                                                                this
+                                                                    .addClass( 'loader' );
+                                                            },
+                                                            success : function( response, text_status, xhr )
+                                                            {
+                                                                this
+                                                                    .addClass( 'success' );
+
+                                                                window.setTimeout
+                                                                (
+                                                                    function()
+                                                                    {
+                                                                        reload_button
+                                                                            .removeClass( 'success' );
+                                                                    },
+                                                                    5000
+                                                                );
+                                                            },
+                                                            error : function( xhr, text_status, error_thrown )
+                                                            {
+                                                            },
+                                                            complete : function( xhr, text_status )
+                                                            {
+                                                                this
+                                                                    .removeClass( 'loader' );
+                                                            }
+                                                        }
+                                                    );
+                                                }
+                                            );
+                                        
+                                        $( '#actions .unload', cores_element )
+                                            .die( 'click' )
+                                            .live
+                                            (
+                                                'click',
+                                                function( event )
+                                                {
+                                                    $.ajax
+                                                    (
+                                                        {
+                                                            url : app.config.solr_path + app.config.core_admin_path + '?wt=json&action=UNLOAD&core=' + current_core,
+                                                            dataType : 'json',
+                                                            context : $( this ),
+                                                            beforeSend : function( xhr, settings )
+                                                            {
+                                                                this
+                                                                    .addClass( 'loader' );
+                                                            },
+                                                            success : function( response, text_status, xhr )
+                                                            {
+                                                                delete app.cores_data;
+                                                                context.redirect( path_parts[1].substr( 0, path_parts[1].length - 1 ) );
+                                                            },
+                                                            error : function( xhr, text_status, error_thrown )
+                                                            {
+                                                            },
+                                                            complete : function( xhr, text_status )
+                                                            {
+                                                                this
+                                                                    .removeClass( 'loader' );
+                                                            }
+                                                        }
+                                                    );
+                                                }
+                                            );
+
+                                        var optimize_button = $( '#actions .optimize', cores_element );
+                                        optimize_button
                                             .die( 'click' )
                                             .live
                                             (
@@ -477,6 +628,19 @@ var sammy = $.sammy
                                                             },
                                                             success : function( response, text_status, xhr )
                                                             {
+                                                                this
+                                                                    .addClass( 'success' );
+
+                                                                window.setTimeout
+                                                                (
+                                                                    function()
+                                                                    {
+                                                                        optimize_button
+                                                                            .removeClass( 'success' );
+                                                                    },
+                                                                    5000
+                                                                );
+                                                                
                                                                 $( '.optimized dd.ico-0', index_data_element )
                                                                     .removeClass( 'ico-0' )
                                                                     .addClass( 'ico-1' );
@@ -719,7 +883,7 @@ var sammy = $.sammy
 
                                 if( -1 !== key.indexOf( '.path' ) )
                                 {
-                                    displayed_value = system_properties[key].split( ':' );
+                                    displayed_value = system_properties[key].split( system_properties['path.separator'] );
                                     if( 1 < displayed_value.length )
                                     {
                                         item_class += ' multi';
@@ -794,6 +958,8 @@ var sammy = $.sammy
                                 },
                                 success : function( response, text_status, xhr )
                                 {
+                                    var self = this;
+
                                     var threadDumpData = response.system.threadDump;
                                     var threadDumpContent = [];
                                     var c = 0;
@@ -802,23 +968,23 @@ var sammy = $.sammy
                                         var state = threadDumpData[i].state;
                                         var name = '<a><span>' + threadDumpData[i].name + '</span></a>';
 
-                                        var class = [state];
+                                        var classes = [state];
                                         var details = '';
 
                                         if( 0 !== c % 2 )
                                         {
-                                            class.push( 'odd' );
+                                            classes.push( 'odd' );
                                         }
 
                                         if( threadDumpData[i].lock )
                                         {
-                                            class.push( 'lock' );
+                                            classes.push( 'lock' );
                                             name += "\n" + '<p title="Waiting on">' + threadDumpData[i].lock + '</p>';
                                         }
 
                                         if( threadDumpData[i].stackTrace && 0 !== threadDumpData[i].stackTrace.length )
                                         {
-                                            class.push( 'stacktrace' );
+                                            classes.push( 'stacktrace' );
 
                                             var stack_trace = threadDumpData[i].stackTrace
                                                                 .join( '</li><li>' )
@@ -831,7 +997,7 @@ var sammy = $.sammy
                                                     + '</div>';
                                         }
 
-                                        var item = '<tr class="' + class.join( ' ' ) +'">' + "\n"
+                                        var item = '<tr class="' + classes.join( ' ' ) +'">' + "\n"
 
                                                  + '<td class="ico" title="' + state +'"><span>' + state +'</span></td>' + "\n"
                                                  + '<td class="id">' + threadDumpData[i].id + '</td>' + "\n"
@@ -860,7 +1026,42 @@ var sammy = $.sammy
                                                 $( this ).closest( 'tr' )
                                                     .toggleClass( 'open' );
                                             }
-                                        )
+                                        );
+                                    
+                                    $( '.controls a', this )
+                                        .die( 'click' )
+                                        .live
+                                        (
+                                            'click',
+                                            function( event )
+                                            {
+                                                var threads_element = $( self );
+                                                var is_collapsed = threads_element.hasClass( 'collapsed' );
+                                                var thread_rows = $( 'tr', threads_element );
+
+                                                thread_rows
+                                                    .each
+                                                    (
+                                                        function( index, element )
+                                                        {
+                                                            if( is_collapsed )
+                                                            {
+                                                                $( element )
+                                                                    .addClass( 'open' );
+                                                            }
+                                                            else
+                                                            {
+                                                                $( element )
+                                                                    .removeClass( 'open' );
+                                                            }
+                                                        }
+                                                    );
+
+                                                threads_element
+                                                    .toggleClass( 'collapsed' )
+                                                    .toggleClass( 'expanded' );
+                                            }
+                                        );
                                 },
                                 error : function( xhr, text_status, error_thrown)
                                 {
@@ -1261,7 +1462,8 @@ var sammy = $.sammy
                                     },
                                     error : function( xhr, text_status, error_thrown )
                                     {
-                                        console.debug( arguments );
+                                        $( '#content' )
+                                            .html( 'sorry, no replication-handler defined!' );
                                     },
                                     complete : function( xhr, text_status )
                                     {
@@ -1323,19 +1525,44 @@ var sammy = $.sammy
             'schema_browser_navi',
             function( event, params )
             {
-                var related_navigation_element = $( '#related dl', params.schema_browser_element );
+                var related_navigation_element = $( '#related dl#f-df-t', params.schema_browser_element );
+                var related_navigation_meta = $( '#related dl.ukf-dsf', params.schema_browser_element );
                 var related_select_element = $( '#related select', params.schema_browser_element )
                 var type = 'index';
 
-                if( !params.route_params )
+                var sammy_basepath = '#/' + $( 'p a', params.active_core ).html() + '/schema-browser';
+                
+                if( !related_navigation_meta.hasClass( 'done' ) )
                 {
-                    related_navigation_element
-                        .hide();
-                    
-                    $( 'option:selected', related_select_element )
-                        .removeAttr( 'selected' );
+                    if( app.schema_browser_data.unique_key_field )
+                    {
+                        $( '.unique-key-field', related_navigation_meta )
+                            .show()
+                            .after
+                            (
+                                '<dd class="unique-key-field"><a href="' + sammy_basepath + '/field/' +
+                                app.schema_browser_data.unique_key_field + '">' +
+                                app.schema_browser_data.unique_key_field + '</a></dd>'
+                            );
+                    }
+
+                    if( app.schema_browser_data.default_search_field )
+                    {
+                        $( '.default-search-field', related_navigation_meta )
+                            .show()
+                            .after
+                            (
+                                '<dd class="default-search-field"><a href="' + sammy_basepath + '/field/' +
+                                app.schema_browser_data.default_search_field + '">' +
+                                app.schema_browser_data.default_search_field + '</a></dd>'
+                            );
+                    }
+
+                    related_navigation_meta
+                        .addClass( 'done' );
                 }
-                else
+
+                if( params.route_params )
                 {
                     var type = params.route_params.splat[3];
                     var value = params.route_params.splat[4];
@@ -1348,7 +1575,7 @@ var sammy = $.sammy
                         'types' : []
                     }
 
-                    $( 'option[value=' + params.route_params.splat[2] + ']', related_select_element )
+                    $( 'option[value="' + params.route_params.splat[2] + '"]', related_select_element )
                         .attr( 'selected', 'selected' );
 
                     if( 'field' === type )
@@ -1396,7 +1623,6 @@ var sammy = $.sammy
                         }
                     }
 
-                    var sammy_basepath = '#/' + $( 'p a', params.active_core ).html() + '/schema-browser';
                     var navigation_content = '';
 
                     if( 0 !== navigation_data.fields.length )
@@ -1464,20 +1690,41 @@ var sammy = $.sammy
                         .attr( 'class', type )
                         .html( navigation_content );
                 }
-
-                $.get
-                (
-                        'tpl/schema-browser_'+ type + '.html',
-                    function( template )
-                    {
-                        var data_element = $( '#data', params.schema_browser_element );
+                else
+                {
+                    related_navigation_element
+                        .hide();
                     
-                        data_element
-                            .html( template );
+                    $( 'option:selected', related_select_element )
+                        .removeAttr( 'selected' );
+                }
 
-                        params.callback( app.schema_browser_data, data_element );
-                    }
-                );
+                if( 'field' === type && value === app.schema_browser_data.unique_key_field )
+                {
+                    $( '.unique-key-field', related_navigation_meta )
+                        .addClass( 'active' );
+                }
+                else
+                {
+                    $( '.unique-key-field', related_navigation_meta )
+                        .removeClass( 'active' );
+                }
+
+                if( 'field' === type && value === app.schema_browser_data.default_search_field )
+                {
+                    $( '.default-search-field', related_navigation_meta )
+                        .addClass( 'active' );
+                }
+                else
+                {
+                    $( '.default-search-field', related_navigation_meta )
+                        .removeClass( 'active' );
+                }
+
+                if( params.callback )
+                {
+                    params.callback( app.schema_browser_data, $( '#data', params.schema_browser_element ) );
+                }
             }
         );
 
@@ -1693,7 +1940,7 @@ var sammy = $.sammy
                                                     {
                                                         fields.sort();
                                                         related_options += '<optgroup label="Fields">' + "\n";
-                                                        related_options += fields.join( "\n" ) + "\n";
+                                                        related_options += fields.sort().join( "\n" ) + "\n";
                                                         related_options += '</optgroup>' + "\n";
                                                     }
                                                     
@@ -1709,7 +1956,7 @@ var sammy = $.sammy
                                                     {
                                                         dynamic_fields.sort();
                                                         related_options += '<optgroup label="DynamicFields">' + "\n";
-                                                        related_options += dynamic_fields.join( "\n" ) + "\n";
+                                                        related_options += dynamic_fields.sort().join( "\n" ) + "\n";
                                                         related_options += '</optgroup>' + "\n";
                                                     }
                                                     
@@ -1725,7 +1972,7 @@ var sammy = $.sammy
                                                     {
                                                         types.sort();
                                                         related_options += '<optgroup label="Types">' + "\n";
-                                                        related_options += types.join( "\n" ) + "\n";
+                                                        related_options += types.sort().join( "\n" ) + "\n";
                                                         related_options += '</optgroup>' + "\n";
                                                     }
 
@@ -1787,22 +2034,11 @@ var sammy = $.sammy
             {
                 var callback = function( schema_browser_data, data_element )
                 {
-                    var sammy_basepath = '#/' + $( 'p a', context.active_core ).html() + '/schema-browser'
-
-                    if( schema_browser_data.unique_key_field )
-                    {
-                        $( '.unique-key-field', data_element )
-                            .show()
-                            .after( '<dd><a href="' + sammy_basepath + '/field/' + schema_browser_data.unique_key_field + '">' + schema_browser_data.unique_key_field + '</a></dd>' );
-                    }
+                    data_element
+                        .hide();
+                };
 
-                    if( schema_browser_data.default_search_field )
-                    {
-                        $( '.default-search-field', data_element )
-                            .show()
-                            .after( '<dd><a href="' + sammy_basepath + '/field/' + schema_browser_data.default_search_field + '">' + schema_browser_data.default_search_field + '</a></dd>' );
-                    }
-                }
+                delete app.schema_browser_data;
 
                 sammy.trigger
                 (
@@ -1815,20 +2051,28 @@ var sammy = $.sammy
             }
         );
 
-        // #/:core/schema-browser/field/$field
+        // #/:core/schema-browser/field|dynamic-field|type/$field
         this.get
         (
-            /^#\/([\w\d]+)\/(schema-browser)(\/(field)\/(.+))$/,
+            /^#\/([\w\d]+)\/(schema-browser)(\/(field|dynamic-field|type)\/(.+))$/,
             function( context )
             {
                 var callback = function( schema_browser_data, data_element )
                 {
                     var field = context.params.splat[4];
+
+                    var type = context.params.splat[3];
+                    var is_f = 'field' === type;
+                    var is_df = 'dynamic-field' === type;
+                    var is_t = 'type' === type;
                     
                     var options_element = $( '.options', data_element );
-                    var sammy_basepath = '#/' + $( 'p a', context.active_core ).html() + '/schema-browser'
+                    var sammy_basepath = context.path.indexOf( '/', context.path.indexOf( '/', 2 ) + 1 );
 
-                    var keystring_to_list = function( keystring )
+                    data_element
+                        .show();
+
+                    var keystring_to_list = function( keystring, element_class )
                     {
                         var key_list = keystring.replace( /-/g, '' ).split( '' );
                         var list = [];
@@ -1849,7 +2093,12 @@ var sammy = $.sammy
 
                             if( option_key )
                             {
-                                list.push( '<dd>' + option_key + ',</dd>' );
+                                list.push
+                                (
+                                    '<dd ' + ( element_class ? ' class="' + element_class + '"' : '' ) + '>' +
+                                    option_key +
+                                    ',</dd>'
+                                );
                             }
                         }
 
@@ -1858,192 +2107,265 @@ var sammy = $.sammy
                         return list;
                     }
 
+                    var flags = null;
+
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].flags )
+                    {
+                        flags = schema_browser_data.fields[field].flags;
+                    }
+                    else if( is_df && schema_browser_data.dynamic_fields[field] && schema_browser_data.dynamic_fields[field].flags )
+                    {
+                        flags = schema_browser_data.dynamic_fields[field].flags;
+                    }
+
                     // -- properties
-                    if( schema_browser_data.fields[field].flags )
+                    var properties_element = $( 'dt.properties', options_element );
+                    if( flags )
                     {
-                        var properties_element = $( '.properties', options_element );
-                        var properties_keys = keystring_to_list( schema_browser_data.fields[field].flags );
+                        var properties_keys = keystring_to_list( flags, 'properties' );
+
+                        $( 'dd.properties', options_element )
+                            .remove();
 
                         properties_element
                             .show()
                             .after( properties_keys.join( "\n" ) );
                     }
+                    else
+                    {
+                        $( '.properties', options_element )
+                            .hide();
+                    }
 
                     // -- schema
-                    if( schema_browser_data.fields[field].schema )
+                    var schema_element = $( 'dt.schema', options_element );
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].schema )
                     {
-                        var schema_element = $( '.schema', options_element );
-                        var schema_keys = keystring_to_list( schema_browser_data.fields[field].schema );
+                        var schema_keys = keystring_to_list( schema_browser_data.fields[field].schema, 'schema' );
+
+                        $( 'dd.schema', options_element )
+                            .remove();
 
                         schema_element
                             .show()
                             .after( schema_keys.join( "\n" ) );
                     }
+                    else
+                    {
+                        $( '.schema', options_element )
+                            .hide();
+                    }
 
                     // -- index
-                    if( schema_browser_data.fields[field].index )
+                    var index_element = $( 'dt.index', options_element );
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].index )
                     {
-                        var index_element = $( '.index', options_element );
                         var index_keys = [];
 
                         if( 0 === schema_browser_data.fields[field].index.indexOf( '(' ) )
                         {
-                            index_keys.push( '<dd>' + schema_browser_data.fields[field].index + '</dd>' );
+                            index_keys.push( '<dd class="index">' + schema_browser_data.fields[field].index + '</dd>' );
                         }
                         else
                         {
-                            index_keys = keystring_to_list( schema_browser_data.fields[field].index );
+                            index_keys = keystring_to_list( schema_browser_data.fields[field].index, 'index' );
                         }
 
+                        $( 'dd.index', options_element )
+                            .remove();
+
                         index_element
                             .show()
                             .after( index_keys.join( "\n" ) );
                     }
+                    else
+                    {
+                        $( '.index', options_element )
+                            .hide();
+                    }
 
                     // -- docs
-                    if( schema_browser_data.fields[field].docs )
-                    { 
-                        var docs_element = $( '.docs', options_element );
+                    var docs_element = $( 'dt.docs', options_element );
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].docs )
+                    {
+                        $( 'dd.docs', options_element )
+                            .remove();
 
                         docs_element
                             .show()
-                            .after( '<dd>' + schema_browser_data.fields[field].docs + '</dd>' );
+                            .after( '<dd class="docs">' + schema_browser_data.fields[field].docs + '</dd>' );
+                    }
+                    else
+                    {
+                        $( '.docs', options_element )
+                            .hide();
                     }
 
                     // -- distinct 
-                    if( schema_browser_data.fields[field].distinct )
+                    var distinct_element = $( 'dt.distinct', options_element );
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].distinct )
                     {
-                        var distinct_element = $( '.distinct', options_element );
+                        $( 'dd.distinct', options_element )
+                            .remove();
 
                         distinct_element
                             .show()
-                            .after( '<dd>' + schema_browser_data.fields[field].distinct + '</dd>' );
+                            .after( '<dd class="distinct">' + schema_browser_data.fields[field].distinct + '</dd>' );
+                    }
+                    else
+                    {
+                        $( '.distinct', options_element )
+                            .hide();
                     }
 
                     // -- position-increment-gap 
-                    if( schema_browser_data.fields[field].positionIncrementGap )
+                    var pig_element = $( 'dt.position-increment-gap', options_element );
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].positionIncrementGap )
                     {
-                        var pig_element = $( '.position-increment-gap', options_element );
+                        $( 'dt.position-increment-gap', options_element )
+                            .remove();
 
                         pig_element
                             .show()
-                            .after( '<dd>' + schema_browser_data.fields[field].positionIncrementGap + '</dd>' );
+                            .after( '<dd class="position-increment-gap">' + schema_browser_data.fields[field].positionIncrementGap + '</dd>' );
                     }
-
-                    var analyzer_data = schema_browser_data.types[schema_browser_data.relations.f_t[field]];
+                    else
+                    {
+                        $( '.position-increment-gap', options_element )
+                            .hide();
+                    }
+                    
                     var analyzer_element = $( '.analyzer', data_element );
+                    var analyzer_data = null;
 
-                    var transform_analyzer_data_into_list = function( analyzer_data )
+                    if( is_f )
                     {
-                        var args = [];
-                        for( var key in analyzer_data.args )
-                        {
-                            var arg_class = '';
-                            var arg_content = '';
+                        analyzer_data = schema_browser_data.types[schema_browser_data.relations.f_t[field]];
+                    }
+                    else if( is_df )
+                    {
+                        analyzer_data = schema_browser_data.types[schema_browser_data.relations.df_t[field]];
+                    }
+                    else if( is_t )
+                    {
+                        analyzer_data = schema_browser_data.types[field];
+                    }
 
-                            if( 'true' === analyzer_data.args[key] || '1' === analyzer_data.args[key] )
-                            {
-                                arg_class = 'ico-1';
-                                arg_content = key;
-                            }
-                            else if( 'false' === analyzer_data.args[key] || '0' === analyzer_data.args[key] )
-                            {
-                                arg_class = 'ico-0';
-                                arg_content = key;
-                            }
-                            else
+                    if( analyzer_data )
+                    {
+                        var transform_analyzer_data_into_list = function( analyzer_data )
+                        {
+                            var args = [];
+                            for( var key in analyzer_data.args )
                             {
-                                arg_content = key + ': ';
+                                var arg_class = '';
+                                var arg_content = '';
 
-                                if( 'synonyms' === key || 'words' === key )
+                                if( 'true' === analyzer_data.args[key] || '1' === analyzer_data.args[key] )
+                                {
+                                    arg_class = 'ico-1';
+                                    arg_content = key;
+                                }
+                                else if( 'false' === analyzer_data.args[key] || '0' === analyzer_data.args[key] )
                                 {
-                                    // @TODO: set link target for file
-                                    arg_content += '<a>' + analyzer_data.args[key] + '</a>';
+                                    arg_class = 'ico-0';
+                                    arg_content = key;
                                 }
                                 else
                                 {
-                                    arg_content += analyzer_data.args[key];
+                                    arg_content = key + ': ';
+
+                                    if( 'synonyms' === key || 'words' === key )
+                                    {
+                                        // @TODO: set link target for file
+                                        arg_content += '<a>' + analyzer_data.args[key] + '</a>';
+                                    }
+                                    else
+                                    {
+                                        arg_content += analyzer_data.args[key];
+                                    }
                                 }
+
+                                args.push( '<dd class="' + arg_class + '">' + arg_content + '</dd>' );
                             }
 
-                            args.push( '<dd class="' + arg_class + '">' + arg_content + '</dd>' );
-                        }
+                            var list_content = '<dt>' + analyzer_data.className + '</dt>';
+                            if( 0 !== args.length )
+                            {
+                                args.sort();
+                                list_content += args.join( "\n" );
+                            }
 
-                        var list_content = '<dt>' + analyzer_data.className + '</dt>';
-                        if( 0 !== args.length )
-                        {
-                            args.sort();
-                            list_content += args.join( "\n" );
+                            return list_content;
                         }
 
-                        return list_content;
-                    }
-
-                    // -- field-type
-                    var field_type_element = $( '.field-type', options_element );
-
-                    field_type_element
-                        .show()
-                        .after( '<dd>' + analyzer_data.className + '</dd>' );
-
-
-                    for( var key in analyzer_data )
-                    {
-                        var key_match = key.match( /^(.+)Analyzer$/ );
-                        if( !key_match )
-                        {
-                            continue;
-                        }
+                        // -- field-type
+                        var field_type_element = $( 'dt.field-type', options_element );
 
-                        var analyzer_key_element = $( '.' + key_match[1], analyzer_element );
-                        var analyzer_key_data = analyzer_data[key];
+                        $( 'dd.field-type', options_element )
+                            .remove();
 
-                        analyzer_element.show();
-                        analyzer_key_element.show();
+                        field_type_element
+                            .show()
+                            .after( '<dd class="field-type">' + analyzer_data.className + '</dd>' );
 
-                        if( analyzer_key_data.className )
-                        {
-                            $( 'dl:first dt', analyzer_key_element )
-                                .html( analyzer_key_data.className );
-                        }
 
-                        for( var type in analyzer_key_data )
+                        for( var key in analyzer_data )
                         {
-                            if( 'object' !== typeof analyzer_key_data[type] )
+                            var key_match = key.match( /^(.+)Analyzer$/ );
+                            if( !key_match )
                             {
                                 continue;
                             }
 
-                            var type_element = $( '.' + type, analyzer_key_element );
-                            var type_content = [];
+                            var analyzer_key_element = $( '.' + key_match[1], analyzer_element );
+                            var analyzer_key_data = analyzer_data[key];
 
-                            type_element.show();
+                            analyzer_element.show();
+                            analyzer_key_element.show();
 
-                            if( analyzer_key_data[type].className )
+                            if( analyzer_key_data.className )
                             {
-                                type_content.push( transform_analyzer_data_into_list( analyzer_key_data[type] ) );
+                                $( 'dl:first dt', analyzer_key_element )
+                                    .html( analyzer_key_data.className );
                             }
-                            else
+
+                            $( 'ul li', analyzer_key_element )
+                                .hide();
+
+                            for( var type in analyzer_key_data )
                             {
-                                for( var entry in analyzer_key_data[type] )
+                                if( 'object' !== typeof analyzer_key_data[type] )
                                 {
-                                    type_content.push( transform_analyzer_data_into_list( analyzer_key_data[type][entry] ) );
+                                    continue;
+                                }
+
+                                var type_element = $( '.' + type, analyzer_key_element );
+                                var type_content = [];
+
+                                type_element.show();
+
+                                if( analyzer_key_data[type].className )
+                                {
+                                    type_content.push( transform_analyzer_data_into_list( analyzer_key_data[type] ) );
+                                }
+                                else
+                                {
+                                    for( var entry in analyzer_key_data[type] )
+                                    {
+                                        type_content.push( transform_analyzer_data_into_list( analyzer_key_data[type][entry] ) );
+                                    }
                                 }
-                            }
 
-                            $( 'dl', type_element )
-                                .append( type_content.join( "\n" ) );
+                                $( 'dl', type_element )
+                                    .empty()
+                                    .append( type_content.join( "\n" ) );
+                            }
                         }
                     }
 
-
                     var topterms_holder_element = $( '.topterms-holder', data_element );
-                    if( !schema_browser_data.fields[field].topTerms_hash )
-                    {
-                        topterms_holder_element
-                            .hide();
-                    }
-                    else
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].topTerms_hash )
                     {
                         topterms_holder_element
                             .show();
@@ -2077,6 +2399,7 @@ var sammy = $.sammy
                         topterms_content += '</tbody>';
 
                         topterms_table_element
+                            .empty()
                             .append( topterms_content );
                         
                         $( 'tbody', topterms_table_element )
@@ -2139,14 +2462,14 @@ var sammy = $.sammy
                                 }
                             );
                     }
-
-                    var histogram_holder_element = $( '.histogram-holder', data_element );
-                    if( !schema_browser_data.fields[field].histogram_hash )
+                    else
                     {
-                        histogram_holder_element
+                        topterms_holder_element
                             .hide();
                     }
-                    else
+
+                    var histogram_holder_element = $( '.histogram-holder', data_element );
+                    if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].histogram_hash )
                     {
                         histogram_holder_element
                             .show();
@@ -2184,52 +2507,11 @@ var sammy = $.sammy
                                 }
                             );
                     }
-                }
-
-                sammy.trigger
-                (
-                    'schema_browser_load',
-                    {
-                        callback : callback,
-                        active_core : this.active_core,
-                        route_params : this.params
-                    }
-                );
-            }
-        );
-
-        // #/:core/schema-browser/dynamic-field/$field
-        this.get
-        (
-            /^#\/([\w\d]+)\/(schema-browser)(\/(dynamic-field)\/(.+))$/,
-            function( context )
-            {
-                var callback = function( schema_browser_data, data_element )
-                {
-                    console.debug( data_element );
-                }
-
-                sammy.trigger
-                (
-                    'schema_browser_load',
+                    else
                     {
-                        callback : callback,
-                        active_core : this.active_core,
-                        route_params : this.params
+                        histogram_holder_element
+                            .hide();
                     }
-                );
-            }
-        );
-
-        // #/:core/schema-browser/type/$type
-        this.get
-        (
-            /^#\/([\w\d]+)\/(schema-browser)(\/(type)\/(.+))$/,
-            function( context )
-            {
-                var callback = function( schema_browser_data, data_element )
-                {
-                    console.debug( data_element );
                 }
 
                 sammy.trigger
@@ -2265,8 +2547,8 @@ var sammy = $.sammy
                             var dataimport_handlers = [];
                             for( var key in handlers )
                             {
-                                if( handlers[key].class !== key &&
-                                    handlers[key].class === 'org.apache.solr.handler.dataimport.DataImportHandler' )
+                                if( handlers[key]['class'] !== key &&
+                                    handlers[key]['class'] === 'org.apache.solr.handler.dataimport.DataImportHandler' )
                                 {
                                     dataimport_handlers.push( key );
                                 }
@@ -2287,7 +2569,7 @@ var sammy = $.sammy
         // #/:core/dataimport
         this.get
         (
-            /^#\/([\w\d]+)\/dataimport$/,
+            /^#\/([\w\d]+)\/(dataimport)$/,
             function( context )
             {
                 sammy.trigger
@@ -2297,6 +2579,14 @@ var sammy = $.sammy
                         active_core : this.active_core,
                         callback :  function( dataimport_handlers )
                         {
+                            if( 0 === dataimport_handlers.length )
+                            {
+                                $( '#content' )
+                                    .html( 'sorry, no dataimport-handler defined!' );
+
+                                return false;
+                            }
+
                             context.redirect( context.path + '/' + dataimport_handlers[0] );
                         }
                     }
@@ -2307,7 +2597,7 @@ var sammy = $.sammy
         // #/:core/dataimport
         this.get
         (
-            /^#\/([\w\d]+)\/dataimport\//,
+            /^#\/([\w\d]+)\/(dataimport)\//,
             function( context )
             {
                 var core_basepath = this.active_core.attr( 'data-basepath' );
@@ -2341,6 +2631,7 @@ var sammy = $.sammy
                                 active_core : context.active_core,
                                 callback :  function( dataimport_handlers )
                                 {
+
                                     var handlers_element = $( '.handler', form_element );
                                     var handlers = [];
 
@@ -2357,7 +2648,7 @@ var sammy = $.sammy
                                     $( 'ul', handlers_element )
                                         .html( handlers.join( "\n") ) ;
                                     
-                                    $( 'a[href=' + context.path + ']', handlers_element ).parent()
+                                    $( 'a[href="' + context.path + '"]', handlers_element ).parent()
                                         .addClass( 'active' );
                                     
                                     handlers_element
@@ -2529,20 +2820,11 @@ var sammy = $.sammy
                                         {
                                             started_at = (new Date()).toGMTString();
                                         }
-                                        console.debug( 'started_at @ ', started_at );
 
                                         function dataimport_compute_details( response, details_element )
                                         {
                                             var details = [];
-
                                             
-                                            console.debug( 'elapsed @ ', $( 'str[name="Time Elapsed"]', response ).text() );
-                                            console.debug( 'taken @ ', $( 'str[name="Time taken "]', response ).text() );
-                                            console.debug( 'requests @ ', $( 'str[name="Total Requests made to DataSource"]', response ).text() );
-                                            console.debug( 'fetched @ ', $( 'str[name="Total Rows Fetched"]', response ).text() );
-                                            console.debug( 'skipped @ ', $( 'str[name="Total Documents Skipped"]', response ).text() );
-                                            console.debug( 'processed @ ', $( 'str[name="Total Documents Processed"]', response ).text() );
-
                                             var requests = parseInt( $( 'str[name="Total Requests made to DataSource"]', response ).text() );
                                             if( NaN !== requests )
                                             {
@@ -2604,7 +2886,6 @@ var sammy = $.sammy
                                             $( '.info strong', state_element )
                                                 .text( $( 'str[name=""]', response ).text() );
                                             
-                                            console.debug( 'failure' );
                                             console.debug( 'rollback @ ', rollback_element.text() );
                                         }
                                         else if( 'idle' === status && 0 !== messages_count )
@@ -2620,7 +2901,6 @@ var sammy = $.sammy
                                             $( '.info strong', state_element )
                                                 .text( $( 'str[name=""]', response ).text() );
 
-                                            console.debug( 'success' );
                                             dataimport_compute_details( response, $( '.info .details', state_element ) );
                                         }
                                         else if( 'busy' === status )
@@ -2639,7 +2919,6 @@ var sammy = $.sammy
                                             $( '.info strong', state_element )
                                                 .text( 'Indexing ...' );
                                             
-                                            console.debug( 'indexing' );
                                             dataimport_compute_details( response, $( '.info .details', state_element ) );
 
                                             window.setTimeout( dataimport_fetch_status, 2000 );
@@ -2700,47 +2979,40 @@ var sammy = $.sammy
             }
         );
 
-        // #/:core/info(/stats)
-        this.get
+
+
+        this.bind
         (
-            /^#\/([\w\d]+)\/info/,
-            function( context )
+            'plugins_load',
+            function( event, params )
             {
-                var core_basepath = this.active_core.attr( 'data-basepath' );
-                var content_element = $( '#content' );
-                var show_stats = 0 <= this.path.indexOf( 'stats' );
-                
-                if( show_stats )
+                var callback = function()
                 {
-                    $( 'li.stats', this.active_core )
-                        .addClass( 'active' );
+                    params.callback( app.plugin_data.plugin_data, app.plugin_data.sort_table, app.plugin_data.types );
                 }
-                else
+                
+                if( app.plugin_data )
                 {
-                    $( 'li.plugins', this.active_core )
-                        .addClass( 'active' );
+                    callback( app.plugin_data );
+                    return true;
                 }
-                
-                content_element
-                    .html( '<div id="plugins"></div>' );
-                
+
+                var core_basepath = params.active_core.attr( 'data-basepath' );
                 $.ajax
                 (
                     {
                         url : core_basepath + '/admin/mbeans?stats=true&wt=json',
                         dataType : 'json',
-                        context : $( '#plugins', content_element ),
                         beforeSend : function( xhr, settings )
                         {
-                            this
-                                .html( '<div class="loader">Loading ...</div>' );
                         },
                         success : function( response, text_status, xhr )
                         {
+                            var types = [];
                             var sort_table = {};
-                            var content = '';
-                            
-                            response.plugins = {};
+                            var plugin_data = {};
+
+                            var types_obj = {};
                             var plugin_key = null;
 
                             for( var i = 0; i < response['solr-mbeans'].length; i++ )
@@ -2751,155 +3023,233 @@ var sammy = $.sammy
                                 }
                                 else
                                 {
-                                    response.plugins[plugin_key] = response['solr-mbeans'][i];
+                                    plugin_data[plugin_key] = response['solr-mbeans'][i];
                                 }
                             }
 
-                            for( var key in response.plugins )
+                            for( var key in plugin_data )
                             {
                                 sort_table[key] = {
                                     url : [],
                                     component : [],
                                     handler : []
                                 };
-                                for( var part_key in response.plugins[key] )
+                                for( var part_key in plugin_data[key] )
                                 {
                                     if( 0 < part_key.indexOf( '.' ) )
                                     {
+                                        types_obj[key] = true;
                                         sort_table[key]['handler'].push( part_key );
                                     }
                                     else if( 0 === part_key.indexOf( '/' ) )
                                     {
+                                        types_obj[key] = true;
                                         sort_table[key]['url'].push( part_key );
                                     }
                                     else
                                     {
+                                        types_obj[key] = true;
                                         sort_table[key]['component'].push( part_key );
                                     }
                                 }
-                                
-                                content += '<div class="block" id="' + key.toLowerCase() + '">' + "\n";
-                                content += '<h2><span>' + key + '</span></h2>' + "\n";
-                                content += '<div class="content">' + "\n";
-                                content += '<ul>' + "\n";
-                                
-                                for( var sort_key in sort_table[key] )
+                            }
+
+                            for( var type in types_obj )
+                            {
+                                types.push( type );
+                            }
+                            types.sort();
+                            
+                            app.plugin_data = {
+                                'plugin_data' : plugin_data,
+                                'sort_table' : sort_table,
+                                'types' : types
+                            }
+
+                            $.get
+                            (
+                                'tpl/plugins.html',
+                                function( template )
                                 {
-                                    sort_table[key][sort_key].sort();
-                                    var sort_key_length = sort_table[key][sort_key].length;
+                                    $( '#content' )
+                                        .html( template );
+                                    
+                                    callback( app.plugin_data );
+                                }
+                            );
+                        },
+                        error : function( xhr, text_status, error_thrown)
+                        {
+                        },
+                        complete : function( xhr, text_status )
+                        {
+                        }
+                    }
+                );
+            }
+        );
+
+        // #/:core/plugins/$type
+        this.get
+        (
+            /^#\/([\w\d]+)\/(plugins)\/(\w+)$/,
+            function( context )
+            {
+                var content_element = $( '#content' );
+                var type = context.params.splat[2].toUpperCase();
+                var context_path = context.path.split( '?' ).shift();
+
+                sammy.trigger
+                (
+                    'plugins_load',
+                    {
+                        active_core : this.active_core,
+                        callback : function( plugin_data, plugin_sort, types )
+                        {
+                                    var frame_element = $( '#frame', content_element );
+                                    var navigation_element = $( '#navigation ul', content_element );
+
+                                    var navigation_content = [];
+                                    for( var i = 0; i < types.length; i++ )
+                                    {
+                                        var type_url = context.params.splat[0] + '/' + 
+                                                       context.params.splat[1] + '/' +
+                                                       types[i].toLowerCase();
+
+                                        navigation_content.push
+                                        (
+                                            '<li class="' + types[i].toLowerCase() + '">' +
+                                            '<a href="#/' + type_url + '">' + types[i] + '</a>' +
+                                            '</li>'
+                                        );
+                                    }
+
+                                    navigation_element
+                                        .html( navigation_content.join( "\n" ) );
+                                    
+                                    $( 'a[href="' + context_path + '"]', navigation_element )
+                                        .parent().addClass( 'current' );
                                     
-                                    for( var i = 0; i < sort_key_length; i++ )
+                                    var content = '<ul>';
+                                    for( var sort_key in plugin_sort[type] )
                                     {
-                                        content += '<li class="entry"><a>' + sort_table[key][sort_key][i] + '</a>' + "\n";
-                                        content += '<ul class="detail">' + "\n";
+                                        plugin_sort[type][sort_key].sort();
+                                        var plugin_type_length = plugin_sort[type][sort_key].length;
                                         
-                                        var details = response.plugins[key][ sort_table[key][sort_key][i] ];
-                                        for( var detail_key in details )
+                                        for( var i = 0; i < plugin_type_length; i++ )
                                         {
-                                            if( 'stats' !== detail_key )
-                                            {
-                                                var detail_value = details[detail_key];
-
-                                                if( 'description' === detail_key )
-                                                {
-                                                    detail_value = detail_value.replace( /,/g, ',&#8203;' );
-                                                }
-                                                else if( 'src' === detail_key )
-                                                {
-                                                    detail_value = detail_value.replace( /\//g, '/&#8203;' );
-                                                }
-
-                                                content += '<li><dl class="clearfix">' + "\n";
-                                                content += '<dt>' + detail_key + ':</dt>' + "\n";
-                                                content += '<dd>' + detail_value + '</dd>' + "\n";
-                                                content += '</dl></li>' + "\n";
-                                            }
-                                            else if( 'stats' === detail_key && details[detail_key] && show_stats )
+                                            content += '<li class="entry">' + "\n";
+                                            content += '<a href="' + context_path + '?entry=' + plugin_sort[type][sort_key][i] + '">';
+                                            content += plugin_sort[type][sort_key][i]
+                                            content += '</a>' + "\n";
+                                            content += '<ul class="detail">' + "\n";
+                                            
+                                            var details = plugin_data[type][ plugin_sort[type][sort_key][i] ];
+                                            for( var detail_key in details )
                                             {
-                                                content += '<li class="stats clearfix">' + "\n";
-                                                content += '<span>' + detail_key + ':</span>' + "\n";
-                                                content += '<ul>' + "\n";
-
-                                                for( var stats_key in details[detail_key] )
+                                                if( 'stats' !== detail_key )
                                                 {
-                                                    var stats_value = details[detail_key][stats_key];
+                                                    var detail_value = details[detail_key];
 
-                                                    if( 'readerDir' === stats_key )
+                                                    if( 'description' === detail_key )
                                                     {
-                                                        stats_value = stats_value.replace( /@/g, '@&#8203;' );
+                                                        detail_value = detail_value.replace( /,/g, ',&#8203;' );
+                                                    }
+                                                    else if( 'src' === detail_key )
+                                                    {
+                                                        detail_value = detail_value.replace( /\//g, '/&#8203;' );
                                                     }
 
                                                     content += '<li><dl class="clearfix">' + "\n";
-                                                    content += '<dt>' + stats_key + ':</dt>' + "\n";
-                                                    content += '<dd>' + stats_value + '</dd>' + "\n";
+                                                    content += '<dt>' + detail_key + ':</dt>' + "\n";
+                                                    content += '<dd>' + detail_value + '</dd>' + "\n";
                                                     content += '</dl></li>' + "\n";
                                                 }
+                                                else if( 'stats' === detail_key && details[detail_key] )
+                                                {
+                                                    content += '<li class="stats clearfix">' + "\n";
+                                                    content += '<span>' + detail_key + ':</span>' + "\n";
+                                                    content += '<ul>' + "\n";
+
+                                                    for( var stats_key in details[detail_key] )
+                                                    {
+                                                        var stats_value = details[detail_key][stats_key];
+
+                                                        if( 'readerDir' === stats_key )
+                                                        {
+                                                            stats_value = stats_value.replace( /@/g, '@&#8203;' );
+                                                        }
+
+                                                        content += '<li><dl class="clearfix">' + "\n";
+                                                        content += '<dt>' + stats_key + ':</dt>' + "\n";
+                                                        content += '<dd>' + stats_value + '</dd>' + "\n";
+                                                        content += '</dl></li>' + "\n";
+                                                    }
 
-                                                content += '</ul></li>' + "\n";
+                                                    content += '</ul></li>' + "\n";
+                                                }
                                             }
+                                            
+                                            content += '</ul>' + "\n";
                                         }
-                                        
-                                        content += '</ul>' + "\n";
-                                    }
-                                }
-                                
-                                content += '</ul>' + "\n";
-                                content += '</div>' + "\n";
-                                content += '</div>' + "\n";
-                            }
-                            
-                            this
-                                .html( content );
-                            
-                            $( '.block a', this )
-                                .die( 'click' )
-                                .live
-                                (
-                                    'click',
-                                    function( event )
-                                    {
-                                        $( this ).parent()
-                                            .toggleClass( 'expanded' );
                                     }
-                                );
-                            
-                            $( '.entry', this )
-                                .each
-                                (
-                                    function( i, entry )
-                                    {
-                                        $( '.detail > li', entry ).not( '.stats' ).filter( ':even' )
-                                            .addClass( 'odd' );
+                                    content += '</ul>' + "\n";
 
-                                        $( '.stats li:odd', entry )
-                                            .addClass( 'odd' );
-                                    }
-                                );
-                        },
-                        error : function( xhr, text_status, error_thrown)
-                        {
-                        },
-                        complete : function( xhr, text_status )
+                                    frame_element
+                                        .html( content );
+
+                                    $( 'a[href="' + decodeURIComponent( context.path ) + '"]', frame_element )
+                                        .parent().addClass( 'expanded' );
+                                    
+                                    $( '.entry', frame_element )
+                                        .each
+                                        (
+                                            function( i, entry )
+                                            {
+                                                $( '.detail > li', entry ).not( '.stats' ).filter( ':even' )
+                                                    .addClass( 'odd' );
+
+                                                $( '.stats li:odd', entry )
+                                                    .addClass( 'odd' );
+                                            }
+                                        );
+                        }
+                    }
+                );                
+            }
+        );
+
+        // #/:core/plugins
+        this.get
+        (
+            /^#\/([\w\d]+)\/(plugins)$/,
+            function( context )
+            {
+                delete app.plugin_data;
+
+                sammy.trigger
+                (
+                    'plugins_load',
+                    {
+                        active_core : this.active_core,
+                        callback :  function( plugin_data, plugin_sort, types )
                         {
+                            context.redirect( context.path + '/' + types[0].toLowerCase() );
                         }
                     }
                 );
-                
             }
         );
 
         // #/:core/query
         this.get
         (
-            /^#\/([\w\d]+)\/query$/,
+            /^#\/([\w\d]+)\/(query)$/,
             function( context )
             {
                 var core_basepath = this.active_core.attr( 'data-basepath' );
                 var content_element = $( '#content' );
                 
-                $( 'li.query', this.active_core )
-                    .addClass( 'active' );
-                
                 $.get
                 (
                     'tpl/query.html',
@@ -2974,6 +3324,15 @@ var sammy = $.sammy
                                 }
                             )
 
+                        for( var key in context.params )
+                        {
+                            if( 'string' === typeof context.params[key] )
+                            {
+                                $( '[name="' + key + '"]', query_form )
+                                    .val( context.params[key] );
+                            }
+                        }
+
                         query_form
                             .die( 'submit' )
                             .live
@@ -2981,11 +3340,33 @@ var sammy = $.sammy
                                 'submit',
                                 function( event )
                                 {
+                                    var form_map = {};
+                                    var form_values = [];
+                                    var all_form_values = query_form.formToArray();
+
+                                    for( var i = 0; i < all_form_values.length; i++ )
+                                    {
+                                        if( !all_form_values[i].value || 0 === all_form_values[i].value.length )
+                                        {
+                                            continue;
+                                        }
+
+                                        var name_parts = all_form_values[i].name.split( '.' );
+                                        if( 1 < name_parts.length && !form_map[name_parts[0]] )
+                                        {
+                                            console.debug( 'skip "' + all_form_values[i].name + '", parent missing' );
+                                            continue;
+                                        }
+
+                                        form_map[all_form_values[i].name] = all_form_values[i].value;
+                                        form_values.push( all_form_values[i] );
+                                    }
+
                                     var query_url = window.location.protocol + '//' +
                                                     window.location.host +
                                                     core_basepath +
                                                     '/select?' +
-                                                    query_form.formSerialize();
+                                                    $.param( form_values );
                                     
                                     url_element
                                         .val( query_url )
@@ -3005,15 +3386,12 @@ var sammy = $.sammy
         // #/:core/analysis
         this.get
         (
-            /^#\/([\w\d]+)\/analysis$/,
+            /^#\/([\w\d]+)\/(analysis)$/,
             function( context )
             {
                 var core_basepath = this.active_core.attr( 'data-basepath' );
                 var content_element = $( '#content' );
                 
-                $( 'li.analysis', this.active_core )
-                    .addClass( 'active' );
-                
                 $.get
                 (
                     'tpl/analysis.html',
@@ -3052,7 +3430,7 @@ var sammy = $.sammy
                                     if( 0 !== fields.length )
                                     {
                                         content += '<optgroup label="Fields">' + "\n";
-                                        content += fields.join( "\n" ) + "\n";
+                                        content += fields.sort().join( "\n" ) + "\n";
                                         content += '</optgroup>' + "\n";
                                     }
                                     
@@ -3067,14 +3445,14 @@ var sammy = $.sammy
                                     if( 0 !== types.length )
                                     {
                                         content += '<optgroup label="Types">' + "\n";
-                                        content += types.join( "\n" ) + "\n";
+                                        content += types.sort().join( "\n" ) + "\n";
                                         content += '</optgroup>' + "\n";
                                     }
                                     
                                     this
                                         .html( content );
-                                    
-                                    $( 'option[value=fieldname\=' + response.schema.defaultSearchField + ']', this )
+
+                                    $( 'option[value="fieldname\=' + response.schema.defaultSearchField + '"]', this )
                                         .attr( 'selected', 'selected' );
                                 },
                                 error : function( xhr, text_status, error_thrown)
@@ -3123,6 +3501,11 @@ var sammy = $.sammy
                                             build_analysis_table( 'type', name, response.analysis.field_types[name] );
                                         }
                                     },
+                                    error : function( xhr, text_status, error_thrown )
+                                    {
+                                        $( '#analysis-error', analysis_element )
+                                            .show();
+                                    },
                                     complete : function()
                                     {
                                         //loader
@@ -3191,7 +3574,14 @@ var sammy = $.sammy
                                                 var length = raw_parts[key].length;
                                                 for( var j = 0; j < length; j++ )
                                                 {
-                                                    parts[key].push( '<td>' + raw_parts[key][j].join( "\n" ) + '</td>' );
+                                                    if( raw_parts[key][j] )
+                                                    {
+                                                        parts[key].push( '<td>' + raw_parts[key][j].join( "\n" ) + '</td>' );
+                                                    }
+                                                    else
+                                                    {
+                                                        parts[key].push( '<td><div class="empty">&empty;</div></td>' );
+                                                    }
                                                 }
                                             }
 
@@ -3261,13 +3651,35 @@ var sammy = $.sammy
             /^#\/([\w\d]+)\/(schema|config)$/,
             function( context )
             {
-                var content_element = $( '#content' );
+                var core_basepath = this.active_core.attr( 'data-basepath' );
 
-                content_element
-                    .html( '<iframe src="' + $( '.active a', this.active_core ).attr( 'href' ) + '"></iframe>' );
-                
-                $( 'iframe', content_element )
-                    .css( 'height', $( '#main' ).height() );
+                $.ajax
+                (
+                    {
+                        url : core_basepath + app.config[context.params.splat[1] + '_path'],
+                        dataType : 'xml',
+                        context : $( '#content' ),
+                        beforeSend : function( xhr, settings )
+                        {
+                            this

[... 548 lines stripped ...]