includes/clientside/static/userpage.js
author Dan
Sun, 21 Dec 2008 16:41:03 -0500
changeset 779 609e35845ec3
parent 707 7be26f1d1068
child 1227 bdac73ed481e
permissions -rw-r--r--
load_component() now accepts an array, and most JS components are loaded all in one request now. Totally modular baby. And failsafe too.

// Tabs on userpage

var userpage_blocks = [];

var userpage_onload = function()
{
  var wrapper = document.getElementById('userpage_wrap');
  var links = document.getElementById('userpage_links');
  
  if ( !wrapper )
    return false;
  
  wrapper.className = 'userpage_wrap';
  links.className = 'userpage_links';
  
  var blocks = wrapper.getElementsByTagName('div');
  var first_block = false;
  for ( var i = 0; i < blocks.length; i++ )
  {
    var block = blocks[i];
    if ( /^tab:/.test(block.id) )
    {
      $dynano(block).addClass('userpage_block');
      var block_id = block.id.substr(4);
      userpage_blocks.push(block_id);
      if ( !first_block )
      {
        // this is the first block on the page, memorize it
        first_block = block_id;
      }
    }
  }
  // init links
  var as = links.getElementsByTagName('a');
  for ( var i = 0; i < as.length; i++ )
  {
    var a = as[i];
    if ( a.href.indexOf('#') > -1 )
    {
      var hash = a.href.substr(a.href.indexOf('#'));
      var blockid = hash.substr(5);
      a.blockid = blockid;
      a.onclick = function()
      {
        userpage_select_block(this.blockid);
        return false;
      }
      a.id = 'userpage_blocklink_' + blockid;
    }
  }
  if ( $_REQUEST['tab'] )
  {
    userpage_select_block($_REQUEST['tab'], true);
  }
  else
  {
    userpage_select_block(first_block, true);
  }
}

addOnloadHook(userpage_onload);

/**
 * Select (show) the specified block on the userpage.
 * @param string block name
 * @param bool If true, omits transition effects.
 */

function userpage_select_block(block, nofade)
{
  // memorize existing scroll position, reset the hash, then scroll back to where we were
  // a little hackish and might cause a flash, but it's better than hiding the tabs on each click
  var currentScroll = getScrollOffset();
  
  var current_block = false;
  nofade = true;
  for ( var i = 0; i < userpage_blocks.length; i++ )
  {
    var div = document.getElementById('tab:' + userpage_blocks[i]);
    if ( div )
    {
      if ( div.style.display != 'none' )
      {
        current_block = userpage_blocks[i];
        if ( nofade || aclDisableTransitionFX )
        {
          div.style.display = 'none';
        }
      }
    }
    var a = document.getElementById('userpage_blocklink_' + userpage_blocks[i]);
    if ( a )
    {
      if ( $dynano(a.parentNode).hasClass('userpage_tab_active') )
      {
        $dynano(a.parentNode).rmClass('userpage_tab_active');
      }
    }
  }
  if ( nofade || !current_block || aclDisableTransitionFX )
  {
    var div = document.getElementById('tab:' + block);
    div.style.display = 'block';
  }
  else
  {
    // DISABLED: see "nofade = true;" above.
    // do this in a slightly fancier fashion
    load_component(['jquery', 'jquery-ui']);
    $('#tab:' + current_block).hide("blind", {}, 500, function()
    {
      $('#tab:' + block).show("blind", {}, 500);
    });
  }
  var a = document.getElementById('userpage_blocklink_' + block);
  $dynano(a.parentNode).addClass('userpage_tab_active');
  
  window.location.hash = 'tab:' + block;
  setScrollOffset(currentScroll);
}