function clearall()
{
  $$('#line1,#line2,#line3,#line4,#embedded').invoke("update");
}

function process(json)
{
  if ( json == null )
  {
    clearall();
    return;
  }
  if ( json.l1 )
  {
    if ( json.l1.length==0) alert("Nothing matched your query.");
    var list = [];
    for (i=0; i<json.l1.length; i++)
    {
      list.push( 
        '<a href="#" onclick="return request(\''+json.l1[i]+'\',\'searchtab\')">'
        +json.l1[i]
        +'</a>');
    }
    $('line1').update(list.join(' '));
    if ( ! json.l2 )
    {
      $('line2').update();
      $('embedded').update();
    }
  }
  if ( json.l2 )
  {
    if ( json.l2.length==0) alert("Nothing matched your query.");
    var list = [];
    for (i=0; i<json.l2.length; i++)
    {
      list.push( 
        '<a href="#" onclick="return doshow(\''+json.l2[i][0]+'\',\''+json.l2[i][1]+'\')">'
        +json.l2[i][1]
        +'</a>');
    }
    $('line2').update(list.join(' '));
    $('embedded').update();
    if ( json.l2.length == 1 )
    {
      doshow(json.l2[0][0],json.l2[0][1]);
    }
  }
}

function showhtml(json)
{
  $('embedded').update(json);
  
  var reg = new RegExp("^http");
  var reg2 = new RegExp("[.]html");
  var reg3 = new RegExp("#.*$");
  var a = $$('#embedded a');
  for (var index = 0, len = a.length; index < len; ++index)
  {
    var anchor = a[index];
    var href = anchor.readAttribute('href');
    if ( href!=null && href.search(reg)==-1)
    {
      if ( href.length>0 && href.charAt(0)!='#')
      {
        anchor.writeAttribute('href','#');
        href = href.replace(reg3,'');
        href = href.replace(reg2,'');
        anchor.writeAttribute('onclick',"return doshow('"+href+"','"+anchor.text+"')");
      }
      anchor.writeAttribute('class',"localanchor");
    }
  }
  return false;
}

recents = new Array();
MAX_RECENTS = 8;

function addRecent(id,title)
{
  for(i=0; i<recents.length; i++)
  {
    if ( recents[i].text==title )
    {
      return;
    }
  }
  
  var recentItem = $('recent');
  if ( recents.length>MAX_RECENTS)
  {
    recents.shift();
    if ( !recentItem.empty())
    {
      recentItem.firstDescendant().remove();
    }
  }
  var anchor = document.createElement('a');
  anchor.writeAttribute('href','#');
  anchor.writeAttribute('onclick',"return doshow('"+id+"','"+title+"')");
  anchor.update(title);
  recents.push(anchor);
  
  recentItem.insert(anchor);
}

function doshow(id,title)
{
  addRecent(id,title);
  new Ajax.Request('/dox.php/show', 
  {
    parameters: {key: id},
    onCreate: function(transport)
    {
      //$('status').update('fetching');
    },
    onSuccess: function(transport) 
    {
      if ( transport.responseJSON == null)
      {
        clearall();
      }
      else
      {
        showhtml(transport.responseJSON);
      }

      //$('status').update();
    },
    onFailure: function(transport) 
    {
      clearall();
      alert(transport.statusText);
    }

  });
  return false;
}

function request(id,tab)
{
  new Ajax.Request('/dox.php/fetch', 
  {
    parameters: {key: id, tab: tab},
    onCreate: function(transport)
    {
      //$('status').update('fetching');
    },
    onSuccess: function(transport) 
    {
      if ( transport.responseJSON == null)
      {
        clearall();
      }
      else
      {
        process(transport.responseJSON);
      }
      //$('status').update();
    },
    onFailure: function(transport) 
    {
      clearall();
      alert(transport.statusText);
    }

  });
  return false;
}

function handleKey(ev)
{
  var k = ev.keyCode;
  if ( k == 13 )
  {
    
    var selectedtabs = $$('li.selected');
    if ( selectedtabs.length==1)
    {
      request($(ev.target).value,selectedtabs[0].id);
    }
  }
  if ( k == 13 || k == 9 )
  {
    Event.stop(ev);
  }
}

function handleSubmit(ev) // opera
{
  var selectedtabs = $$('li.selected');
  if ( selectedtabs.length==1)
  {
    request($('searchentry').value,selectedtabs[0].id);
  }
  Event.stop(ev);
}

whattab = '';

function showfeature(tab)
{
  var which = $$('li.selected')[0];
  if ( which )
  {
    which.toggleClassName('selected');
  }
  $(tab+'tab').toggleClassName('selected');
  switch(tab)
  {
    case 'manual':
    case 'search':
    case 'tree':
      if ( tab != whattab )
      {
        clearall();
      }
      $$('#help,#about').invoke("hide");
      if ( tab == 'manual')
      {
        doshow('index','PHP Manual');
        $$('#body,#recent').invoke("show");
        $$('#search').invoke("hide");
      }
      else
      {
        $$('#search,#body,#recent').invoke("show");
        $('searchentry').focus();
      }
      whattab = tab;
      break;
    case 'help':
      $$('#search,#body,#recent,#about').invoke("hide");
      $('help').show();
      break;
    case 'about':
      $$('#search,#body,#recent,#help').invoke("hide");
      $('about').show();
      break;
  }
  return false;
}

document.observe("dom:loaded", 
  function() 
  { 
    Element.hide('status');
    showfeature('about');
    if ( Prototype.Browser.Opera )
    {
      $('theform').observe('submit', function(e) { handleSubmit(e); });
    }
    else
    {
      $('searchentry').observe('keydown', function(e) { handleKey(e); });
    }
    //$('searchentry').focus();
    
    Ajax.Responders.register({
  onCreate: function() {
    if($('status') && Ajax.activeRequestCount>0)
      Element.show('status');
  },
  onComplete: function() {
    if($('status') && Ajax.activeRequestCount==0)
      Element.hide('status');
  }
});

});
