var solr_admin = function()

in solr/webapp/solr/js/scripts/app.js [154:597]


var solr_admin = function( app_config )
{
  that = this,

  menu_element = null,

  is_multicore = null,
  cores_data = null,
  active_core = null,
    
  config = app_config,
  params = null,
  dashboard_values = null,
  schema_browser_data = null,

  plugin_data = null,
    
  this.menu_element = $( '#core-selector select' );
  this.core_menu = $( '#core-menu ul' );

  this.config = config;
  this.timeout = null;

  this.core_regex_base = '^#\\/([\\w\\d-\\.]+)';

  browser = {
    locale : null,
    language : null,
    country : null
  };

  show_global_error = function( error )
  {
    var main = $( '#main' );

    $( 'div[id$="-wrapper"]', main )
      .remove();

    main
      .addClass( 'error' )
      .append( error );

    var pre_tags = $( 'pre', main );
    if( 0 !== pre_tags.size() )
    {
      hljs.highlightBlock( pre_tags.get(0) ); 
    }
  };

  sort_cores_data = function sort_cores_data( cores_status )
  {
    // build array of core-names for sorting
    var core_names = [];
    for( var core_name in cores_status )
    {
      core_names.push( core_name );
    }
    core_names.sort();

    var core_count = core_names.length;
    var cores = {};

    for( var i = 0; i < core_count; i++ )
    {
      var core_name = core_names[i];
      cores[core_name] = cores_status[core_name];
    }

    return cores;
  };

  this.set_cores_data = function set_cores_data( cores )
  {
    that.cores_data = sort_cores_data( cores.status );
    
    that.menu_element
      .empty();

    var core_list = [];
    core_list.push( '<option></option>' );

    var core_count = 0;
    for( var core_name in that.cores_data )
    {
      core_count++;
      var core_path = config.solr_path + '/' + core_name;
      var classes = [];

      if( cores.status[core_name]['isDefaultCore'] )
      {
        classes.push( 'default' );
      }

      var core_tpl = '<option '
                   + '    id="' + core_name.replace( /\./g, '__' ) + '" '
                   + '    class="' + classes.join( ' ' ) + '"'
                   + '    data-basepath="' + core_path + '"'
                   + '    schema="' + cores.status[core_name]['schema'] + '"'
                   + '    config="' + cores.status[core_name]['config'] + '"'
                   + '    value="#/' + core_name + '"'
                   + '    title="' + core_name + '"'
                   + '>' 
                   + core_name 
                   + '</option>';

      core_list.push( core_tpl );
    }

    var has_cores = 0 !== core_count;
    if( has_cores )
    {
      that.menu_element
        .append( core_list.join( "\n" ) )
        .trigger( 'liszt:updated' );
    }

    var core_selector = $( '#core-selector' );
    core_selector.find( '#has-cores' ).toggle( has_cores );
    core_selector.find( '#has-no-cores' ).toggle( !has_cores );

    if( has_cores )
    {
      var cores_element = core_selector.find( '#has-cores' );
      var selector_width = cores_element.width();

      cores_element.find( '.chzn-container' )
        .css( 'width', selector_width + 'px' );
      
      cores_element.find( '.chzn-drop' )
        .css( 'width', ( selector_width - 2 ) + 'px' );
    }

    this.check_for_init_failures( cores );
  };

  this.remove_init_failures = function remove_init_failures()
  {
    $( '#init-failures' )
      .hide()
      .find( 'ul' )
        .empty();
  }

  this.check_for_init_failures = function check_for_init_failures( cores )
  {
    if( !cores.initFailures )
    {
      this.remove_init_failures();
      return false;
    }

    var failures = [];
    for( var core_name in cores.initFailures )
    {
      failures.push
      (
        '<li>' +
          '<strong>' + core_name.esc() + ':</strong>' + "\n" +
          cores.initFailures[core_name].esc() + "\n" +
        '</li>'
      );
    }

    if( 0 === failures.length )
    {
      this.remove_init_failures();
      return false;
    }

    $( '#init-failures' )
      .show()
      .find( 'ul' )
        .html( failures.join( "\n" ) );
  }

  this.run = function()
  {
    var navigator_language = navigator.userLanguage || navigator.language;
    var language_match = navigator_language.match( /^(\w{2})([-_](\w{2}))?$/ );
    if( language_match )
    {
      if( language_match[1] )
      {
        browser.language = language_match[1].toLowerCase();
      }
      if( language_match[3] )
      {
        browser.country = language_match[3].toUpperCase();
      }
      if( language_match[1] && language_match[3] )
      {
        browser.locale = browser.language + '_' + browser.country
      }
    }

    $.ajax
    (
      {
        url : config.solr_path + config.core_admin_path + '?wt=json&indexInfo=false',
        dataType : 'json',
        beforeSend : function( arr, form, options )
        {               
          $( '#content' )
            .html( '<div id="index"><div class="loader">Loading ...</div></div>' );
        },
        success : function( response )
        {
          that.set_cores_data( response );

          that.menu_element
            .chosen()
            .off( 'change' )
            .on
            (
              'change',
              function( event )
              {
                location.href = $( 'option:selected', this ).val();
                return false;
              }
            )
            .on
            (
              'liszt:updated',
              function( event )
              {
                var core_name = $( 'option:selected', this ).text();

                that.core_menu
                  .html
                  (
                    //Keep this in alphabetical order after the overview
                    '<li class="overview"><a href="#/' + core_name + '"><span>Overview</span></a></li>' + "\n" +
                    '<li class="analysis"><a href="#/' + core_name + '/analysis"><span>Analysis</span></a></li>' + "\n" +
                    '<li class="dataimport"><a href="#/' + core_name + '/dataimport"><span>Dataimport</span></a></li>' + "\n" +
                    '<li class="documents"><a href="#/' + core_name + '/documents"><span>Documents</span></a></li>' + "\n" +
                    '<li class="files"><a href="#/' + core_name + '/files"><span>Files</span></a></li>' + "\n" +
                    '<li class="ping"><a rel="' + that.config.solr_path + '/' + core_name + '/admin/ping"><span>Ping</span></a></li>' + "\n" +
                    '<li class="plugins"><a href="#/' + core_name + '/plugins"><span>Plugins / Stats</span></a></li>' + "\n" +
                    '<li class="query"><a href="#/' + core_name + '/query"><span>Query</span></a></li>' + "\n" +
                    '<li class="replication"><a href="#/' + core_name + '/replication"><span>Replication</span></a></li>' + "\n" +
                    '<li class="schema-browser"><a href="#/' + core_name + '/schema-browser"><span>Schema Browser</span></a></li>' +
                    '<li class="segments"><a href="#/' + core_name + '/segments"><span>Segments info</span></a></li>'
                  )
                  .show();

                if( !core_name )
                {
                  that.core_menu
                    .hide()
                    .empty();
                }
              }
            );

          check_fixed_menu();
          $( window ).resize( check_fixed_menu );

          var system_url = config.solr_path + '/admin/info/system?wt=json';
          $.ajax
          (
            {
              url : system_url,
              dataType : 'json',
              beforeSend : function( arr, form, options )
              {
              },
              success : function( response )
              {
                that.dashboard_values = response;

                var environment_args = null;
                var cloud_args = null;

                if( response.jvm && response.jvm.jmx && response.jvm.jmx.commandLineArgs )
                {
                  var command_line_args = response.jvm.jmx.commandLineArgs.join( ' | ' );

                  environment_args = command_line_args.match( /-Dsolr.environment=((dev|test|prod)?[\w\d]*)/i );
                }

                if( response.mode )
                {
                  cloud_args = response.mode.match( /solrcloud/i );
                }

                // environment

                var wrapper = $( '#wrapper' );
                var environment_element = $( '#environment' );
                if( environment_args )
                {
                  wrapper
                    .addClass( 'has-environment' );

                  if( environment_args[1] )
                  {
                    environment_element
                      .html( environment_args[1] );
                  }

                  if( environment_args[2] )
                  {
                    environment_element
                      .addClass( environment_args[2] );
                  }
                }
                else
                {
                  wrapper
                    .removeClass( 'has-environment' );
                }

                // cloud

                var cloud_nav_element = $( '#menu #cloud' );
                if( cloud_args )
                {
                  cloud_nav_element
                    .show();
                }

                // sammy

                sammy.run( location.hash );
              },
              error : function()
              {
              },
              complete : function()
              {
                loader.hide( this );
              }
            }
          );
        },
        error : function()
        {
        },
        complete : function()
        {
        }
      }
    );
  };

  this.convert_duration_to_seconds = function convert_duration_to_seconds( str )
  {
    var seconds = 0;
    var arr = new String( str || '' ).split( '.' );
    var parts = arr[0].split( ':' ).reverse();
    var parts_count = parts.length;

    for( var i = 0; i < parts_count; i++ )
    {
      seconds += ( parseInt( parts[i], 10 ) || 0 ) * Math.pow( 60, i );
    }

    // treat more or equal than .5 as additional second
    if( arr[1] && 5 <= parseInt( arr[1][0], 10 ) )
    {
      seconds++;
    }

    return seconds;
  };

  this.convert_seconds_to_readable_time = function convert_seconds_to_readable_time( seconds )
  {
    seconds = parseInt( seconds || 0, 10 );
    var minutes = Math.floor( seconds / 60 );
    var hours = Math.floor( minutes / 60 );

    var text = [];
    if( 0 !== hours )
    {
      text.push( hours + 'h' );
      seconds -= hours * 60 * 60;
      minutes -= hours * 60;
    }

    if( 0 !== minutes )
    {
      text.push( minutes + 'm' );
      seconds -= minutes * 60;
    }

    if( 0 !== seconds )
    {
      text.push( ( '0' + seconds ).substr( -2 ) + 's' );
    }

    return text.join( ' ' );
  };

  this.clear_timeout = function clear_timeout()
  {
    if( !app.timeout )
    {
      return false;
    }

    console.debug( 'Clearing Timeout #' + this.timeout );
    clearTimeout( this.timeout );
    this.timeout = null;
  };

  this.format_json = function format_json( json_str )
  {
    if( JSON.stringify && JSON.parse )
    {
      json_str = JSON.stringify( JSON.parse( json_str ), undefined, 2 );
    }

    return json_str.esc();
  };

  this.format_number = function format_number( number )
  {
    var sep = {
      'de_CH' : '\'',
      'de' : '.',
      'en' : ',',
      'es' : '.',
      'it' : '.',
      'ja' : ',',
      'sv' : ' ',
      'tr' : '.',
      '_' : '' // fallback
    };

    return ( number || 0 ).toString().replace
    (
      /\B(?=(\d{3})+(?!\d))/g,
      sep[ browser.locale ] || sep[ browser.language ] || sep['_']
    );
  };

  check_fixed_menu = function check_fixed_menu()
  {
    $( '#wrapper' ).toggleClass( 'scroll', $( window ).height() < $( '#menu-wrapper' ).height() + $( '#header' ).height() + 40 );
  }

};