You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2013/03/10 16:05:21 UTC

svn commit: r1454862 [49/49] - in /lucene/dev/branches/lucene4258: ./ dev-tools/ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/.idea/libraries/ dev-tools/idea/lucene/demo/ dev-tools/idea/lucene/facet/ dev-tools/idea/lucene/highlighter/ dev-to...

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/cores.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/cores.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/cores.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/cores.js Sun Mar 10 15:04:57 2013
@@ -20,12 +20,6 @@ sammy.bind
   'cores_load_data',
   function( event, params )
   {
-    if( app.cores_data )
-    {
-      params.callback( app.cores_data );
-      return true;
-    }
-
     $.ajax
     (
       {
@@ -36,7 +30,7 @@ sammy.bind
         },
         success : function( response, text_status, xhr )
         {
-          app.cores_data = response.status;
+          app.set_cores_data( response );
           params.callback( app.cores_data );
         },
         error : function( xhr, text_status, error_thrown)
@@ -189,7 +183,7 @@ sammy.get
                 // index-data
 
                 $( '.lastModified dd', index_data_element )
-                  .html( core_data.index.lastModified );
+                  .html( core_data.index.lastModified || '-' );
 
                 $( '.version dd', index_data_element )
                   .html( core_data.index.version );
@@ -201,7 +195,7 @@ sammy.get
                   .html( core_data.index.maxDoc );
                 
                 $( '.deletedDocs dd', index_data_element )
-                  .html( core_data.index.deletedDocs );
+                  .html( core_data.index.deletedDocs || '-' );
 
                 $( '.optimized dd', index_data_element )
                   .addClass( !core_data.index.hasDeletions ? 'ico-1' : 'ico-0' );
@@ -335,7 +329,7 @@ sammy.get
                   .ajaxForm
                   (
                     {
-                      url : app.config.solr_path + app.config.core_admin_path + '?wt=json',
+                      url : app.config.solr_path + app.config.core_admin_path + '?wt=json&indexInfo=false',
                       dataType : 'json',
                       beforeSubmit : function( array, form, options )
                       {

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dashboard.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dashboard.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dashboard.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dashboard.js Sun Mar 10 15:04:57 2013
@@ -39,7 +39,7 @@ var set_healthcheck_status = function( s
 // #/:core
 sammy.get
 (
-  /^#\/([\w\d-]+)$/,
+  new RegExp( app.core_regex_base + '$' ),
   function( context )
   {
     var core_basepath = this.active_core.attr( 'data-basepath' );

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dataimport.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dataimport.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dataimport.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/dataimport.js Sun Mar 10 15:04:57 2013
@@ -15,48 +15,8 @@
  limitations under the License.
 */
 
-var convert_duration_to_seconds = function( str )
-{
-  var ret = 0;
-  var parts = new String( str ).split( '.' ).shift().split( ':' ).reverse();
-  var parts_count = parts.length;
-    
-  for( var i = 0; i < parts_count; i++ )
-  {
-    ret += parseInt( parts[i], 10 ) * Math.pow( 60, i );
-  }
-
-  return ret;
-}
-
-var convert_seconds_to_readable_time = function( value )
-{
-  var text = [];
-  value = parseInt( value );
-
-  var minutes = Math.floor( value / 60 );
-  var hours = Math.floor( minutes / 60 );
-
-  if( 0 !== hours )
-  {
-    text.push( hours + 'h' );
-    value -= hours * 60 * 60;
-    minutes -= hours * 60;
-  }
-
-  if( 0 !== minutes )
-  {
-    text.push( minutes + 'm' );
-    value -= minutes * 60;
-  }
-
-  if( 0 !== value )
-  {
-    text.push( value + 's' );
-  }
-
-  return text.join( ' ' );
-}
+var dataimport_timeout = 2000;
+var cookie_dataimport_autorefresh = 'dataimport_autorefresh';
 
 sammy.bind
 (
@@ -101,7 +61,7 @@ sammy.bind
 // #/:core/dataimport
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(dataimport)$/,
+  new RegExp( app.core_regex_base + '\\/(dataimport)$' ),
   function( context )
   {
     sammy.trigger
@@ -129,7 +89,7 @@ sammy.get
 // #/:core/dataimport
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(dataimport)\//,
+  new RegExp( app.core_regex_base + '\\/(dataimport)\\/' ),
   function( context )
   {
     var core_basepath = this.active_core.attr( 'data-basepath' );
@@ -152,7 +112,11 @@ sammy.get
         var dataimport_element = $( '#dataimport', content_element );
         var form_element = $( '#form', dataimport_element );
         var config_element = $( '#config', dataimport_element );
-        var config_error_element = $( '#config-error', dataimport_element );
+        var error_element = $( '#error', dataimport_element );
+        var debug_response_element = $( '#debug_response', dataimport_element );
+
+        var autorefresh_status = false;
+        var debug_mode = false;
 
         // handler
 
@@ -195,24 +159,23 @@ sammy.get
           $.ajax
           (
             {
-              url : handler_url + '?command=show-config',
+              url : handler_url + '?command=show-config&indent=true',
               dataType : 'xml',
               context : $( '#dataimport_config', config_element ),
               beforeSend : function( xhr, settings )
               {
+                error_element
+                  .empty()
+                  .hide();
               },
               success : function( config, text_status, xhr )
               {
                 dataimport_element
                   .removeClass( 'error' );
-                                    
-                config_error_element
-                  .hide();
 
                 config_element
                   .addClass( 'hidden' );
 
-
                 var entities = [ '<option value=""></option>' ];
 
                 $( 'document > entity', config )
@@ -226,6 +189,9 @@ sammy.get
                                 
                 $( '#entity', form_element )
                   .html( entities.join( "\n" ) );
+
+                $( '.editable textarea', this )
+                  .val( xhr.responseText.replace( /\n+$/, '' ) );
               },
               error : function( xhr, text_status, error_thrown )
               {
@@ -234,7 +200,8 @@ sammy.get
                   dataimport_element
                     .addClass( 'error' );
                                     
-                  config_error_element
+                  error_element
+                    .text( 'Dataimport XML-Configuration is not valid' )
                     .show();
 
                   config_element
@@ -248,7 +215,7 @@ sammy.get
                   xhr.responseText.esc() +
                   '</code></pre>'
                 );
-                this.html( code );
+                $( '.formatted', this ).html( code );
 
                 if( 'success' === text_status )
                 {
@@ -260,7 +227,7 @@ sammy.get
         }
         dataimport_fetch_config();
 
-        $( '.toggle', config_element )
+        $( '.block .toggle', dataimport_element )
           .die( 'click' )
           .live
           (
@@ -325,159 +292,348 @@ sammy.get
               );
               return false;
             }
-          )
+          );
+
+        var debug_mode_element = $( '.debug_mode', config_element );
+        debug_mode_element
+          .die( 'click' )
+          .live
+          (
+            'click',
+            function( event )
+            {
+              var self = $( this );
+              var block = self.closest( '.block' )
+
+              var debug_checkbox = $( 'input[name="debug"]', form_element );
+              var submit_span = $( 'button[type="submit"] span', form_element );
+
+              debug_mode = !debug_mode;
+
+              block.toggleClass( 'debug_mode', debug_mode );
+
+              if( debug_mode )
+              {
+                block.removeClass( 'hidden' );
+
+                debug_checkbox
+                  .attr( 'checked', 'checked' )
+                  .trigger( 'change' );
+                  
+                submit_span
+                  .data( 'original', submit_span.text() )
+                  .text( submit_span.data( 'debugmode' ) );
+
+                $( 'textarea', block )
+                  .autogrow()
+              }
+              else
+              {
+                submit_span
+                  .text( submit_span.data( 'original' ) )
+                  .removeData( 'original' );
+              }
+            }
+          );
+
+        // abort
+
+        var abort_import_element = $( '.abort-import', dataimport_element );
+        abort_import_element
+          .off( 'click' )
+          .on
+          (
+            'click',
+            function( event )
+            {
+              var span_element = $( 'span', this );
+
+              $.ajax
+              (
+                {
+                  url : handler_url + '?command=abort&wt=json',
+                  dataType : 'json',
+                  type: 'POST',
+                  context: $( this ),
+                  beforeSend : function( xhr, settings )
+                  {
+                    span_element
+                      .addClass( 'loader' );
+                  },
+                  success : function( response, text_status, xhr )
+                  {
+                    span_element
+                      .data( 'original', span_element.text() )
+                      .text( span_element.data( 'aborting' ) );
+
+                    this
+                      .removeClass( 'warn' )
+                      .addClass( 'success' );
+
+                    window.setTimeout
+                    (
+                      function()
+                      {
+                        $( 'span', abort_import_element )
+                          .removeClass( 'loader' )
+                          .text( span_element.data( 'original' ) )
+                          .removeData( 'original' );
+
+                        abort_import_element
+                          .removeClass( 'success' )
+                          .addClass( 'warn' );
+                      },
+                      dataimport_timeout * 2
+                    );
+
+                    dataimport_fetch_status();
+                  }
+                }
+              );
+              return false;
+            }
+          );
 
         // state
+
+        var status_button = $( 'form button.refresh-status', form_element );
+
+        status_button
+          .off( 'click' )
+          .on
+          (
+            'click',
+            function( event )
+            {
+              dataimport_fetch_status();
+              return false;
+            }
+          )
+          .trigger( 'click' );
                 
-        function dataimport_fetch_status()
+        function dataimport_fetch_status( clear_timeout )
         {
+          if( clear_timeout )
+          {
+            app.clear_timeout();
+          }
+
           $.ajax
           (
             {
-              url : handler_url + '?command=status',
-              dataType : 'xml',
+              url : handler_url + '?command=status&indent=true&wt=json',
+              dataType : 'json',
               beforeSend : function( xhr, settings )
               {
+                $( 'span', status_button )
+                  .addClass( 'loader' );
               },
               success : function( response, text_status, xhr )
               {
                 var state_element = $( '#current_state', content_element );
 
-                var status = $( 'str[name="status"]', response ).text();
-                var rollback_element = $( 'str[name="Rolledback"]', response );
-                var messages_count = $( 'lst[name="statusMessages"] str', response ).size();
+                var status = response.status;
+                var rollback_time = response.statusMessages.Rolledback || null;
+                var abort_time = response.statusMessages.Aborted || null;
+                
+                var messages = response.statusMessages;
+                var messages_count = 0;
+                for( var key in messages ) { messages_count++; }
 
-                var started_at = $( 'str[name="Full Dump Started"]', response ).text();
-                if( !started_at )
+                function dataimport_compute_details( response, details_element, elapsed_seconds )
                 {
-                  started_at = (new Date()).toGMTString();
-                }
+                  details_element
+                    .show();
 
-                function dataimport_compute_details( response, details_element )
-                {
-                  var details = [];
-                                    
-                  var requests = parseInt( $( 'str[name="Total Requests made to DataSource"]', response ).text(), 10 );
-                  if( requests )
-                  {
-                    details.push
-                    (
-                      '<abbr title="Total Requests made to DataSource">Requests</abbr>: ' +
-                      requests
-                    );
-                  }
+                  // --
+
+                  var document_config = {
+                    'Requests' : 'Total Requests made to DataSource',
+                    'Fetched' : 'Total Rows Fetched',
+                    'Skipped' : 'Total Documents Skipped',
+                    'Processed' : 'Total Documents Processed'
+                  };
 
-                  var fetched = parseInt( $( 'str[name="Total Rows Fetched"]', response ).text(), 10 );
-                  if( fetched )
+                  var document_details = [];
+                  for( var key in document_config )
                   {
-                    details.push
-                    (
-                      '<abbr title="Total Rows Fetched">Fetched</abbr>: ' +
-                      fetched
-                    );
-                  }
+                    var value = parseInt( response.statusMessages[document_config[key]], 10 );
+
+                    var detail = '<abbr title="' + document_config[key].esc() + '">' + key.esc() + '</abbr>: ' +  app.format_number( value ).esc();
+                    if( elapsed_seconds && 'skipped' !== key.toLowerCase() )
+                    {
+                      detail += ' <span>(' + app.format_number( Math.round( value / elapsed_seconds ) ).esc() + '/s)</span>'
+                    }
+
+                    document_details.push( detail );
+                  };
+
+                  $( '.docs', details_element )
+                    .html( document_details.join( ', ' ) );
 
-                  var skipped = parseInt( $( 'str[name="Total Documents Skipped"]', response ).text(), 10 );
-                  if( requests )
+                  // --
+
+                  var dates_config = {
+                      'Started' : 'Full Dump Started',
+                      'Aborted' : 'Aborted',
+                      'Rolledback' : 'Rolledback'
+                  };
+
+                  var dates_details = [];
+                  for( var key in dates_config )
                   {
-                    details.push
-                    (
-                      '<abbr title="Total Documents Skipped">Skipped</abbr>: ' +
-                      skipped
-                    );
-                  }
+                    var value = response.statusMessages[dates_config[key]];
+
+                    if( value )
+                    {
+                      var detail = '<abbr title="' + dates_config[key].esc() + '">' + key.esc() + '</abbr>: '
+                                 + '<abbr class="time">' +  value.esc() + '</abbr>';
+                      dates_details.push( detail );                      
+                    }
+                  };
+
+                  var dates_element = $( '.dates', details_element );
+
+                  dates_element
+                    .html( dates_details.join( ', ' ) );
+
+                  $( '.time', dates_element )
+                    .removeData( 'timeago' )
+                    .timeago();
+                };
+
+                var get_time_taken = function get_default_time_taken()
+                {
+                  var time_taken_text = response.statusMessages['Time taken'];
+                  return app.convert_duration_to_seconds( time_taken_text );
+                };
+
+                var get_default_info_text = function default_info_text()
+                {
+                  var info_text = response.statusMessages[''] || '';
 
-                  var processed = parseInt( $( 'str[name="Total Documents Processed"]', response ).text(), 10 );
-                  if( processed )
+                  // format numbers included in status nicely
+                  info_text = info_text.replace
+                  (
+                    /\d{4,}/g,
+                    function( match, position, string )
+                    {
+                      return app.format_number( parseInt( match, 10 ) );
+                    }
+                  );
+
+                  var time_taken_text = app.convert_seconds_to_readable_time( get_time_taken() );
+                  if( time_taken_text )
                   {
-                    details.push
-                    (
-                      '<abbr title="Total Documents Processed">Processed</abbr>: ' +
-                      processed
-                    );
+                    info_text += ' (Duration: ' + time_taken_text.esc() + ')';
                   }
 
-                  details_element
-                    .html( details.join( ', ' ) )
-                    .show();
-                }
+                  return info_text;
+                };
+
+                var show_info = function show_info( info_text, elapsed_seconds )
+                {
+                  $( '.info strong', state_element )
+                    .text( info_text || get_default_info_text() );
+
+                  $( '.info .details', state_element )
+                    .hide();
+                };
+
+                var show_full_info = function show_full_info( info_text, elapsed_seconds )
+                {
+                  show_info( info_text, elapsed_seconds );
+
+                  dataimport_compute_details
+                  (
+                    response,
+                    $( '.info .details', state_element ),
+                    elapsed_seconds || get_time_taken()
+                  );
+                };
 
                 state_element
-                  .removeClass( 'indexing' )
-                  .removeClass( 'success' )
-                  .removeClass( 'failure' );
-                                
+                  .removeAttr( 'class' );
+
+                var current_time = new Date();
+                $( '.last_update abbr', state_element )
+                  .text( current_time.toTimeString().split( ' ' ).shift() )
+                  .attr( 'title', current_time.toUTCString() );
+
                 $( '.info', state_element )
                   .removeClass( 'loader' );
 
-                if( 0 !== rollback_element.size() )
+                if( 'busy' === status )
                 {
                   state_element
-                    .addClass( 'failure' )
-                    .show();
+                    .addClass( 'indexing' );
 
-                  $( '.time', state_element )
-                    .text( rollback_element.text() )
-                    .timeago()
-                    .show();
+                  if( autorefresh_status )
+                  {
+                    $( '.info', state_element )
+                      .addClass( 'loader' );
+                  }
 
-                  $( '.info strong', state_element )
-                    .text( $( 'str[name=""]', response ).text() );
+                  var time_elapsed_text = response.statusMessages['Time Elapsed'];
+                  var elapsed_seconds = app.convert_duration_to_seconds( time_elapsed_text );
+                  time_elapsed_text = app.convert_seconds_to_readable_time( elapsed_seconds );
 
-                  $( '.info .details', state_element )
-                    .hide();
-                                    
-                  console.debug( 'rollback @ ', rollback_element.text() );
+                  var info_text = time_elapsed_text
+                                ? 'Indexing since ' + time_elapsed_text
+                                : 'Indexing ...';
+
+                  show_full_info( info_text, elapsed_seconds );
                 }
-                else if( 'idle' === status && 0 !== messages_count )
+                else if( rollback_time )
                 {
                   state_element
-                    .addClass( 'success' )
-                    .show();
+                    .addClass( 'failure' );
 
-                  $( '.time', state_element )
-                    .text( started_at )
-                    .timeago()
-                    .show();
-
-                  $( '.info strong', state_element )
-                    .text( $( 'str[name=""]', response ).text() );
+                  show_full_info();
+                }
+                else if( abort_time )
+                {
+                  state_element
+                    .addClass( 'aborted' );
 
-                  dataimport_compute_details( response, $( '.info .details', state_element ) );
+                  show_full_info( 'Aborting current Import ...' );
                 }
-                else if( 'busy' === status )
+                else if( 'idle' === status && 0 !== messages_count )
                 {
                   state_element
-                    .addClass( 'indexing' )
-                    .show();
+                    .addClass( 'success' );
 
-                  $( '.time', state_element )
-                    .text( started_at )
-                    .timeago()
-                    .show();
+                  show_full_info();
+                }
+                else 
+                {
+                  state_element
+                    .addClass( 'idle' );
 
-                  $( '.info', state_element )
-                    .addClass( 'loader' );
+                  show_info( 'No information available (idle)' );
+                }
 
-                  var indexing_text = 'Indexing ...';
+                // show raw status
 
-                  var time_elapsed_text = $( 'str[name="Time Elapsed"]', response ).text();
-                  time_elapsed_text = convert_seconds_to_readable_time( convert_duration_to_seconds( time_elapsed_text ) );
-                  if( time_elapsed_text.length )
-                  {
-                    indexing_text = 'Indexing since ' + time_elapsed_text
-                  }
+                var code = $(
+                  '<pre class="syntax language-json"><code>' +
+                  app.format_json( xhr.responseText ).esc() +
+                  '</code></pre>'
+                );
 
-                  $( '.info strong', state_element )
-                    .text( indexing_text );
-                                    
-                  dataimport_compute_details( response, $( '.info .details', state_element ) );
+                $( '#raw_output_container', content_element ).html( code );
+                hljs.highlightBlock( code.get(0) );
 
-                  window.setTimeout( dataimport_fetch_status, 2000 );
-                }
-                else
+                if( !app.timeout && autorefresh_status )
                 {
-                  state_element.hide();
+                  app.timeout = window.setTimeout
+                  (
+                    function()
+                    {
+                      dataimport_fetch_status( true )
+                    },
+                    dataimport_timeout
+                  );
                 }
               },
               error : function( xhr, text_status, error_thrown )
@@ -489,24 +645,47 @@ sammy.get
               },
               complete : function( xhr, text_status )
               {
+                $( 'span', status_button )
+                  .removeClass( 'loader' )
+                  .addClass( 'success' );
+
+                window.setTimeout
+                (
+                  function()
+                  {
+                    $( 'span', status_button )
+                      .removeClass( 'success' );
+                  },
+                  dataimport_timeout / 2
+                );
               }
             }
           );
         }
-        dataimport_fetch_status();
 
         // form
 
-        $( 'form', form_element )
+        var form = $( 'form', form_element );
+
+        form
           .ajaxForm
           (
             {
               url : handler_url,
-              dataType : 'xml',
+              data : {
+                wt : 'json',
+                indent : 'true'
+              },
+              dataType : 'json',
+              type: 'POST',
               beforeSend : function( xhr, settings )
               {
-                $( 'form button', form_element )
+                $( 'button[type="submit"] span', form_element )
                   .addClass( 'loader' );
+
+                error_element
+                  .empty()
+                  .hide();
               },
               beforeSubmit : function( array, form, options )
               {
@@ -545,22 +724,91 @@ sammy.get
                     array.push( { name : tmp[0], value: tmp[1] } );
                   }
                 }
+
+                if( debug_mode )
+                {
+                  array.push( { name: 'dataConfig', value: $( '#dataimport_config .editable textarea' ).val() } );
+                }
               },
               success : function( response, text_status, xhr )
               {
-                dataimport_fetch_status();
               },
               error : function( xhr, text_status, error_thrown )
               {
-                console.debug( arguments );
+                var response = null;
+                try
+                {
+                  eval( 'response = ' + xhr.responseText + ';' );
+                }
+                catch( e ){}
+
+                error_element
+                  .text( response.error.msg || 'Unknown Error (Exception w/o Message)' )
+                  .show();
               },
               complete : function( xhr, text_status )
               {
-                $( 'form button', form_element )
+                $( 'button[type="submit"] span', form_element )
                   .removeClass( 'loader' );
+
+                var debug = $( 'input[name="debug"]:checked', form );
+                if( 0 !== debug.size() )
+                {
+                  var code = $(
+                    '<pre class="syntax language-json"><code>' +
+                    app.format_json( xhr.responseText ).esc() +
+                    '</code></pre>'
+                  );
+
+                  $( '.content', debug_response_element ).html( code );
+                  hljs.highlightBlock( code.get(0) );
+                }
+
+                dataimport_fetch_status();
               }
             }
           );
+
+        $( 'input[name="debug"]', form )
+          .off( 'change' )
+          .on
+          (
+            'change',
+            function( event )
+            {
+              debug_response_element.toggle( this.checked );
+            }
+          );
+
+        $( '#auto-refresh-status a', form_element )
+          .off( 'click' )
+          .on
+          (
+            'click',
+            function( event )
+            {
+              $.cookie( cookie_dataimport_autorefresh, $.cookie( cookie_dataimport_autorefresh ) ? null : true );
+              $( this ).trigger( 'state' );
+
+              dataimport_fetch_status();
+
+              return false;
+            }
+          )
+          .off( 'state' )
+          .on
+          (
+            'state',
+            function( event )
+            {
+              autorefresh_status = !!$.cookie( cookie_dataimport_autorefresh );
+
+              $.cookie( cookie_dataimport_autorefresh )
+                ? $( this ).addClass( 'on' )
+                : $( this ).removeClass( 'on' );
+            }
+          )
+          .trigger( 'state' );
       }
     );
   }

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/file.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/file.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/file.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/file.js Sun Mar 10 15:04:57 2013
@@ -18,7 +18,7 @@
 // #/:core/schema, #/:core/config
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(schema|config)$/,
+  new RegExp( app.core_regex_base + '\\/(schema|config)$' ),
   function( context )
   {
     var core_basepath = this.active_core.attr( 'data-basepath' );

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/index.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/index.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/index.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/index.js Sun Mar 10 15:04:57 2013
@@ -36,15 +36,13 @@ var generate_bar = function( bar_contain
   $( '.bar-max.val', bar_holder ).text( bar_data['max'] );
     
   bar_level++;
-  var total_width = Math.round( ( bar_data['total'] * max_width ) / bar_data['max'] );
-  $( '.bar-total.bar', bar_holder ).width( Math.max( total_width, 1 ) );
+  $( '.bar-total.bar', bar_holder ).width( new String( (bar_data['total']/bar_data['max'])*100 ) + '%' );
   $( '.bar-total.val', bar_holder ).text( bar_data['total'] );
 
   if( bar_data['used'] )
   {
     bar_level++;
-    var used_width = Math.round( ( bar_data['used'] * max_width ) / bar_data['max'] );
-    $( '.bar-used.bar', bar_holder ).width( Math.min( used_width, total_width - 1 ) );
+    $( '.bar-used.bar', bar_holder ).width( new String( (bar_data['used']/bar_data['total'])*100 ) + '%' );
     $( '.bar-used.val', bar_holder ).text( bar_data['used'] );
   }
 
@@ -99,8 +97,8 @@ var system_info = function( element, sys
 {
   // -- usage
 
-  var load_average = ( system_data['system']['uptime'] || '' ).match( /load average: (.+)/ );
-  if( load_average && load_average[1] )
+  var load_average = ( system_data['system']['uptime'] || '' ).match( /load averages?: (\d+[.,]\d\d),? (\d+[.,]\d\d),? (\d+[.,]\d\d)/ );
+  if( load_average )
   {
     var hl = $( '#system h2', element );
 
@@ -108,20 +106,20 @@ var system_info = function( element, sys
       .remove();
 
     hl
-      .append( ' <small class="bar-desc">' + load_average[1].split( ', ' ).join( '  ' ).esc() + '</small>' );
+      .append( ' <small class="bar-desc">' + load_average.slice( 1 ).join( '  ' ).replace( /,/g, '.' ).esc() + '</small>' );
   }
 
   // -- physical-memory-bar
     
   var bar_holder = $( '#physical-memory-bar', element );
-  if( !system_data['system']['totalPhysicalMemorySize'] )
+  if( system_data['system']['totalPhysicalMemorySize'] === undefined || system_data['system']['freePhysicalMemorySize'] === undefined )
   {
     bar_holder.hide();
   }
   else
   {
     bar_holder.show();
-    
+
     var bar_data = {
       'max' : parse_memory_value( system_data['system']['totalPhysicalMemorySize'] ),
       'total' : parse_memory_value( system_data['system']['totalPhysicalMemorySize'] - system_data['system']['freePhysicalMemorySize'] )
@@ -133,7 +131,7 @@ var system_info = function( element, sys
   // -- swap-space-bar
     
   var bar_holder = $( '#swap-space-bar', element );
-  if( !system_data['system']['totalSwapSpaceSize'] )
+  if( system_data['system']['totalSwapSpaceSize'] === undefined || system_data['system']['freeSwapSpaceSize'] === undefined )
   {
     bar_holder.hide();
   }
@@ -149,10 +147,10 @@ var system_info = function( element, sys
     generate_bar( bar_holder, bar_data, true );
   }
 
-  // -- swap-space-bar
+  // -- file-descriptor-bar
     
   var bar_holder = $( '#file-descriptor-bar', element );
-  if( !system_data['system']['maxFileDescriptorCount'] )
+  if( system_data['system']['maxFileDescriptorCount'] === undefined || system_data['system']['openFileDescriptorCount'] === undefined )
   {
     bar_holder.hide();
   }
@@ -174,32 +172,42 @@ var system_info = function( element, sys
 
   // -- memory-bar
 
-  var jvm_memory = $.extend
-  (
-    {
-      'free' : null,
-      'total' : null,
-      'max' : null,
-      'used' : null,
-      'raw' : {
+  var bar_holder = $( '#jvm-memory-bar', element );
+  if( system_data['jvm']['memory'] === undefined )
+  {
+    bar_holder.hide();
+  }
+  else
+  {
+    bar_holder.show();
+
+    var jvm_memory = $.extend
+    (
+      {
         'free' : null,
         'total' : null,
         'max' : null,
         'used' : null,
-        'used%' : null
-      }
-    },
-    system_data['jvm']['memory']
-  );
-    
-  var bar_holder = $( '#jvm-memory-bar', element );
-  var bar_data = {
-    'max' : parse_memory_value( jvm_memory['raw']['max'] || jvm_memory['max'] ),
-    'total' : parse_memory_value( jvm_memory['raw']['total'] || jvm_memory['total'] ),
-    'used' : parse_memory_value( jvm_memory['raw']['used'] || jvm_memory['used'] )
-  };
+        'raw' : {
+          'free' : null,
+          'total' : null,
+          'max' : null,
+          'used' : null,
+          'used%' : null
+        }
+      },
+      system_data['jvm']['memory']
+    );
+
+    var bar_data = {
+      'max' : parse_memory_value( jvm_memory['raw']['max'] || jvm_memory['max'] ),
+      'total' : parse_memory_value( jvm_memory['raw']['total'] || jvm_memory['total'] ),
+      'used' : parse_memory_value( jvm_memory['raw']['used'] || jvm_memory['used'] )
+    };
+
+    generate_bar( bar_holder, bar_data, true );
+  }
 
-  generate_bar( bar_holder, bar_data, true );
 }
 
 // #/
@@ -210,9 +218,6 @@ sammy.get
   {
     var content_element = $( '#content' );
 
-    $( '#menu-wrapper #index' )
-      .addClass( 'active' );
-
     content_element
       .html( '<div id="index"></div>' );
 

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/java-properties.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/java-properties.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/java-properties.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/java-properties.js Sun Mar 10 15:04:57 2013
@@ -21,7 +21,7 @@ sammy.get
   /^#\/(~java-properties)$/,
   function( context )
   {
-    var core_basepath = $( 'li[data-basepath]', app.menu_element ).attr( 'data-basepath' );
+    var core_basepath = $( '[data-basepath]', app.menu_element ).attr( 'data-basepath' );
     var content_element = $( '#content' );
 
     content_element

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/logging.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/logging.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/logging.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/logging.js Sun Mar 10 15:04:57 2013
@@ -318,6 +318,14 @@ var load_logging_viewer = function()
         {
           var doc = docs[i];
 
+          if( 1 === doc.time.length )
+          {
+            for( var key in doc )
+            {
+              doc[key] = doc[key][0];
+            }
+          }
+
           if( !doc.trace )
           {
             var lines = doc.message.split( "\n" );
@@ -398,7 +406,7 @@ sammy.get
   /^#\/(~logging)$/,
   function( context )
   {
-    var core_basepath = $( 'li[data-basepath]', app.menu_element ).attr( 'data-basepath' );
+    var core_basepath = $( '[data-basepath]', app.menu_element ).attr( 'data-basepath' );
     loglevel_path = core_basepath + '/admin/logging';
     var content_element = $( '#content' );
 
@@ -484,7 +492,7 @@ sammy.get
   /^#\/(~logging)\/level$/,
   function( context )
   {
-    var core_basepath = $( 'li[data-basepath]', app.menu_element ).attr( 'data-basepath' );
+    var core_basepath = $( '[data-basepath]', app.menu_element ).attr( 'data-basepath' );
     loglevel_path = core_basepath + '/admin/logging';
     var content_element = $( '#content' );
 

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/ping.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/ping.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/ping.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/ping.js Sun Mar 10 15:04:57 2013
@@ -15,7 +15,7 @@
  limitations under the License.
 */
 
-$( '.ping a', app.menu_element )
+$( '.ping a', app.core_menu )
   .live
   (
     'click',

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/plugins.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/plugins.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/plugins.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/plugins.js Sun Mar 10 15:04:57 2013
@@ -206,7 +206,7 @@ var render_plugin_data = function( plugi
       }
 
       content += '<li class="' + classes.join( ' ' ) + '">' + "\n";
-      content += '<a href="' + context_path + '?entry=' + bean.esc() + '">';
+      content += '<a href="' + context_path + '?entry=' + bean.esc() + '" data-bean="' + bean.esc() + '">';
       content += '<span>' + bean.esc() + '</span>';
       content += '</a>' + "\n";
       content += '<ul class="detail">' + "\n";
@@ -254,12 +254,8 @@ var render_plugin_data = function( plugi
 
           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;' );
-            }
+            var stats_value = new String( details[detail_key][stats_key] );
+            stats_value = stats_value.replace( /([\(@])/g, '$1&#8203;' );
 
             content += '<li><dl class="clearfix">' + "\n";
             content += '<dt>' + stats_key + ':</dt>' + "\n";
@@ -279,15 +275,55 @@ var render_plugin_data = function( plugi
   frame_element
     .html( content );
 
-  $( 'a[href="' + decodeURIComponent( active_context.path ) + '"]', frame_element )
-    .parent().addClass( 'expanded' );
+  
+  var path = active_context.path.split( '?entry=' );
+  var entries = ( path[1] || '' ).split( ',' );
+  
+  var entry_count = entries.length;
+  for( var i = 0; i < entry_count; i++ )
+  {
+    $( 'a[data-bean="' + entries[i] + '"]', frame_element )
+      .parent().addClass( 'expanded' );
+  }
+
+  $( 'a', frame_element )
+    .off( 'click' )
+    .on
+    (
+      'click',
+      function( event )
+      { 
+        var self = $( this );
+        var bean = self.data( 'bean' );
+
+        var split = '?entry=';
+        var path = active_context.path.split( split );
+        var entry = ( path[1] || '' );
+
+        var regex = new RegExp( bean.replace( /\//g, '\\/' ) + '(,|$)' );
+        var match = regex.test( entry );
+
+        var url = path[0] + split;
+
+        url += match
+             ? entry.replace( regex, '' )
+             : entry + ',' + bean;
+
+        url = url.replace( /=,/, '=' );
+        url = url.replace( /,$/, '' );
+        url = url.replace( /\?entry=$/, '' );
+
+        active_context.redirect( url );
+        return false;
+      }
+    );
   
   // Try to make links for anything with http (but leave the rest alone)
   $( '.detail dd' ).each(function(index) {
     var txt = $(this).html();
     if(txt.indexOf("http") >= 0) {
       $(this).linker({
-         className : 'linker',
+         className : 'linker'
       });
     }
   });
@@ -382,7 +418,7 @@ sammy.bind
 // #/:core/plugins/$type
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(plugins)\/(\w+)$/,
+  new RegExp( app.core_regex_base + '\\/(plugins)\\/(\\w+)$' ),
   function( context )
   {
     core_basepath = this.active_core.attr( 'data-basepath' );
@@ -405,7 +441,7 @@ sammy.get
 // #/:core/plugins
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(plugins)$/,
+  new RegExp( app.core_regex_base + '\\/(plugins)$' ),
   function( context )
   {
     core_basepath = this.active_core.attr( 'data-basepath' );
@@ -423,4 +459,4 @@ sammy.get
       }
     );
   }
-);
\ No newline at end of file
+);

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/query.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/query.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/query.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/query.js Sun Mar 10 15:04:57 2013
@@ -18,7 +18,7 @@
 // #/:core/query
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(query)$/,
+  new RegExp( app.core_regex_base + '\\/(query)$' ),
   function( context )
   {
     var core_basepath = this.active_core.attr( 'data-basepath' );
@@ -36,7 +36,7 @@ sammy.get
         var query_form = $( '#form form', query_element );
         var url_element = $( '#url', query_element );
         var result_element = $( '#result', query_element );
-        var response_element = $( '#response iframe', result_element );
+        var response_element = $( '#response', result_element );
 
         url_element
           .die( 'change' )
@@ -45,40 +45,49 @@ sammy.get
             'change',
             function( event )
             {
-              var check_iframe_ready_state = function()
-              {
-                var iframe_element = response_element.get(0).contentWindow.document || response_element.get(0).document;
+              var wt = $( '[name="wt"]', query_form ).val();
 
-                if( !iframe_element )
-                {
-                  console.debug( 'no iframe_element found', response_element );
-                  return false;
-                }
+              var content_generator = {
 
-                url_element
-                  .addClass( 'loader' );
+                _default : function( xhr )
+                {
+                  return xhr.responseText.esc();
+                },
 
-                if( 'complete' === iframe_element.readyState )
+                json : function( xhr )
                 {
-                  url_element
-                    .removeClass( 'loader' );
+                  return app.format_json( xhr.responseText );
                 }
-                else
+
+              };
+
+              $.ajax
+              (
                 {
-                  window.setTimeout( check_iframe_ready_state, 100 );
+                  url : this.href,
+                  dataType : wt,
+                  context : response_element,
+                  beforeSend : function( xhr, settings )
+                  {
+                    this
+                     .html( '<div class="loader">Loading ...</div>' );
+                  },
+                  complete : function( xhr, text_status )
+                  {
+                    var code = $(
+                      '<pre class="syntax language-' + wt + '"><code>' +
+                      ( content_generator[wt] || content_generator['_default'] )( xhr ) +
+                      '</code></pre>'
+                    );
+                    this.html( code );
+
+                    if( 'success' === text_status )
+                    {
+                      hljs.highlightBlock( code.get(0) );
+                    }
+                  }
                 }
-              }
-              check_iframe_ready_state();
-
-              response_element
-                .attr( 'src', this.href );
-                            
-              if( !response_element.hasClass( 'resized' ) )
-              {
-                response_element
-                  .addClass( 'resized' )
-                  .css( 'height', $( '#main' ).height() - 60 );
-              }
+              );
             }
           )
 
@@ -104,27 +113,38 @@ sammy.get
             '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++ )
+ 
+              var add_to_form_values = function add_to_form_values( fields )
               {
-                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] );
-              }
+                 for( var i in fields )
+                 {
+                  if( !fields[i].value || 0 === fields[i].value.length )
+                  {
+                    continue;
+                  }
+ 
+                  form_values.push( fields[i] );
+                 }
+              };
+ 
+              var fieldsets = $( '> fieldset', query_form );
+ 
+              var fields = fieldsets.first().formToArray( true );
+              add_to_form_values( fields );
+
+              fieldsets.not( '.common' )
+                .each
+                (
+                  function( i, set )
+                  {
+                    if( $( 'legend input', set ).is( ':checked' ) )
+                    {
+                      var fields = $( set ).formToArray( true );
+                      add_to_form_values( fields );
+                    }
+                  }
+                );
 
               var handler_path = $( '#qt', query_form ).val();
               if( '/' !== handler_path[0] )
@@ -135,7 +155,13 @@ sammy.get
 
               var query_url = window.location.protocol + '//' + window.location.host
                             + core_basepath + handler_path + '?' + $.param( form_values );
-                            
+
+              var custom_parameters = $( '#custom_parameters', query_form ).val();
+              if( custom_parameters && 0 !== custom_parameters.length )
+              {
+                query_url += '&' + custom_parameters.replace( /^&/, '' ); 
+              }
+
               url_element
                 .attr( 'href', query_url )
                 .text( query_url )

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/replication.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/replication.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/replication.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/replication.js Sun Mar 10 15:04:57 2013
@@ -22,49 +22,6 @@ var core_basepath = null;
 var navigation_element = null;
 var replication_element = null;
 
-var convert_duration_to_seconds = function( str )
-{
-  var ret = 0;
-  var parts = new String( str ).split( ':' ).reverse();
-  var parts_count = parts.length;
-    
-  for( var i = 0; i < parts_count; i++ )
-  {
-    ret += parseInt( parts[i], 10 ) * Math.pow( 60, i );
-  }
-
-  return ret;
-}
-
-var convert_seconds_to_readable_time = function( value )
-{
-  var text = [];
-  value = parseInt( value );
-
-  var minutes = Math.floor( value / 60 );
-  var hours = Math.floor( minutes / 60 );
-
-  if( 0 !== hours )
-  {
-    text.push( hours + 'h' );
-    value -= hours * 60 * 60;
-    minutes -= hours * 60;
-  }
-
-  if( 0 !== minutes )
-  {
-    text.push( minutes + 'm' );
-    value -= minutes * 60;
-  }
-
-  if( 0 !== value )
-  {
-    text.push( value + 's' );
-  }
-
-  return text.join( ' ' );
-}
-
 var init_timer = function( next_tick )
 {
   if( timer_timeout )
@@ -83,7 +40,7 @@ var update_timer = function( next_tick )
   }
 
   $( 'p .tick', timer_element )
-    .text( convert_seconds_to_readable_time( next_tick ) );
+    .text( app.convert_seconds_to_readable_time( next_tick ) );
 
   timer_timeout = window.setTimeout
   (
@@ -151,7 +108,7 @@ var replication_fetch_status = function(
 
           var eta_element = $( '#eta', progress_element );
           $( 'span', eta_element )
-            .text( convert_seconds_to_readable_time( data.slave.timeRemaining ) );
+            .text( app.convert_seconds_to_readable_time( data.slave.timeRemaining ) );
 
           var bar_element = $( '#bar', progress_element );
           $( '.files span', bar_element )
@@ -394,7 +351,7 @@ var replication_fetch_status = function(
               timer_element = $( '.timer', navigation_element );
               approx_element = $( '.approx', timer_element );
 
-              var next_tick = convert_duration_to_seconds( data.slave.pollInterval );
+              var next_tick = app.convert_duration_to_seconds( data.slave.pollInterval );
               approx_element.show();
 
               if( data.slave.nextExecutionAt )
@@ -490,7 +447,7 @@ var replication_fetch_status = function(
 // #/:core/replication
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(replication)$/,
+  new RegExp( app.core_regex_base + '\\/(replication)$' ),
   function( context )
   {
     core_basepath = this.active_core.attr( 'data-basepath' );

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/schema-browser.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/schema-browser.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/schema-browser.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/schema-browser.js Sun Mar 10 15:04:57 2013
@@ -66,9 +66,7 @@ var load_terminfo = function( trigger_el
       },
       success : function( response, text_status, xhr )
       {
-        $( 'span', trigger_element )
-          .removeClass( 'loader' );
-
+        var additional_styles = [];
         var field_data = response.fields[field];
 
         if( !field_data || !( field_data.topTerms && field_data.histogram ) )
@@ -79,6 +77,11 @@ var load_terminfo = function( trigger_el
           return false;
         }
 
+        var get_width = function get_width()
+        {
+          return $( this ).width();
+        }
+
         var topterms_holder_element = $( '.topterms-holder', data_element );
         var histogram_holder_element = $( '.histogram-holder', data_element );
 
@@ -111,11 +114,11 @@ var load_terminfo = function( trigger_el
 
               topterms_frq_last = topterms[i+1];
               topterms_content += '<li class="clearfix">'
-                               +  '<p><span>' + topterms_frq_last.esc() + '</span></p>' + "\n"
+                               +  '<p><span>' + app.format_number( topterms_frq_last ) + '</span></p>' + "\n"
                                +  '<ul>' + "\n";
             }
 
-            var target = '#/' + current_core + '/query?q=' + field.esc() + ':' + encodeURIComponent( topterms[i] );
+            var target = '#/' + current_core + '/query?q=' + field.esc() + ':' + encodeURIComponent( '"' + topterms[i] + '"' );
             topterms_content += '<li><a href="' + target + '">' + topterms[i].esc() + '</a></li>' + "\n";
           }
 
@@ -129,6 +132,13 @@ var load_terminfo = function( trigger_el
           topterms_table_element
             .html( topterms_content );
 
+          var max_width = 10 + Math.max.apply( Math, $( 'p', topterms_table_element ).map( get_width ).get() );
+          additional_styles.push
+          (
+            topterms_table_element.selector + ' p { width: ' + max_width + 'px !important; }' + "\n" +
+            topterms_table_element.selector + ' ul { margin-left: ' + ( max_width + 5 ) + 'px !important; }'
+          );
+
           topterms_count_element
             .val( topterms_count );
 
@@ -152,52 +162,57 @@ var load_terminfo = function( trigger_el
           histogram_holder_element
             .show();
 
-          var histogram_element = $( '.histogram', histogram_holder_element );
-
           var histogram_values = luke_array_to_hash( field_data.histogram );
-          var histogram_legend = '';
-
-          histogram_holder_element
-            .show();
-
+          var histogram_entries = [];
+          
+          var histogram_max = null;
           for( var key in histogram_values )
           {
-            histogram_legend += '<dt><span>' + key + '</span></dt>' + "\n" +
-                    '<dd title="' + key + '">' +
-                    '<span>' + histogram_values[key] + '</span>' +
-                    '</dd>' + "\n";
+            histogram_max = Math.max( histogram_max, histogram_values[key] );
           }
 
-          $( 'dl', histogram_holder_element )
-            .html( histogram_legend );
-
-          var histogram_values = luke_array_to_struct( field_data.histogram ).values;
-
-          histogram_element
-            .sparkline
+          for( var key in histogram_values )
+          {
+            histogram_entries.push
             (
-              histogram_values,
-              {
-                type : 'bar',
-                barColor : '#c0c0c0',
-                zeroColor : '#000000',
-                height : histogram_element.height(),
-                barWidth : 46,
-                barSpacing : 3
-              }
+              '<li>' + "\n" +
+              '  <dl class="clearfix" style="width: ' +  ( ( histogram_values[key] / histogram_max ) * 100 ) + '%;">' + "\n" +
+              '    <dt><span>' + app.format_number( key ) + '</span></dt>' + "\n" +
+              '    <dd><span>' + app.format_number( histogram_values[key] ) + '</span></dd>' + "\n" +
+              '  </dl>' + "\n" +
+              '</li>'
             );
+          }
+
+          $( 'ul', histogram_holder_element )
+            .html( histogram_entries.join( "\n" ) );
+
+          $( 'ul li:even', histogram_holder_element )
+            .addClass( 'odd' );
 
-          1 === histogram_values.length
-            ? histogram_element.addClass( 'single' )
-            : histogram_element.removeClass( 'single' );
+          var max_width = 10 + Math.max.apply( Math, $( 'dt', histogram_holder_element ).map( get_width ).get() );
+          additional_styles.push
+          (
+            histogram_holder_element.selector + ' ul { margin-left: ' + max_width + 'px !important; }' + "\n" +
+            histogram_holder_element.selector + ' li dt { left: ' + ( max_width * -1 ) + 'px !important; width: ' + max_width + 'px !important; }'
+          );
         }
 
+        if( additional_styles )
+        {
+          terminfo_element
+            .prepend( '<style type="text/css">' + additional_styles.join( "\n" ) + '</style>' );
+        }
       },
       error : function( xhr, text_status, error_thrown)
       {
+        terminfo_element
+          .addClass( 'disabled' );
       },
       complete : function( xhr, text_status )
       {
+        $( 'span', trigger_element )
+          .removeClass( 'loader' );
       }
     }
   );
@@ -213,7 +228,7 @@ sammy.bind
     var related_select_element = $( '#related select', params.schema_browser_element )
     var type = 'index';
 
-    var sammy_basepath = '#/' + $( 'p a', params.active_core ).html() + '/schema-browser';
+    var sammy_basepath = app.core_menu.find( '.active a' ).attr( 'href' );
         
     if( !related_navigation_meta.hasClass( 'done' ) )
     {
@@ -625,7 +640,7 @@ sammy.bind
                     }
 
                     related_select_element
-                      .attr( 'rel', '#/' + $( 'p a', params.active_core ).html() + '/schema-browser' )
+                      .attr( 'rel', app.core_menu.find( '.active a' ).attr( 'href' ) )
                       .append( related_options )
                       .chosen();
                                             
@@ -678,7 +693,7 @@ sammy.bind
 // #/:core/schema-browser
 sammy.get
 (
-  /^#\/([\w\d-]+)\/(schema-browser)$/,
+  new RegExp( app.core_regex_base + '\\/(schema-browser)$' ),
   function( context )
   {
     var core_basepath = this.active_core.attr( 'data-basepath' );
@@ -713,52 +728,6 @@ sammy.get
         data_element
           .show();
 
-        var keystring_to_list = function( keystring, element_class )
-        {
-          var key_list = keystring.replace( /-/g, '' ).split( '' );
-          var list = [];
-
-          for( var i in key_list )
-          {
-            var option_key = schema_browser_data.key[key_list[i]];
-
-            if( !option_key )
-            {
-              option_key = schema_browser_data.key[key_list[i].toLowerCase()];
-            }
-
-            if( !option_key )
-            {
-              option_key = schema_browser_data.key[key_list[i].toUpperCase()];
-            }
-
-            if( option_key )
-            {
-              list.push
-              (
-                '<dd ' + ( element_class ? ' class="' + element_class + '"' : '' ) + '>' +
-                option_key +
-                ',</dd>'
-              );
-            }
-          }
-
-          list[list.length-1] = list[key_list.length-1].replace( /,/, '' );
-
-          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;
-        }
-
         // -- head
 
         var head_element = $( '.head', data_element );
@@ -786,72 +755,6 @@ sammy.get
         $( '.partial', data_element )
           .toggle( partial_state );
 
-        // -- properties
-        var properties_element = $( 'dt.properties', options_element );
-        if( 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
-        var schema_element = $( 'dt.schema', options_element );
-        if( is_f && schema_browser_data.fields[field] && 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
-        var index_element = $( 'dt.index', options_element );
-        if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].index )
-        {
-          var index_keys = [];
-
-          if( 0 === schema_browser_data.fields[field].index.indexOf( '(' ) )
-          {
-            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' );
-          }
-
-          $( 'dd.index', options_element )
-            .remove();
-
-          index_element
-            .show()
-            .after( index_keys.join( "\n" ) );
-        }
-        else
-        {
-          $( '.index', options_element )
-            .hide();
-        }
-
         // -- docs
         var docs_element = $( 'dt.docs', options_element );
         if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].docs )
@@ -920,6 +823,103 @@ sammy.get
             $( '.similarity', options_element ).hide();
         }
 
+
+        // -- flags table
+        var flags_table = $( 'table.flags', data_element );
+
+        var flags_arr = [];
+        for( var key in schema_browser_data.key )
+        {
+          flags_arr.push( '<th data-key="' + key + '">' + schema_browser_data.key[key] + '</th>' );
+        }
+
+        $( 'thead tr', flags_table )
+          .append( flags_arr.join( "\n" ) );
+
+
+        var flags_body = $( 'tbody', flags_table );
+        flags_body.empty();
+
+        var generate_flags_row = function generate_flags_row( flags_str, title )
+        {
+          var flags_arr = [ '<th>' + title.esc() + '</th>' ];
+
+          if( 0 === flags_str.indexOf( '(' ) )
+          {
+            flags_arr.push( '<td colspan="2" class="text">' + flags_str + '</td>' );
+          }
+          else
+          {
+            var i = 0;
+            for( var key in schema_browser_data.key )
+            {
+              var flag_match = key === flags_str[i];
+
+              var flag_cell = '<td '
+                            + ' data-key="' + key + '"'
+                            + ' class="' + ( flag_match ? 'check' : '' ) + '"'
+                            + '>'
+                            + ( flag_match ? '<span>√</span>' : '&nbsp;' )
+                            + '</td>';
+
+              flags_arr.push( flag_cell );
+              i++;
+            }
+          }
+
+          flags_body
+            .append( '<tr>' + flags_arr.join( "\n" ) + '</tr>' );
+        };
+
+        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;
+        }
+
+        if( flags )
+        {
+          generate_flags_row( flags, 'Properties' );
+        }
+
+        if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].schema )
+        {
+          generate_flags_row( schema_browser_data.fields[field].schema, 'Schema' );
+        }
+
+        if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].index )
+        {
+          generate_flags_row( schema_browser_data.fields[field].index, 'Index' );
+        }
+
+
+        if( 0 !== $( 'tr', flags_body ).size() )
+        {
+          var col_count = 0;
+          for( var key in schema_browser_data.key )
+          {
+            var cols = $( '[data-key="' + key + '"]', flags_table );
+            
+            var col_used = 0 !== cols.filter( '.check' ).size();
+            col_count += col_used;
+
+            cols.toggle( col_used );
+          }
+
+          $( 'td[colspan]', flags_body )
+            .attr( 'colspan', col_count );
+
+          flags_table.show();
+        }
+        else
+        {
+          flags_table.hide();
+        }
+
         var analyzer_element = $( '.analyzer', data_element );
         var analyzer_data = null;
 

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/threads.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/threads.js?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/threads.js (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/js/scripts/threads.js Sun Mar 10 15:04:57 2013
@@ -21,7 +21,7 @@ sammy.get
   /^#\/(~threads)$/,
   function( context )
   {
-    var core_basepath = $( 'li[data-basepath]', app.menu_element ).attr( 'data-basepath' );
+    var core_basepath = $( '[data-basepath]', app.menu_element ).attr( 'data-basepath' );
     var content_element = $( '#content' );
 
     $.get

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/tpl/analysis.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/tpl/analysis.html?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/tpl/analysis.html (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/tpl/analysis.html Sun Mar 10 15:04:57 2013
@@ -59,7 +59,7 @@ limitations under the License.
 
               <div class="buttons clearfix">
 
-                <button type="submit">Analyse Values</button>
+                <button type="submit"><span>Analyse Values</span></button>
 
                 <div class="verbose_output active">
                   <a>Verbose Output</a>

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/tpl/cloud.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/tpl/cloud.html?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/tpl/cloud.html (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/tpl/cloud.html Sun Mar 10 15:04:57 2013
@@ -39,6 +39,17 @@ limitations under the License.
 
       <div id="canvas"></div>
 
+      <div id="legend">
+        <ul>
+          <li class="leader"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Leader</li>
+          <li class="active"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Active</li>
+          <li class="recovering"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Recovering</li>
+          <li class="down"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Down</li>
+          <li class="recovery_failed"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Recovery Failed</li>
+          <li class="gone"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Gone</li>
+        </ul>
+      </div>
+
     </div>
 
   </div>

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/tpl/dataimport.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/tpl/dataimport.html?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/tpl/dataimport.html (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/tpl/dataimport.html Sun Mar 10 15:04:57 2013
@@ -18,27 +18,49 @@ limitations under the License.
 
   <div id="frame">
 
+    <div id="error"></div>
+
     <div id="current_state">
 
-      <span class="time"></span>
+      <p class="last_update">Last Update: <abbr>Unknown</abbr></p>
       <div class="info">
+
         <strong></strong>
-        <div class="details"></div>
+        <div class="details">
+          <div class="docs"></div>
+          <div class="dates"></div>
+        </div>
+
+        <button class="abort-import warn"><span data-aborting="Aborting Import">Abort Import</span></button>
+
       </div>
     
     </div>
 
-    <div id="config-error">
+    <div class="block hidden" id="raw_output">
 
-      Dataimport XML-Configuration is not valid
+      <h2>
+        <a class="toggle"><span>Raw Status-Output</span></a>
+      </h2>
+        
+      <div class="message-container">
+          <div class="message"></div>
+      </div>
 
+      <div class="content">
+
+        <div id="raw_output_container"></div>
+
+      </div>
+    
     </div>
 
     <div class="block hidden" id="config">
 
-      <h2>
-        <a class="toggle"><span>Dataimport Configuration</span></a>
-        <a class="reload_config" title="Reload Configuration">Reload</a>
+      <h2 class="clearfix">
+        <a class="toggle"><span>Configuration</span></a>
+        <a class="r reload_config" title="Reload Configuration">Reload</a>
+        <a class="r debug_mode">Debug-Mode</a>
       </h2>
         
       <div class="message-container">
@@ -49,13 +71,41 @@ limitations under the License.
 
         <div id="dataimport_config">
 
-          <div class="loader">Loading ...</div>
-        
+          <div class="formatted">
+
+            <div class="loader">Loading ...</div>
+          
+          </div>
+
+          <div class="editable">
+
+            <textarea></textarea>
+          
+          </div>
+
         </div>
 
       </div>
     
     </div>
+
+    <div class="block hidden" id="debug_response">
+
+      <h2>
+        <a class="toggle"><span>Raw Debug-Response</span></a>
+      </h2>
+        
+      <div class="message-container">
+          <div class="message"></div>
+      </div>
+
+      <div class="content">
+
+        <em>No Request executed</em>
+
+      </div>
+    
+    </div>
   
   </div>
 
@@ -97,6 +147,11 @@ limitations under the License.
         <a rel="help">Optimize</a>
       </label>
 
+      <label for="debug" class="checkbox">
+        <input type="checkbox" name="debug" id="debug" value="true">
+        <a rel="help">Debug</a>
+      </label>
+
       <label for="entity">
         <a rel="help">Entity</a>
       </label>
@@ -106,17 +161,22 @@ limitations under the License.
         <a rel="help">Start</a>,
         <a rel="help">Rows</a>
       </label>
-      <input type="text" id="start" placeholder="0">
-      <input type="text" id="rows" placeholder="10">
+      <div class="clearfix">
+        <input type="text" id="start" placeholder="0">
+        <input type="text" id="rows" placeholder="10">
+      </div>
 
       <label for="custom_parameters">
         <a rel="help">Custom Parameters</a>
       </label>
       <input type="text" id="custom_parameters" value="" placeholder="key1=val1&amp;key2=val2">
 
-      <button type="submit">Execute Import</button>
+      <button class="execute" type="submit"><span data-debugmode="Execute with this Configuration →">Execute</span></button>
+      <button class="refresh-status"><span>Refresh Status</span></button>
     
     </form>
+
+    <p id="auto-refresh-status"><a>Auto-Refresh Status</a></p>
   
   </div>
 

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/tpl/query.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/tpl/query.html?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/tpl/query.html (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/tpl/query.html Sun Mar 10 15:04:57 2013
@@ -48,8 +48,10 @@ limitations under the License.
           <a rel="help">start</a>,
           <a rel="help">rows</a>
         </label>
-        <input type="text" name="start" id="start" placeholder="0" pattern="[0-9]+" title="Number of leading documents to skip. (Integer)">
-        <input type="text" name="rows" id="rows" placeholder="10" pattern="[0-9]+" title="Number of documents to return after 'start'. (Integer)">
+        <div class="clearfix">
+          <input type="text" name="start" id="start" placeholder="0" pattern="[0-9]+" title="Number of leading documents to skip. (Integer)">
+          <input type="text" name="rows" id="rows" placeholder="10" pattern="[0-9]+" title="Number of documents to return after 'start'. (Integer)">
+        </div>
 
         <label for="fl">
           <a rel="help">fl</a>
@@ -61,6 +63,11 @@ limitations under the License.
         </label>
         <input type="text" name="df" id="df" value="" title="Default search field">
 
+        <label for="custom_parameters">
+          <a rel="help">Raw Query Parameters</a>
+        </label>
+        <input type="text" id="custom_parameters" value="" placeholder="key1=val1&amp;key2=val2">
+
         <label for="wt">
           <a rel="help">wt</a>
         </label>
@@ -74,7 +81,7 @@ limitations under the License.
         </select>
 
         <label for="indent" class="checkbox">
-          <input type="checkbox" name="indent" id="indent" value="true" title="Indent results.">
+          <input type="checkbox" name="indent" id="indent" value="true" title="Indent results." checked="checked">
           <a rel="help">indent</a>
         </label>
 
@@ -160,6 +167,34 @@ limitations under the License.
 
         <label for="edismax_bf">bf</label>
         <input type="text" name="bf" id="edismax_bf" title="Boost function (added).">
+
+        <label for="edismax_uf" title="User Fields">uf</label>
+        <input type="text" name="uf" id="edismax_uf">
+
+        <label for="edismax_pf2" title="bigram phrase boost fields">pf2</label>
+        <input type="text" name="pf2" id="edismax_pf2">
+
+        <label for="edismax_pf3" title="trigram phrase boost fields">pf3</label>
+        <input type="text" name="pf3" id="edismax_pf3">
+
+        <label for="edismax_ps2" title="phrase slop for bigram phrases">ps2</label>
+        <input type="text" name="ps2" id="edismax_ps2">
+
+        <label for="edismax_ps3" title="phrase slop for trigram phrases">ps3</label>
+        <input type="text" name="ps3" id="edismax_ps3">
+
+        <label for="edismax_boost" title="multiplicative boost function">boost</label>
+        <input type="text" name="boost" id="edismax_boost">
+
+        <label for="edismax_stopwords" class="checkbox" title="remove stopwords from mandatory 'matching' component">
+          <input type="checkbox" name="stopwords" id="edismax_stopwords" value="true" checked="checked">
+          stopwords
+        </label>
+
+        <label for="edismax_lowercaseOperators" class="checkbox" title="Enable lower-case 'and' and 'or' as operators">
+          <input type="checkbox" name="lowercaseOperators" id="edismax_lowercaseOperators" value="true" checked="checked">
+          lowercaseOperators
+        </label>
       
         </div>
       </fieldset>

Modified: lucene/dev/branches/lucene4258/solr/webapp/web/tpl/schema-browser.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4258/solr/webapp/web/tpl/schema-browser.html?rev=1454862&r1=1454861&r2=1454862&view=diff
==============================================================================
--- lucene/dev/branches/lucene4258/solr/webapp/web/tpl/schema-browser.html (original)
+++ lucene/dev/branches/lucene4258/solr/webapp/web/tpl/schema-browser.html Sun Mar 10 15:04:57 2013
@@ -43,12 +43,6 @@ limitations under the License.
 
             <dt class="similarity">Similarity:</dt>
 
-            <dt class="properties">Properties:</dt>
-
-            <dt class="schema">Schema:</dt>
-
-            <dt class="index">Index:</dt>
-
             <dt class="position-increment-gap"><abbr title="Position Increment Gap">PI Gap</abbr>:</dt>
 
             <dt class="docs">Docs:</dt>
@@ -57,6 +51,24 @@ limitations under the License.
                         
           </dl>
 
+          <table class="flags" cellspacing="0" cellpadding="0" border="0">
+
+            <thead>
+
+              <tr>
+
+                <td>Flags:</td>
+
+              </tr>
+
+            </thead>
+
+            <tbody>
+
+            </tbody>
+
+          </table>
+
           <ul class="analyzer">
             <li class="clearfix index">
 
@@ -146,12 +158,8 @@ limitations under the License.
 
             <p class="head">Histogram:</p>
 
-            <div class="histogram"></div>
-
-            <dl class="clearfix">
+            <ul></ul>
 
-            </dl>
-                    
           </div>
 
         </div>