/***********************************************************************
** Simplified cookie class - used to set standard Ensembl cookies for
** later retrieval - path is always set to "/" and expiry date is set
** to january 2038 (end of 32bit time)
***********************************************************************/

var Cookie = {
  set: function(name, value, expiry) {
    return ( document.cookie =
      escape(name) + '=' + escape(value || '') +
      '; expires='+ ( expiry == -1 ? 'Thu, 01 Jan 1970' : 'Tue, 19 Jan 2038' ) +
      ' 00:00:00 GMT; path=/'
    );
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return cookie ? unescape(cookie[2]) : null;
  },
  unset: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  }
};

// Check for a value of the ENSEMBL_AJAX cookie and set if not already set!
// either enabled/disabled...

var ENSEMBL_AJAX = Cookie.get('ENSEMBL_AJAX');
var ENSEMBL_WIDTH = Cookie.get('ENSEMBL_WIDTH');
var RESIZE_BAR  = 1;

function __set_cookies( ) {
  if( ENSEMBL_AJAX != 'enabled' && ENSEMBL_AJAX != 'disabled' && ENSEMBL_AJAX != 'none' ) {
    ENSEMBL_AJAX = Ajax.getTransport()?'enabled':'none';
    if( ENSEMBL_AJAX == 'enabled' ) {
      RESIZE_BAR = 0;
    }
    Cookie.set( 'ENSEMBL_AJAX',ENSEMBL_AJAX );
  }
  if( ! ENSEMBL_WIDTH ) {
    ENSEMBL_WIDTH = Math.floor( ( document.viewport.getWidth() - 250 ) /100 ) * 100;
    if(ENSEMBL_WIDTH < 500) ENSEMBL_WIDTH = 500;
    Cookie.set( 'ENSEMBL_WIDTH',ENSEMBL_WIDTH );
  }
}

addLoadEvent( __set_cookies );
/***********************************************************************
  Debugging code - this code displays the debug box at the top of the
  webpage 
  
  Note code is only run once - not on subsequent Ajax requests..
***********************************************************************/

/** 
  function _debug_press( event )
  
  Clicking on one of the buttons in the debug box; toggles the
  messages of the particular type; except for the clear button which
  removes all the messages...

**/

var timers_hash = {};

function _debug_press(evt) {
  bu    = Event.element(evt);
  bu_id = bu.id;
  if( bu_id == 'debug_ajax' ) {
    if( bu.hasClassName(  'debug_button' ) ){
      bu.addClassName(    'debug_button_inv' );
      bu.removeClassName( 'debug_button'     );
      ENSEMBL_AJAX = 'disabled';
    } else {
      bu.addClassName(    'debug_button'     );
      bu.removeClassName( 'debug_button_inv' );
      ENSEMBL_AJAX = 'enabled';
    }
    Cookie.set( 'ENSEMBL_AJAX', ENSEMBL_AJAX );
    return;
  }
  if( bu_id == 'debug_clear' ) {
// "the clear" button is different from the rest! - it clears the list
    $('debug_list').innerHTML = '';
    return;
  } 
  if( bu.hasClassName(  'debug_button' ) ){
    bu.addClassName(    'debug_button_inv' );
    bu.removeClassName( 'debug_button'     );
    $$( '.'+bu_id ).each(function(n){n.hide()});
  } else {
    bu.addClassName(    'debug_button'     );
    bu.removeClassName( 'debug_button_inv' );
    $$( '.'+bu_id ).each(function(n){n.show()});
  }
}


/** 
  function __debug( message, level ); 
  
  push a debug message onto the tree with the appropriate level;
  default for level is "info"
  
  Note... only works if there is a "debug" node in the DOM
  
  There are four wrapper functions with pre-specify the level...
  
  __info(    message );
  __warning( message );
  __error(   message );
  __success( message );
**/

function _debug_start_time( key ) {
  timers_hash[key] = new Date();
}

function _debug_end_time( key ) {
  return _time_diff( timers_hash[key] );
}

function __debug( s,l ) {
  if($('debug_list')) {
    if(!l) l = 'info';
    var cl = "debug_"+l;
    var X = Builder.node('li',{className:cl}, "["+l+":"+_time_diff(ENSEMBL_START_TIME)+"s] "+s+"\n");
    $('debug_list').appendChild(X);
    if( $(cl).hasClassName('debug_button_inv') ) {
      X.hide();
    }
  }
}

function __debug_raw( s,l ) {
  if($('debug_list')) {
    if(!l) l = 'info'
    var cl = "debug_"+l;
    var X = Builder.node('li',{className:cl}, "["+l+":"+_time_diff(ENSEMBL_START_TIME)+"s] ");
    X.innerHTML = X.innerHTML + s+"\n";
    $('debug_list').appendChild(X);
    if( $(cl).hasClassName('debug_button_inv') ) {
      X.hide();
    }
  }
}


function __info(s)    { __debug(s,'info');    }
function __warning(s) { __debug(s,'warning'); }
function __error(s)   { __debug(s,'error');   }
function __success(s) { __debug(s,'success'); }

function __status(s)  {
  $('debug_status').innerHTML = s;
}
/**
  debug initialisation function - 
  if a div with id "debug" exists - create debug window;
  and add events to it to create the debug panel.
**/
var ENSEMBL_DEBUG = 0;
function __init_ensembl_debug() {
  if( ENSEMBL_DEBUG==1 ) return;
  ENSEMBL_DEBUG = 1;
  if( $('debug') ) {
// Construct the buttons close/open button for the dialog box
  // Add the debug button which opens/closes the pages
    $('debug').appendChild(Builder.node('div',{id:'debug_button'},[
      'Debug information... (',
      Builder.node('span',{id:'debug_status'}),
      ')'
      ]
    ));
  // Add the links to clear debug messages; toggle display of
  // message types
    $('debug').appendChild(Builder.node('div',
      {id:'debug_links',className:'invis'},[
        Builder.node('span',
          {id:'debug_success',className:'debug_button'},'Success'),
        Builder.node('span',
          {id:'debug_info',   className:'debug_button'},'Info'),
        Builder.node('span',
          {id:'debug_warn',   className:'debug_button'},'Warnings'),
        Builder.node('span',
          {id:'debug_error',  className:'debug_button'},'Errors'),
        Builder.node('span',
          {id:'debug_clear',  className:'debug_button'},'Clear'),
        Builder.node('span',
          {id:'debug_ajax',   className:ENSEMBL_AJAX=='enabled'?'debug_button':'debug_button_inv'},'AJAX')
      ]
    ));
  // Add the area to include the debug messages.
    $('debug').appendChild(Builder.node('ul',
      {id:'debug_list',className:'invis'}
    ));
  // Add an on-click event to the main debug button to
  // open/close debug panel...
    Event.observe( $('debug_button'), 'click',function() {
      if($('debug_list').hasClassName(   'invis')) {
         $('debug_list').addClassName(   'vis');
         $('debug_list').removeClassName('invis');
        $('debug_links').addClassName(   'vis');
        $('debug_links').removeClassName('invis');
      } else {
         $('debug_list').addClassName(   'invis');
         $('debug_list').removeClassName('vis');
        $('debug_links').addClassName(   'invis');
        $('debug_links').removeClassName('vis');
      }
    });
  // Add an on click event to the buttons to toggle the display of
  // messages of given class..
    $$('.debug_button','.debug_button_inv').each(function(but) {
      Event.observe( but, 'click', _debug_press );
    });
  }
  __info( 'AJAX is '+ENSEMBL_AJAX+ '; load time is '+ENSEMBL_START_TIME+'s' );
  __info( "COOKIE: "+document.cookie );
}

// Call initialisation function on page load
addLoadEvent( __init_ensembl_debug );

/***********************************************************************

  DIAGNOSTIC JAVASCRIPT...
  
  Used exclusively by the packed tree dumper - to show/hide a
  sub-section of dumped packed file -
  
  Should probably go in a diagnostic plugin along with debug...
  
***********************************************************************/

var ENSEMBL_TREE_COLLAPSE = 0; // Only run once on page load, not
                               // on subsequent AJAX loads

function __init_collapse_tree() {
  if( ENSEMBL_TREE_COLLAPSE ) return;
  ENSEMBL_TREE_COLLAPSE = 1;
  $$("table.nested th").each(function(n){
// Make "th" clickable - so that neighbouring "td" toggles between
// visible/invisible
    Event.observe(n,'click',function(event){
      Event.element(event).nextSibling.toggle();
    });
    n.setStyle({cursor:'pointer'});
  });
}

addLoadEvent( __init_collapse_tree );

