if (!widget) var widget = new Object();

if (typeof widgetNotLogged=='undefined') document.write('<iframe name="log" src="about:blank" style="width:1px; height:1px; float:right; visibility:hidden"></iframe>');

widget.allLogged = '';

widget.log = function(func) {
  if (typeof widgetNotLogged!='undefined' || widget.allLogged.indexOf(func)!=-1) return;
  widget.allLogged+=func+' ';
}

/* doFootnotes - contributed by "alex" from the forums
   http://forums.pbwiki.com/viewtopic.php?t=2207
*/

widget.doFootnotes = function()
    {
        var output = document.getElementsByTagName("references");
        if (output.length == 0) return;
        output = output[0];
        var feet = document.getElementsByTagName("ref");
        var num;
        for (var i = 0; i < feet.length; ++i)
        {
            num = i + 1;
            output.innerHTML += "<p><a name='note" + num + "' href='#foot" + num + "'>" + num + "</a>. " + feet[i].innerHTML + "</p>";
            feet[i].innerHTML = "<a name='foot" + num + "' href='#note" + num + "'>" + num + "</a>";
        }
    }

widget.attachJsNode = function(url,callback) {
  var script = document.createElement('script');
  script.setAttribute('type','text/javascript');
  script.setAttribute('id',url);
  script.setAttribute('src',url);
  script.onload = script.onreadystatechange = function() {
    if (script.readyState && script.readyState != 'complete' && script.readyState != 'loaded') return;
    script.onload = script.onreadystatechange = null;
    if (callback) callback();
  }
  try {
    document.getElementsByTagName('head')[0].appendChild(script);
  }
  catch(err) {
    document.body.appendChild(script);
  }
}

function _listPages(linklist,wikiURL) {
  linklist.sort( function(a,b) {
    var aa = a[0].toLowerCase();
    var bb = b[0].toLowerCase();
    if (aa < bb) return -1;
    if (aa > bb) return 1;
    return 0;
  });

  var head = '<h2>Page Index</h2>';
  if (wikiURL)
    head += '<p>Showing the page index for the wiki at: <a href="' + wikiURL + '">' + wikiURL + '</a></p>';
  var html = '';
  var table = '<table><tr>';

  var prev = ' ';
  for (var i=0; i < linklist.length; i++) {
    var pg = linklist[i][0];
    var me = pg.charAt(0).toUpperCase();
    if (me != prev) {
      if (prev != ' ')
        html += '<p style="text-align:right"><a href="#" onclick="return top()">Top</a></p>';
      prev = me;
      table += '<td><a href="#anchor-' + me + '">' + me + '</a></td>';
      html += '<a name="anchor-' + me + '"></a><h3>' + me + '</h3>'
    }
    var lk = wikiURL + linklist[i][1];
    html += '<a href="' + lk + '">' + pg + '</a><br />';
  }
  table += '</tr></table>';
  html += '<p style="text-align:right"><a href="#" onclick="return top()">Top</a></p>';
  document.getElementById('AllLinks').innerHTML = head + table + html;
}

widget.listPages = function(wikiURL) {
  document.write('<div id="AllLinks"></div>');
  if (wikiURL) {
    widget.attachJsNode(wikiURL + '/links.php',function() {
      _listPages(tinyMCELinkList,wikiURL)
    });
  } else {
    widget.attachJsNode('links.php',function() {
      _listPages(tinyMCELinkList)
    });
  }
}

widget.siteMap2 = function(maxLinks,makeWords,hideSidebars) {
   if (!hideSidebars) hideSidebars = false;
   var title = '<span class="siteMapTitle">SiteMap</span>';
   var pcid = 'siteMap_' + widget.genKey(10);
   var siteMapText = title;
   document.write('<div class="siteMap" id="' + pcid + '">' + title + '</div>');
   siteMapText += '<div class="siteMapBody"><ul>';
   for (var i=0; i<tinyMCELinkList.length; i++) {
      if (i>maxLinks) {
        break;
      }
      var linkText = tinyMCELinkList[i][0];
      if (hideSidebars) {
         if (linkText.indexOf('SideBar') != -1) { continue; }
         if (linkText.indexOf('QuickStart') != -1) { continue; }
         if (linkText.indexOf('RecentActivity') != -1) { continue; }
      }
      if (makeWords) {
         linkText = linkText.replace(/([A-Z]+)/g," $1")
      }
      var link = '<a href="' + encodeURI(tinyMCELinkList[i][1]) + '">' + linkText + '</a>';
      siteMapText += '<li>' + link + '</li>';
   }
   siteMapText += '</ul></div>';
   document.getElementById(pcid).innerHTML = siteMapText;
   widget.log('siteMap2');
}

widget.siteMap = function(maxLinks,makeWords) {
   var title = '<h2>SiteMap</h2>';
   var pcid = 'siteMap_' + widget.genKey(10);
   document.write('<div id="' + pcid + '" class="toc">' + title + '</div>');
   document.getElementById(pcid).innerHTML += '<ul>';
   for (var i=0; i<tinyMCELinkList.length; i++) {
      if (i>maxLinks) {
        break;
      }
      var linkText = tinyMCELinkList[i][0];
      if (makeWords) {
         linkText = linkText.replace(/([A-Z]+)/g," $1")
      }
      var link = '<a href="' + encodeURI(tinyMCELinkList[i][1]) + '">' + linkText + '</a>';
      document.getElementById(pcid).innerHTML += '<li>' + link + '</li>';
   }
   document.getElementById(pcid).innerHTML += '</ul>';
   widget.log('siteMap');
}

widget.addPILink = function(label,url,js) {
  widget.onDocLoad(
    function() {   
      if (!js) js=''; 
      var temp = document.getElementById('page-information').getElementsByTagName('ul');
      temp[0].innerHTML = temp[0].innerHTML + '<li><a '+ js + ' href="' + url + '"><span>' + label + 
                          '</span></a></li>';
    }
  );
}

//addButton
widget.addButton = function(label,url,js) {
  if (!js) js=''; 
  var temp = document.getElementById('wrapper-functional').getElementsByTagName('ul');
  temp[0].innerHTML = temp[0].innerHTML + '<li><a '+ js + ' href="' + url + '"><span>' + label + '</span></a></li>';
  widget.log('addButton');
}

widget.hideButton = function(buttonText) {
  var temp = document.getElementById('wrapper-functional').getElementsByTagName('li');
  for (var i=0;i<temp.length;i++) {
    if (temp[i].getElementsByTagName('span')[0].innerHTML.indexOf(buttonText) != -1) {
      temp[i].style.display = 'none';
    }
  }
  widget.log('hideButton');
}

widget.renameButton = function(oldText,newText) {
  var temp = document.getElementsByTagName("span");
  for (var i=0;i<temp.length;i++) {
    if (temp[i].innerHTML == oldText) {
      temp[i].innerHTML = newText;
    }
  }
  widget.log('renameButton');
}

widget.redirectButton = function(oldURL,newURL) {
  var temp = document.getElementsByTagName("a");
  for (var i=0;i<temp.length;i++) {
    if (temp[i].href.indexOf(oldURL) > -1) {
      temp[i].href = newURL;
    }
  }
  widget.log('redirectButton');
}

/********************************************************************
A few general functions, all useful in their own ways
*********************************************************************/

//returns the viewing window dimensions in form [width,height]
widget.winSize = function() {
   if (window.innerWidth) return [window.innerWidth, window.innerHeight];
   if (document.documentElement && document.documentElement.clientWidth)
      return [document.documentElement.clientWidth, document.documentElement.clientHeight];
   return [document.body.clientWidth, document.body.clientHeight];
}

//gets all elements by tag name in object obj
//tags can be a comma-delimited list
widget.getElementsByTagNames = function(tags,obj) {
   if (!obj) obj=document;
   tags = tags.split(',');
   var results = new Array();
   for (var i=0;i<tags.length;i++) {
      var t = obj.getElementsByTagName(tags[i]);
      for (var j=0;j<t.length;j++) {
         results[results.length] = t[j];
      }
   }
   if (results.length==0) return [];
   if (results[0].sourceIndex) results.sort(function (a,b) {
      return a.sourceIndex - b.sourceIndex;
   });
   else if (results[0].compareDocumentPosition) results.sort(function (a,b) {
      return 3 - (a.compareDocumentPosition(b) & 6)
   });
   return results;
}

//same, just by class
//optionally, you can also specify a tag list
widget.getElementsByClassNames = function(classes,obj,tags) {
   if (!obj) obj=document;
   if (!tags) tags='*';
   var t = widget.getElementsByTagNames(tags,obj); //ordered list of all tags
   var results = new Array();
   classes=classes.split(',');
   for (var i=0;i<t.length;i++) {
      for (var j=0;j<classes.length;j++) {
         if (t[i].className==classes[j])
            results[results.length] = t[i];
      }
   }
   return results;
}

//return element position as a [x,y]
widget.getElemPos = function(elem) {
   var x = 0;
   var y = 0;
   if (elem.offsetParent) {
      x = elem.offsetLeft;
      y = elem.offsetTop;
      while (elem = elem.offsetParent) {
         x += elem.offsetLeft;
         y += elem.offsetTop;
      }
   }
   return [x,y];
}

widget.getexpirydate = function(nodays){
  var UTCstring;
  Today = new Date();
  nomilli=Date.parse(Today);
  Today.setTime(nomilli+nodays*24*60*60*1000);
  UTCstring = Today.toUTCString();
  return UTCstring;
}

widget.getcookie = function(cookiename) {
  var cookiestring=""+document.cookie;
  var index1=cookiestring.indexOf(cookiename);
  if (index1==-1 || cookiename=="") return ""; 
  var index2=cookiestring.indexOf(';',index1);
  if (index2==-1) index2=cookiestring.length; 
  return unescape(cookiestring.substring(index1+cookiename.length+1,index2));
}

widget.setcookie = function(name,value,duration){
  cookiestring=name+"="+escape(value)+";EXPIRES="+widget.getexpirydate(duration);
  document.cookie=cookiestring;
  if(!widget.getcookie(name)){
    return false;
  }
  else{
    return true;
  }
}

widget.setCrumbs = function() {
  var crumbs = widget.getcookie('crumbs');
  var page = widget.pageName;
  var z = ';' + page;
  var x = crumbs.indexOf(z);
  var zl = z.length;
  var cl = crumbs.length;
  if (page == 'FrontPage') {
    crumbs = page;
  }
  else if (page == 'SideBar' || page == 'QuickStart') {
    return;
  }
  else if (x == -1) {
    crumbs += z;
  }
  else if (x+zl == cl) {
    return;
  }
  else {
    crumbs = crumbs.substr(0,x+zl);
  }
  widget.setcookie('crumbs',crumbs,1);
}

widget.showCrumbs = function() {
  widget.setCrumbs();
  var crumbs = widget.getcookie('crumbs');
  var wiki = 'http://' + widget.wikiRoot;
  crumbs = crumbs.split(';');
  var crumbText = '<div style="border:1px solid #cccccc; padding:3px; margin:0px 15px">';
  for (var i=0;i<crumbs.length;i++) {
    page = crumbs[i];
    crumbText += '<a href="'+wiki+'/'+page+'">'+unescape(decodeURI(page))+'</a>';
    if (i<(crumbs.length-1)) {
      crumbText += ' > ';
    }
  }
  crumbText += '</div>';
  var cdiv = document.createElement('div');
  cdiv.innerHTML = crumbText;
  var dc = document.getElementById('displaycontent');
  dc.insertBefore(cdiv,dc.firstChild);
  widget.log('showCrumbs');
}


/********************************************************************
This following bit of code sets widget.docIsLoaded=true when the page
is completed loading, without waiting for all dependents (images).
If no other methods work, then it resorts to the normal onload event
*********************************************************************/

widget.docIsLoaded = false;
widget.setDocLoaded = function() { widget.docIsLoaded = true; }

if (document.addEventListener) { //try in mozilla first
   document.addEventListener("DOMContentLoaded", widget.setDocLoaded, false);
   document.addEventListener("load", widget.setDocLoaded, false);  //just in case;
}
else if (window.attachEvent) {  //IE (in case the hack below doesn't work)
   window.attachEvent('onload',widget.setDocLoaded);
}
else {                         //when all else fails
   window.onload = widget.setDocLoaded;
}

//This IE-only portion from dean.edwards.name/weblog/2005/09/busted/
//The gist: IE scripts marked "defer" do not get loaded until the end
//          read the onreadystatechange event of the script to know
//          when your document is loaded
/*@cc_on @*/
/*@if (@_win32)
document.write("<sc"+"ript id=__ie_onload defer src=javascript:void(0)></scr"+"ipt>");
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
    if (this.readyState == "complete") {
        widget.setDocLoaded(); // call the onload handler
    }
};
/*@end @*/

/**********************************************************************
A substitute for window.onload that just waits for the DOM to complete
loading (no images or other dependents)
**********************************************************************/
widget.onDocLoad = function(handler) {   //handler is some function that you want called
   if ( widget.docIsLoaded ) handler();
   else { window.setTimeout(function() { widget.onDocLoad(handler) },250); }
}



/****LOGGING FUNCTION--COMMENTED OUT***********************************
if (typeof widgetNotLogged=='undefined') widget.onDocLoad(function() {
  window.setTimeout(function() {
    var wiki=location.href.split('://')[1].split('.pbwiki')[0];
    if (widget.allLogged.length!=0)
      frames['log'].location.replace('http://widget.yourpbwiki.com/widgetlog.php?wiki=' + wiki + '&func=' + escape(widget.allLogged));
  },1000);
});
**********************************************************************/


/***********************************************************
The function below installs a display toggle function.

Use:
widget.installToggle(toggleObj,controlObj,togInner,styleStates,returnState);
***********************************************************/

// Internal function - not logged
widget._installToggle = function(toggleObj,controlObj,togInner,styleStates,returnState) {
   if (!toggleObj || !controlObj) return false;
   if (typeof toggleObj=='string') toggleObj = document.getElementById(toggleObj);
   if (typeof controlObj=='string') controlObj = document.getElementById(controlObj);
   if (!styleStates) styleStates = 'block|none';
   if (!togInner) togInner = 'Hide|Show';
   if (!returnState) returnState=false;

   controlObj.styleStates = styleStates;
   controlObj.togInner = togInner;
   controlObj.toControl = toggleObj;
   controlObj.onclick = function() {
      var styleStates = this.styleStates.split('|');
      var togInner = this.togInner.split('|');   
      if (this.toControl.style.display==styleStates[0]) {
         this.toControl.style.display = styleStates[1];
         this.innerHTML = togInner[1];
      } else {
         this.toControl.style.display = styleStates[0];
         this.innerHTML = togInner[0];
      }
      return this.returnState;
   }
   controlObj.returnState = returnState;

   toggleObj.style.display = styleStates.split('|')[0];
   controlObj.innerHTML = togInner.split('|')[0];

   return true;
}

// External function - call is logged
widget.installToggle = function(toggleObj,controlObj,togInner,styleStates,returnState) {
   widget._installToggle(toggleObj,controlObj,togInner,styleStates,returnState);
  widget.log('installToggle');
}


/**********************************************************************
On page load, scans the page for any div elements that are tocs and creates
a show/hide link for each of them.
Usage: toggleToc();
**********************************************************************/
widget.toggleToc = function(startHidden) {
   var hidden=false;
   if (typeof startHidden!= 'undefined')
      hidden = startHidden;
   if (!widget.docIsLoaded) {
      window.setTimeout(function () {
         widget.toggleToc(hidden)
      },500);
      return;
   }
   var elems = widget.getElementsByClassNames('toc',document.body,'div');
   for (var i=0 ; i<elems.length ; i++) {
      var link = document.createElement('a'); 
      link.href='#';
      link.className = 'tocTitle';
      elems[i].insertBefore(link,elems[i].firstChild);
      var al = elems[i].getElementsByTagName('a')[0];
      al.style.textAlign = 'center';
      al.style.fontSize = 'smaller';
      al.style.fontWeight = 'bold';
      al.style.display = 'block';
      al.style.marginRight = '15px';
      if (hidden) widget._installToggle( elems[i].getElementsByTagName('ol')[0],link, 'Contents (show)|Contents (hide)','none|block',false);
      else  widget._installToggle( elems[i].getElementsByTagName('ol')[0],link, 'Contents (hide)|Contents (show)','block|none',false);
   }
  widget.log('toggleToc');
}

/**************************************************************
toggle the giant PBwiki footer
**************************************************************/

widget.hideFooter = function() {
   widget.onDocLoad(function() {   
      if (location.href.indexOf('raw=bare')!=-1) return;
      var e = document.getElementById('f-menu');
      if (!e) return;
      var link = document.createElement('a');
      e.insertBefore(link,e.firstChild);
      e.firstChild.name = 'TheVeryBottom'
      e.firstChild.href= '#TheVeryBottom'
      var obj = document.getElementById('wiki-information').parentNode.parentNode.parentNode;
      widget._installToggle(obj,e.firstChild,'Show Footer|Hide Footer','none|block',true);
   });
  widget.log('hideFooter');
}


/***************************************************
returns a basic XMLHttpRequest object; cross-browser compatible
***************************************************/
widget.getXmlHttpObject = function() { 
  var objXMLHttp=null;
  if (window.XMLHttpRequest) objXMLHttp=new XMLHttpRequest();
  else if (window.ActiveXObject) objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
  return objXMLHttp;
}


/****************************************************
This neat little function allows you to include another
wiki page:
pageName = name of page
obj = element to append to (optional)
mode = "replace","prepend", or "append" (optional)
****************************************************/
widget.includePage = function(pageName,obj,mode) {
   if (!obj) {
      var theId = 'WidgetIncluded' + escape(pageName);
      document.write('<div id="' + theId + '"><blink>loading page...</blink></div>');
      obj = document.getElementById(theId);
   }
   else if (typeof obj == 'string') {
      obj = document.getElementById(obj);
   }
   if (!mode) mode='replace';
   var xmlHttp=widget.getXmlHttpObject();
   if (xmlHttp==null) {
      document.getElementById(theId).innerHTML = 'Cannot load page <i>' + pageName + '</i> in this browser.';
      return false;
   }
   xmlHttp.onreadystatechange=function() { widget.includePageHandler(xmlHttp,obj,mode) };
   xmlHttp.open("GET",pageName + "?raw=bare",true);  //if no data, then GET
   xmlHttp.send(null);
   widget.log('includePage');
   return true;
}

widget.includePageHandler = function(xmlHttp,obj,mode) {
   if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
      var temp = document.createElement('div');
      temp.innerHTML = xmlHttp.responseText;
      if (temp.getElementsByTagName('div')[0].id == 'wrapper-root')
         temp.innerHTML = 'Error in widget.includePage() - Page does not exist';
      else temp = temp.getElementsByTagName('div')[2];
      switch(mode) {
         case 'replace':
            obj.innerHTML = temp.innerHTML;
            break;
         case 'prepend':
            obj.innerHTML = temp.innerHTML + obj.innerHTML;
            break;
         case 'append':
            obj.innerHTML += temp.innerHTML;
            break;
      }
      var anch = document.location.href.split('#');
      if (anch.length==2) document.location.href = '#' + anch[1];
   }
}


/*****************************************************
returns true if logged in, false if not
******************************************************/

widget.loggedIn = function() {
   if ( document.getElementById('sub-menu-right').getElementsByTagName('a')[0].innerHTML=='Log in' )
      return false;
   return true;
}

/*****************************************************
Silently logs-in anyone visiting a wiki using the
access # from the magic URL
******************************************************/

widget.autoLogin = function(magicID) {
   if (!widget.loggedIn()) {
      var url=document.location.href;
      if ( url.indexOf('?')!=-1 ) document.location.href += '&aph=' + magicID;
      else document.location.href += '?aph=' + magicID;
   }
}

/******************************************************
a bunch of crazy stuff
******************************************************/

widget.url = document.location.href;
widget.wikiRoot = widget.url.split('/')[2];
widget.wikiName = widget.wikiRoot.split('.')[0];
widget.pageName = widget.url.split('/')[3];
if (document.getElementById('wrapper-functional')) {
   widget.pageName = document.getElementById('wrapper-functional').getElementsByTagName('li')[1].getElementsByTagName('a')[0].href.split('/')[3];
}
if (!widget.pageName) widget.pageName = 'FrontPage';
widget.pageName = widget.pageName.split('?')[0].split('#')[0];

widget.inSB = function(elem) {
   if (typeof elem=='string') elem=document.getElementById(elem);
   if (!elem || elem.tagName=='BODY') return false;
   if (elem.id=='SideBar' || elem.className=='sidebar_v2')
      return true;
   return widget.inSB(elem.parentNode);
}

widget.getPageName = function(url) {
   if (url.indexOf(widget.wikiRoot)==-1) return '';
   var parts = url.split('?')[0].split('#')[0].split('/');
   if (parts.length<=3 || parts[3]=='') return 'FrontPage';
   if (parts[3]=='f') return '';
   return unescape(parts[3]);
}

//collapsible toc

widget.collapsibleToc = function(elem,bullets,collapseAll) {
   var clickShow, clickHide;
   if (typeof bullets == 'string') {
      clickShow = bullets.split('|')[0];
      clickHide = bullets.split('|')[1];
   }
   else {
      clickShow='+';
      clickHide='-';
   }
   if (typeof elem == 'string') elem = document.getElementById(elem);
   if (!elem) return;
   if (elem.tagName!='OL') elem = elem.getElementsByTagName('ol')[0];
   elem.className = "MegaToc";
   var list = elem.getElementsByTagName('li');
   var curpage = widget.getPageName(location.href);
   for (var i=0;i<list.length;i++) {
      var link = document.createElement('a');
      link.setAttribute('href','#');
      link.innerHTML = clickHide;
      link = list[i].insertBefore(link,list[i].firstChild);
      list[i].firstChild.onclick = function() { return false; };
      list[i].firstChild.className = "MegaTocClick"

      var subitems = list[i].getElementsByTagName('ol');
      var nextNode = list[i].nextSibling;
      while (nextNode && (!nextNode.tagName || !(nextNode.tagName=='LI' || nextNode.tagName=='OL'))) {
         nextNode = nextNode.nextSibling;
      }
      if (nextNode && nextNode.tagName=='OL') {
         //PBwiki's current f***ed up lists
         widget._installToggle(nextNode,list[i].firstChild,clickShow + '|' + clickHide,'none|block');
      }
      else if (subitems.length>0) {
         //contigency plan in case they fix it (actually IE auto-fixes it)
         widget._installToggle(subitems[0],list[i].firstChild,clickShow + '|' + clickHide,'none|block');
      }
      else {
         list[i].firstChild.style.visibility = "hidden";
      }
      //select if current page is in toc
      var loc = list[i].getElementsByTagName('a');
      if (loc[1] && loc[1].className!='ignore' && collapseAll!=true) {
         if (curpage == widget.getPageName(loc[1].href)) {
            loc[1].className = "MegaTocSelected";
            var cur = list[i].parentNode;
            while (cur!=elem) {
               if (cur.tagName && cur.tagName=='LI')
                  cur.getElementsByTagName('a')[0].innerHTML = clickHide;
               if (cur.tagName && cur.tagName=='OL') {
                  cur.style.display = 'block';
                  while (cur.previousSibling && (!cur.tagName || cur.tagName=='OL')) {
                     cur = cur.previousSibling;
                  }
               }
               else cur = cur.parentNode;
            }
         }
      }

   }
   widget.log('collapsibleToc');
}

//Michael's pagecount function

widget.keychrs = '0123456789';

widget.random_character = function() {
 return widget.keychrs.charAt(Math.floor(Math.random() * widget.keychrs.length));
}

widget.genKey = function(keysize) {
  var keyval = '';
  for (var i = 0; i < keysize; i++) {
    keyval += widget.random_character(widget.keychrs);
  }
  return keyval;
}

widget.pageCount = function(pcid) {
   if (typeof pcid != 'string') {
      pcid = 'pageCount' + widget.genKey(10);
   }
   document.write('<span id=' + pcid + '>(loading)</span>');
   var xmlObj = widget.getXmlHttpObject();
   if (!xmlObj) return;
   xmlObj.onreadystatechange = function() {
      if (xmlObj.readyState==4 || xmlObj.readyState=="complete")
         widget.onDocLoad(function() {
            var pt = xmlObj.responseText;
            var t1 = pt.split('sort by [')[0];
            var t2 = t1.split('Showing all ')[1];
            var cnt = t2.split(' pages')[0];
            document.getElementById(pcid).innerHTML = cnt;
         });
   }
   xmlObj.open("GET","AllPages?raw=bare",true);
   xmlObj.send(null);
   widget.log('pageCount');
}

widget.renameSidebar = function(qs_new,ra_new,sb_new) {
   var v1SideBar = document.getElementById('SideBar');
   if (v1SideBar && qs_new) {
      v1SideBar.firstChild.firstChild.innerHTML = qs_new;
   }
   else {
      var sidebartabs = new Array('sb','qs','ra');
      for (var j=0;j<sidebartabs.length;j++) {
         var tabset = document.getElementById('sb_' + sidebartabs[j]);
         if (tabset) {
            var tablist = tabset.getElementsByTagName('ul');
            if (tablist[0].className == "sidebar_v2_menu") {
               var tabs = tablist[0].getElementsByTagName('a');
               for (var i=0;i<tabs.length;i++) {
                  if ((tabs[i].title.indexOf('QuickStart') != -1) && (qs_new)) {
                     tabs[i].innerHTML = qs_new;
                     tabs[i].title = qs_new + ' (Alt-' + tabs[i].getAttribute('accesskey') + ')';
                  }
                  if ((tabs[i].title.indexOf('Recent Activity') != -1) && (ra_new)) {
                     tabs[i].innerHTML = ra_new;
                     tabs[i].title = ra_new + ' (Alt-' + tabs[i].getAttribute('accesskey') + ')';
                  }
                  if ((tabs[i].title.indexOf('SideBar') != -1) && (sb_new)) {
                     tabs[i].innerHTML = sb_new;
                     tabs[i].title = sb_new + ' (Alt-' + tabs[i].getAttribute('accesskey') + ')';
                  }
               }
            }
         }
      }
   }
   widget.log('renameSidebar');
}

var header = new Object();

header.replaceWikiName = function(name) {
   document.getElementById("header").getElementsByTagName('h2')[0].innerHTML = name;
   widget.log('replaceWikiName');
}

header.replacePageName = function(name) {
   document.getElementById("header").getElementsByTagName('h3')[0].innerHTML = name;
   widget.log('replacePageName');
}

header.replaceDivider = function(text) {
   var temp = document.getElementById("header").getElementsByTagName('h3')[0];
   temp.innerHTML = text + ' ' + temp.innerHTML;
   document.getElementById("header").getElementsByTagName('h3')[0].style.border = "0px";
   widget.log('replaceDivider');
}

header.replaceAllText = function(text) {
   document.getElementById("header").getElementsByTagName('h3')[0].innerHTML = '';
   document.getElementById("header").getElementsByTagName('h3')[0].style.border = '0px';
   document.getElementById("header").getElementsByTagName('h2')[0].innerHTML = text;
   widget.log('replaceAllText');
}

header.replaceWithBanner = function(image) {
   document.getElementById("header").getElementsByTagName('h2')[0].innerHTML = 
      '<div style="margin-left:-12px;margin-top:-16px"><img src="'+ image + '"></div>';
   widget.log('replaceWithBanner');
}

header.addLogoImage = function(image) {
   document.getElementById("header").getElementsByTagName('h2')[0].innerHTML = 
      '<div style="margin-left:-12px;margin-top:-16px"><img src="'+ image + '"></div>' + 
      document.getElementById("header").getElementsByTagName('h2')[0].innerHTML;
   widget.log('addLogoImage');
}

header.shortenLongName = function(maxLength) {
   var filename = document.getElementById("header").getElementsByTagName('h3')[0].innerHTML;
   if (filename.length > maxLength) {
      document.getElementById("header").getElementsByTagName('h3')[0].innerHTML = 
         filename.substring(0,maxLength)+ "...";
   }
   widget.log('shortenLongName');
}

header.changeHTML = function(myHTML) {
   document.getElementById("header").innerHTML = myHTML;
   widget.log('changeHTML');
}

/* WIDGET TAG FUNCTIONS */

widget.tags = new Object();
widget.tags.thisPage = null;
widget.tags.all = null;

widget.tags.editor = function() {
  if (!document.getElementById('TagEditor'))
    document.write('<div id="TagEditor">loading tags from this page...</div>');
  var xmlObj = widget.getXmlHttpObject();
  if (xmlObj) {
    var ses = Math.floor(Math.random() * 100000000)
    xmlObj.open("GET","tags.php?page=" + unescape(widget.pageName) + '&ses=' + ses,true);
    xmlObj.onreadystatechange = function() {
      if (xmlObj.readyState == 4) widget.tags.makeEditor1(xmlObj);
    }
    xmlObj.send(null);
  }
}

widget.tags.makeEditor1 = function(xmlObj) {
  var re = /<\/style><h2>.*<\/h2>(.*)/gi
  var wrap = document.createElement('div');
  wrap.innerHTML = re.exec(xmlObj.responseText)[1];
  var links = wrap.getElementsByTagName('a');
  widget.tags.thisPage = new Array();
  for (var i=0; i<links.length; i++) {
    widget.tags.thisPage[i] = links[i].innerHTML;
  }
  document.getElementById('TagEditor').innerHTML = 'loading all tags...';
  var xmlObj = widget.getXmlHttpObject();
  if (xmlObj) {
    var ses = Math.floor(Math.random() * 100000000)
    xmlObj.open('GET','tags.php?ses=' + ses,true);
    xmlObj.onreadystatechange = function() {
      if (xmlObj.readyState == 4) widget.tags.makeEditor2(xmlObj);
    }
    xmlObj.send(null);
  }
}

widget.tags.makeEditor2 = function(xmlObj) {
  var re = /<table>.*<\/table>/gi
  var wrap = document.createElement('div');
  wrap.innerHTML = re.exec(xmlObj.responseText)[0];
  var rows = wrap.getElementsByTagName('tr');
  widget.tags.all = new Array();
  for (var i=0; i<rows.length; i++) {
    var tagName = rows[i].getElementsByTagName('a')[0].innerHTML;
    widget.tags.all[i] = tagName;
  }
  var te = document.getElementById('TagEditor');
  var html = '<div id="tagboxall">';
  var noshow = ' style="display:none;" ';
  for (var i=0; i<widget.tags.all.length; i++) {
    var tag = widget.tags.all[i]
    var alreadyHere = false;
    for (var j=0; j<widget.tags.thisPage.length; j++) {
      if (widget.tags.thisPage[j]==tag) alreadyHere = true;
    }
    if ( alreadyHere || widget.loggedIn() )
       html += '<div id="tagbox' + i + '"><input type="checkbox" onchange="widget.tags.modifyTag(this,' + i + ')" ' + (alreadyHere ? 'checked ' : ' ') + (widget.loggedIn() ? ' ' : noshow ) + ' /><a href="tags.php?ptag=' + escape(tag) + '">' + tag + '</a></div>';
  }
  html += '</div>';
  if ( widget.loggedIn() )
     html += '<div id="addnewtag"><form style="display:inline" onsubmit="widget.tags.addNewTag();return false;"><input type="text" value="add a new tag" onclick="this.value=\'\'" class="addtag" /><input type="submit" value="Add" class="addbtn" /></form></div>';
  te.innerHTML = html;
}

widget.tags.modifyTag = function(obj,id) {
  var addingTag = document.getElementById('tagbox' + id).getElementsByTagName('input')[0].checked;
  var tag = document.getElementById('tagbox' + id).getElementsByTagName('a')[0].innerHTML;
  var xmlObj2 = widget.getXmlHttpObject();
  var ses = Math.floor(Math.random() * 100000000)
  if (addingTag) {
    xmlObj2.open("GET","tags.php?pedit=" + unescape(widget.pageName) + "&add=" + escape(tag) + '&ses=' + ses,true);
    xmlObj2.send(null);
  } else {
    xmlObj2.open("GET","tags.php?pedit=" + unescape(widget.pageName) + "&del=" + escape(tag) + '&ses=' + ses,true);
    xmlObj2.send(null);
  }
}

widget.tags.addNewTag = function() {
  var tag = document.getElementById('addnewtag').getElementsByTagName('input')[0].value;
  var xmlObj2 = widget.getXmlHttpObject();
  var ses = Math.floor(Math.random() * 100000000)
  xmlObj2.open('GET','tags.php?pedit=' + unescape(widget.pageName) + '&add=' + escape(tag) + '&ses=' + ses, true);
  xmlObj2.send(null);
  document.getElementById('addnewtag').getElementsByTagName('input')[0].value = '';
  var i = document.getElementById('tagboxall').getElementsByTagName('div').length;
  document.getElementById('tagboxall').innerHTML += '<div id="tagbox' + i + '" class="new"><input type="checkbox" onchange="widget.tags.modifyTag(this,' + i + ')" checked /><a href="tags.php?ptag=' + escape(tag) + '">' + tag + '</a></div>';
  document.getElementById('tagboxall').scrollTop = document.getElementById('tagboxall').scrollHeight;
}

widget.tags.cloud = function() {
  document.write('<div id="cloudwrap">Loading tag cloud...</div>');
  var xmlObj = widget.getXmlHttpObject();
  if (xmlObj) {
    var ses = Math.floor(Math.random() * 100000000)
    xmlObj.open("GET","tags.php?ses=" + ses,true);
    xmlObj.onreadystatechange = function() {
      if (xmlObj.readyState == 4) widget.tags.makeCloud(xmlObj);
    }
    xmlObj.send(null);
  }
}

widget.tags.makeCloud = function(xmlObj) {
  var re = /<table>.*<\/table>/gi
  var wrap = document.createElement('div');
  wrap.innerHTML = re.exec(xmlObj.responseText)[0];
  var rows = wrap.getElementsByTagName('tr');
  var biggest = 0;

  for (var i=0; i<rows.length; i++) {
    var numlinks = rows[i].getElementsByTagName('td')[1].getElementsByTagName('a').length;
    if (numlinks > biggest) biggest = numlinks;
  }

  var html = '';
  for (var i=0; i<rows.length; i++) {
    var tagname = rows[i].getElementsByTagName('a')[0].innerHTML;
    var taglink = rows[i].getElementsByTagName('a')[0].href;
    var numlinks = rows[i].getElementsByTagName('td')[1].getElementsByTagName('a').length;
    var size = .8 + ( (numlinks / biggest ) * .75 );
    html += '<a href="' + taglink + '" style="font-size:' + size + 'em" title="' + numlinks + ' page' + (numlinks==1? '' : 's')+ '">' + tagname + '</a> ';
  }
  document.getElementById('cloudwrap').innerHTML = html;
}

//quickie way to list pages

widget.quickListPages = function(styles) {
  if (styles) { styles = 'style="' + styles + '"'; }
  else { styles = ''; }
  document.write('<div id="qlp"'+styles+'>Getting pages...</div>');
  var xmlObj = widget.getXmlHttpObject();
  if (xmlObj) {
    var ses = Math.floor(Math.random() * 100000000)
    xmlObj.open("GET","links.php?ses=" + ses,true);
    xmlObj.onreadystatechange = function() {
      if (xmlObj.readyState == 4) {
         eval(xmlObj.responseText);
         tinyMCELinkList.sort(function(a,b) {
            a = a[0].toLowerCase();
            b = b[0].toLowerCase();
            if (a>b) return 1;
            if (b>a) return -1;
            return 0;
         });
         var html = '';
         var link;
         for (var i=0; i<tinyMCELinkList.length; i++) {
            link = tinyMCELinkList[i];
            html += '<a href="' + link[1] + '">' + link[0] + '</a><br />';
         }
         document.getElementById('qlp').innerHTML = html;
      }
    }
    xmlObj.send(null);
  }
}
widget.tags.searchresult = null;
widget.tags.multisearchtags = null;
widget.tags.searchpos = 0;

widget.tags.multisearch = function() {
   document.write('<div id="multitagresult"></div><input type="hidden" id="multitagcount" value="0" /><div id="multitagsearch" style="margin-bottom:50px;"><form action="" method="GET"><div id="multitaginputwrap"></div><div><input type="submit" value="Search!" /><input type="button" onclick="widget.tags.newInput();" value="Add field.." /></div></form></div>');
   widget.tags.newInput();
   widget.onDocLoad(function() {
      var box = document.createElement('div');
      box.setAttribute('id','multitaglist');
      box.setAttribute('style',"position:absolute; height:200px; width:200px; top: 0px; left:0px; overflow:auto; background: white; padding:2px; border:1px solid #ccc; z-index:200;display:none");
      if (document.getElementById('wrapper-root')) box = document.getElementById('wrapper-root').appendChild(box);
      else box = document.body.appendChild(box);
      box.style.position = 'absolute';
      box.style.height = '200px';
      box.style.width = '200px';
      box.style.top = '0px';
      box.style.left = '0px';
      box.style.overflow = 'auto';
      box.style.background = 'white';
      box.style.padding = '2px';
      box.style.border = '1px solid #ccc';
      box.style.display = 'none';
      var xmlObj = widget.getXmlHttpObject();
      if (xmlObj) {
         var ses = Math.floor(Math.random() * 100000000)
         xmlObj.open("GET","tags.php?ses=" + ses,true);
         xmlObj.onreadystatechange = function() {
            if (xmlObj.readyState == 4) widget.tags.multilist(xmlObj);
         }
         xmlObj.send(null);
      }
   });
   var params=document.location.href.split('#')[0].split('?');
   if (params[1]) {
      params = params[1].split('&');
      widget.tags.searchresult = new Array();
      widget.tags.multisearchtags = new Array();
      widget.tags.searchpos = 0;
      for (var i=0;i<params.length;i++) {
         var temp = params[i].split('=')[0].split('-')[0];
         if (temp=='tag') {
            widget.tags.multisearchtags[widget.tags.multisearchtags.length] = unescape(params[i].split('=')[1]);
         }
      }
      if (widget.tags.multisearchtags.length>0) {
         document.getElementById('multitagresult').innerHTML = '<strong>Searching...</strong><hr />';
         widget.tags.searchthread();
      }
   }
}


widget.tags.multilist= function(xmlObj) {
  var re = /<table>.*<\/table>/gi
  var wrap = document.createElement('div');
  wrap.innerHTML = re.exec(xmlObj.responseText)[0];
  var rows = wrap.getElementsByTagName('tr');
  var html = '<a href="#" style="display:block; text-decoration:none; font-weight:bold; height:20px;" onmouseover="this.style.background=\'#ddddff\';" onmouseout="this.style.background=\'#ffffff\';" onclick="document.getElementById(\'multitaglist\').style.display=\'none\'; return false;">[Select None]</a> ';
  for (var i=0; i<rows.length; i++) {
    var tagname = rows[i].getElementsByTagName('a')[0].innerHTML;
    var taglink = rows[i].getElementsByTagName('a')[0].href;
    html += '<a href="#" style="display:block; text-decoration:none; height:20px;" onmouseover="this.style.background=\'#ddddff\';" onmouseout="this.style.background=\'#ffffff\';" onclick="widget.tags.multilistput(this); return false;">' + tagname + '</a> ';
  }
  var tryheight = (rows.length*20)+21;
  if (tryheight>200) tryheight = 200;
  document.getElementById('multitaglist').innerHTML = html;
  document.getElementById('multitaglist').style.height = tryheight + 'px';
}

widget.tags.multilistput = function(obj) {
   document.getElementById('tag-'+document.getElementById('multitaglist').currentPos).value = obj.innerHTML;
   document.getElementById('multitaglist').style.display= 'none';
}

widget.tags.multiselect = function(pos) {
   var elem = document.getElementById('tag-'+pos);
   var box = document.getElementById('multitaglist');
   var pos1 = widget.getElemPos(elem);
   var pos2 = widget.getElemPos(box.parentNode);
   box.style.left = (pos1[0]-pos2[0]) + 'px';
   box.style.top = ((pos1[1]-pos2[1])+25) + 'px';
   box.style.display = 'block';
   document.getElementById('multitaglist').currentPos = pos;
}

widget.tags.searchthread = function() {
  var xmlObj = widget.getXmlHttpObject();
  if (xmlObj) {
    var ses = Math.floor(Math.random() * 100000000)
    xmlObj.open("GET","tags.php?ptag=" + widget.tags.multisearchtags[widget.tags.searchpos] + '&ses=' + ses,true);
    xmlObj.onreadystatechange = function() {
      if (xmlObj.readyState == 4) {
        widget.tags.searchthread2(xmlObj);
      }
    }
    xmlObj.send(null);
  }
}


widget.tags.searchthread2 = function(txt) {
  var wrap = document.createElement('div');
  var inner = txt.responseText.replace(/[\s\S]*?\/style>/i,'');
  inner = inner.replace(/<hr \/>[\s\S]*/i,'');
  wrap.innerHTML = inner;
  var links = wrap.getElementsByTagName('li');
  if (widget.tags.searchpos==0) {
    for (var i=0;i<links.length;i++) {
      widget.tags.searchresult[i] = links[i].getElementsByTagName('a')[0].innerHTML;
    }
  } else {
    var newresults = new Array();
    for (var i=0;i<links.length;i++) {
      var keep=false;
      for (var j=0;j<widget.tags.searchresult.length;j++) {
        if (widget.tags.searchresult[j]==links[i].getElementsByTagName('a')[0].innerHTML) keep=true;
      }
      if (keep) newresults[newresults.length] = links[i].getElementsByTagName('a')[0].innerHTML;
    }
    widget.tags.searchresult = newresults;
  }
  var code = '<div id="multisearchstatus" style="font-weight:bold">Searching...pass '+(widget.tags.searchpos+1)+ ' of '+widget.tags.multisearchtags.length+': ';
  for (var i=0;i<=widget.tags.searchpos;i++) {
    code += widget.tags.multisearchtags[i];
    if (i<widget.tags.searchpos) code += ', ';
  }
  code += '</div> <ul>';
  for (var i=0;i<widget.tags.searchresult.length;i++) {
    var tmplnk = widget.tags.searchresult[i];
    code+='<li><a href="'+tmplnk+'">'+tmplnk+'</a></li>';
  }
  code += '</ul> <hr />';
  document.getElementById('multitagresult').innerHTML = code;
  widget.tags.searchpos++;
  if (widget.tags.searchpos<widget.tags.multisearchtags.length) {
    window.setTimeout(widget.tags.searchthread,100);
  } else {
    var numres = widget.tags.searchresult.length;
    var tmpcode = 'Search complete ('+numres+' result'+(numres==1 ? '' : 's')+') [Query: ';
    for (var i=0;i<widget.tags.multisearchtags.length;i++) {
      var tag = widget.tags.multisearchtags[i];
      tmpcode += '<a href="tags.php?ptag='+tag+'">'+tag+'</a>';
      if (i+1<widget.tags.multisearchtags.length) tmpcode += ', ';
    }
    tmpcode += ']';
    document.getElementById('multisearchstatus').innerHTML = tmpcode;
  }
}

widget.tags.newInput = function() {
   var div = document.createElement('div');
   var newsize = parseInt(document.getElementById('multitagcount').value)+1;
   document.getElementById('multitagcount').value = newsize;
   div.setAttribute('id','tag-'+newsize+'-wrap');
   var html = '<input type="button" value="..." onclick="widget.tags.multiselect('+newsize+')" /><input type="text" name="tag-'+newsize+'" id="tag-'+newsize+'" value="" style="width:200px;height:20px;" /> <a id="multitagremove-'+newsize+'" href="#" onclick="widget.tags.multiRemoveField('+newsize+');return false;">Remove field</a>';
   div.innerHTML = html;
   document.getElementById('multitaginputwrap').appendChild(div);
   if (newsize>2) {
     document.getElementById('multitagremove-'+parseInt(newsize-1)).style.display='none';
   }
   document.getElementById('multitagremove-1').style.display='none';
}

widget.tags.multiRemoveField = function(num) {
   document.getElementById('multitaginputwrap').removeChild(document.getElementById('tag-'+num+'-wrap'));
   var newsize = document.getElementById('multitagcount').value - 1;
   document.getElementById('multitagcount').value = newsize;
   if (newsize!=1)
   document.getElementById('multitagremove-'+newsize).style.display='inline';
}

widget.pageToc = function(sbdiv,hideToc) {
   widget.onDocLoad(
      function() {
         var SBdiv = document.getElementById(sbdiv);
         if (SBdiv) {
            var pagetoc = widget.getElementsByClassNames('toc');
            for (var i = 0; i < pagetoc.length; i++) {
               if (pagetoc[i]) {
                  SBdiv.innerHTML += pagetoc[i].innerHTML;
                  if (hideToc) {
                     pagetoc[i].style.display = 'none';
                  }
               }
            }
            if (!SBdiv.className && SBdiv.innerHTML) {
               SBdiv.className = 'toc';
            }
         }
         var br = document.createElement('br');
         br = SBdiv.parentNode.insertBefore(br,SBdiv.nextSibling);
         br.style.clear = "left";
      }
   );
   widget.log('pageToc');
}

function setOnLoad() {
//	alert(document.getElementById('module:sidebar').innerHTML);
//	document.getElementById('module:sidebar').innerHTML = document.getElementById('module:sidebar').innerHTML.replace(/<H3>Sidebar/,"<H3>Table of Contents");
//	alert(document.getElementById('module:sidebar').innerHTML);
//	var tabset = document.getElementById('module:sidebar');
//	alert(tabset.innerHTML);
//	var tablist = tabset.getElementsByTagName('h3');
//	alert(tablist.innerHTML);
//	tablist.innerHTML = "Table of Contents";
	widget.pageToc('sbtoc',true);
//	widget.renameSidebar('Table of Contents');
//	widget.collapsibleToc("sbtoc","+|-",true);
}

widget.onDocLoad(setOnLoad);
