Misplaced Pages

User:Lupin/popups.js

Article snapshot taken from Wikipedia with creative commons attribution-sharealike license. Give it a read and then ask your questions in the chat. We can research this topic together.
< User:Lupin

This is an old revision of this page, as edited by Lupin (talk | contribs) at 17:37, 25 September 2005 (new features: shortcut keys, disambiguation fixing). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Revision as of 17:37, 25 September 2005 by Lupin (talk | contribs) (new features: shortcut keys, disambiguation fixing)(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump.
This code will be executed when previewing this page.
This user script seems to have a documentation page at User:Lupin/popups.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Misplaced Pages:Bypass your cache.
var popupVersion="Sun Sep 25 13:14:45 EDT 2005";
// CONTENTS
// Utility functions
// Popup stuff
//   global variables 
//   html generation 
//   downloading 
//   link generation 
//   manipulation functions 
//   tests 
//   actions 
//   thingies 
////////////////////////////////////////////////////////////////////
// Utility functions
////////////////////////////////////////////////////////////////////
function time() {
  var d=new Date();
  return d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() +
    '.' + (d.getTime() % 1000);
};
var gMsg='';
function log(x) { if(gMsg!='')gMsg += '\n'; gMsg+=time() + ' ' + x; };
function myalert(x) { return alert(time()+'\n'+ x); };
////////////////////////////////////////////////////////////////////
// Popup stuff
////////////////////////////////////////////////////////////////////
// livepreview uses a broken hex_md5 function, so we avoid it
function md5_hex(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); };
/////////////////////
// GLOBAL VARIABLES //
//////////////////////
// regexes
var exceptions=RegExp('((title=|/)Special:|section=)') ;
var contributions=RegExp('(title=|/)Special:Contributions(&target=|/|/User:)(.*)') ;
var emailuser=    RegExp('(title=|/)Special:Emailuser' +'(&target=|/|/User:)(.*)') ;
var talk=RegExp('Talk:', 'i') ;
//                      (^|\]* ]) * 
//                      (^|\]* ])(]*(+) *px)?
//                                                        $4 = 120 as in 120px
var imageRegex= RegExp('(^|\\]* ])(]*(+) *px)?',
                       'img') ;
var imageRegexBracketCount = 4;
var categoryRegex= RegExp('\\]* ]) *', 'i') ;
var categoryRegexBracketCount = 1;
var stubRegex= RegExp('stub|This .*-related article is a .*stub', 'im') ;
var disambigRegex= 
  RegExp('(disambig|disambig|dab)' +
         '|is a .*disambiguation.*page', 'im') ;
var ipUserRegex=RegExp('(User:)?' + 
                       '((25|2|1||)\\.){3}' + 
                       '(25|2|1||)');
var oldidRegex=RegExp('oldid=(*)');
var splitLoc=window.location.href.split('/');
var thisWiki=splitLoc;
var wikimediaWiki=RegExp('wiki\(edia\|source\|books\)\.org\|wiktionary\.org').test(thisWiki);
var localWiki=RegExp('^localhost').test(thisWiki);
var protocol=splitLoc.split(':');
var titletail='/index.php?title=';
if (wikimediaWiki) titletail = '/w' + titletail;
else if (localWiki) titletail = '/wiki' + titletail;
// eg sourceJS('http://www.bosrup.com/web/overlib/overlib.js');
function sourceJS(url) {
  var str='<script type="text/javascript" src="';
  str += url;
  str += '"></script>';
  return document.write(str);
};
// eg sourceWikipediaJS('en.wikipedia.org', 'User:Lupin/overlib.js');
function sourceWikipediaJS(wiki, name) {
  var url='http://' + wiki + titletail;
  url += name;
  url += '&action=raw&ctype=text/javascript&dontcountme=s';
  return sourceJS(url);
};
// eg sourceLupinJS('overlib');
function sourceLupinJS(name) {
  return sourceWikipediaJS('en.wikipedia.org', 'User:Lupin/'+name + '.js');
};
// /REGEX
// we're not set up for interwiki stuff yet - only affect en, commons 
// and wiktionary links
var reStart='*://';
var preTitles='wiki/|w/index\\.php\\?title=';
if (!wikimediaWiki) {
  preTitles = 'wiki/index\\.php\\?title=|wiki/index\\.php/|'+preTitles
    + '|index\\.php\\?title=' ;
}
var reEnd='/(' + preTitles + ')(*)';
var re = RegExp(reStart + thisWiki.split('.').join('\\.') + reEnd);
var titlebase=protocol+'://'+thisWiki+titletail;     
var wikibase=protocol+'://'+thisWiki+'/';
var popupImageSize=60;
var imageSources=new Array ();
var commonsWiki='commons.wikimedia.org';
// frequently seen thumbs
imageSources.push(
   {wiki: thisWiki, thumb: true,  width: 180}, // default
   {wiki: thisWiki, thumb: true,  width: 120} // gallery
 );
// frequently seen thumbs on commons
if (wikimediaWiki && thisWiki!=commonsWiki) {
  imageSources.push(
    {wiki: commonsWiki, thumb: true,  width: 180},
    {wiki: commonsWiki, thumb: true,  width: 120}
  );
}
// unusual thumb sizes and full-size
imageSources.push(
   {wiki: thisWiki, thumb: true,  width: 200}, // common?
   {wiki: thisWiki, thumb: true,  width: 250}, // common?
   {wiki: thisWiki, thumb: true,  width: 300},
   {wiki: thisWiki, thumb: true,  width: 210},
   {wiki: thisWiki, thumb: true,  width: 230},
   {wiki: thisWiki, thumb: false, width: 0} // no comma
);
// full-size on commons
if (wikimediaWiki && thisWiki!=commonsWiki) {
  imageSources.push({wiki: commonsWiki, thumb: false, width: 0});
}
// downloading images are put here
var imageArray=new Array();
// page caching
var gCachedPages = new Array ();
var gImageCache = new Array();
// FIXME what is this for?
var gImage=null; // global for image
// check to see if images are done with this timer
var popupImageTimer=null;
// misc debug messages
var popupDebug=null;
// These are for checkImages()
var counter=0;
var checkImagesTimer=null;
var loopcounter=0;
// ids change with each popup: popupImage0, popupImage1 etc
var popupImageId=0;
var kateBase='http://kohl.wikimedia.org/~kate/cgi-bin/count_edits' 
             + '?dbname='
switch(thisWiki) {
 case commonsWiki: kateBase += 'commonswiki';
   break;
 case  'en.wiktionary.org': kateBase += 'enwiktionary';
   break;
 default: kateBase += 'enwiki';
}
kateBase += '&user=';
// for myDecodeURI
var decodeExtras = new Array ();
decodeExtras.push ( 
  {from: '%2C', to: ',' },
  {from: '_',   to: ' ' },
  {from: '%26',   to: '&' } // no ,
);
// for setPopupHTML - needed for timers and stuff
var popupHTMLTimers=new Array();
var popupHTMLLoopFunctions = new Array();
// FIXME - eliminate this
var redirCount=0;
// Cookie handling
// pasted straight from http://www.quirksmode.org/js/cookies.html
function createCookie(name,value,days)
{
  if (days)
    {
      var date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      var expires = "; expires="+date.toGMTString();
    }
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
};
function readCookie(name)
{
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++)
    {
      var c = ca;
      while (c.charAt(0)==' ') c = c.substring(1,c.length);
      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
  return null;
};
function eraseCookie(name)
{
  createCookie(name,"",-1);
};
// options
// if there's no cookie, this should expand to something like
// if (window.foo===null) window.foo=window.dfoo;
function defaultize(x) {
  var val=null;
  var a='window.'+x;
  var b='window.d'+x;
  if (x!='popupCookies') {
    defaultize('popupCookies');
    if (popupCookies && (val=readCookie(x))) {
      eval(a + '=' + val + ';');
      return;
    }
  }
  eval('if ('+a+'===null) '+a+'=' + b + ';');
};
// this should expand to something like
// if (typeof window.foo=='undefined') { window.foo=null; }; window.dfoo = 0.5;
function newOption(x, def) {
  var a='window.'  + x;
  var b='window.d' + x;
  eval('if (typeof '+ a + '==\'undefined\') {' + a + '=null; }; ' + 
       b + '=' + def + ';');
};
function getValueOf(varName) {defaultize(varName); return eval(varName);};
// user-settable parameters and defaults
newOption('popupDelay', 0.5);
newOption('removeTitles', true);
newOption('imagePopupsForImages', true);
newOption('popupSummaryData', true);
newOption('simplePopups',  false);
newOption('popupAdminLinks',  false);
newOption('popupImages', true);
newOption('popupPreviews', true);
newOption('popupMaxPreviewSentences', 4);
newOption('popupMaxPreviewCharacters', 600);
newOption('popupNavLinks', true);
newOption('popupNavLinkSeparator', "' &sdot; '");
newOption('popupOnlyArticleLinks', true);
newOption('popupNeverGetThumbs', false);
newOption('popupImagesFromThisWikiOnly', false);
newOption('popupAppendRedirNavLinks', true);
newOption('popupMaxWidth', 300);
newOption('popupSimplifyMainLink', true);
newOption('popupMinImageWidth', 50);
newOption('popupLastEditLink', true);
newOption('popupHistoricalLinks', true);
newOption('popupFixRedirs', true);
newOption('popupLiveOptions', false);
newOption('popupCookies', false);
newOption('popupUnsimplifyLink', false);
newOption('popupLoadImagesSequentially', false);
newOption('popupShortcutKeys', false);
newOption('popupLiveOptionsExpanded', false);
newOption('popupFixDabs', true);
newOption('popupImagesToggleSize',true);
// browser-specific hacks
// if (typeof window.opera != 'undefined') {}
if ((self.navigator.appName)=='Konqueror') {
  dpopupNavLinkSeparator=' &bull; ';
} else if ((self.navigator.appName).indexOf("Microsoft")!=-1) {
  dpopupNavLinkSeparator=' &#183; ';
}
// String.prototype.parenSplit should do what ECMAscript says 
// String.prototype.split does, interspersing paren matches between
// the split elements
if (String('abc'.split(/(b)/))!='a,b,c') {
  // broken String.split, e.g. konq, IE
  String.prototype.parenSplit=function (re) {
    var m=re.exec(this);
    if (!m) return ;
    // without this, we have 
    // 'ab'.parenSplit(/a|(b)/) != 'ab'.split(/a|(b)/)
    for(var i=0; i<m.length; ++i) {
      if (typeof m=='undefined') m='';
    }
    return 
      .concat(m.slice(1))
      .concat(this.substring(m.index+m.length).parenSplit(re));
  };
} else {
  String.prototype.parenSplit=function (re) {return this.split(re);};
}
/////////////////////
// HTML GENERATION //
/////////////////////
// generate html for popup image
// <a id="popupImageLinkn"><img id="popupImagen">
// where n=popupImageId
function imageHTML(article) {
  var ret='';
  popupImageId++;
  ret += '<a id="popupImageLink' + popupImageId + '">';
  ret += '<img align="right" valign="top" id="popupImage' + popupImageId + '" ' 
    + 'style="display: none;"></img>';
  ret += '</a>';
  return ret;
};
function isInToc(a) {
  return isSubElementOf(a,'toc');
};
function isInArticle(a) { 
  // content is for monobook.. damn. was hoping to avoid skin references
  if (document.getElementById('article')) return isSubElementOf(a, 'article');
  else return isSubElementOf(a, 'content');
};
function isSubElementOf(a, tag) {
  var obj = a;
  var i=0;
  // this may well slow things down when this function is iterated
  // would perhaps be more efficient to cache this result before the 
  // function is called. or maybe the browser does that magically anyway
  var tagged=document.getElementById(tag);
  if (!tagged) return false;
  do {obj = obj.parentNode; ++i; }
  while (obj != tagged && obj.nodeName != 'HTML');
  if (obj.nodeName == 'HTML') return false;
  return true;
};
function articleFromURL(h) {
  if (typeof h != 'String') h=String(h);
  var article=null;
  var contribs=contributions.exec(h);
  if (contribs != null) {
    article='User:'+contribs;
    return article;
  } 
  var email=emailuser.exec(h);
  if (email != null) {
    article='User:'+email;
    return article;
  } 
  // no more special cases to check --
  // hopefully it's not a disguised user-related page
  var m=re.exec(h);
  if(m===null) return null;
  article=m;
  return article;
};
function articleFromAnchor(a) {var h=a.href; return articleFromURL(h);};
function oldidFromAnchor(a) {
  // log('oldidFromAnchor');
  var h=a.href;
  var m=oldidRegex.exec(h);
  if (m) return m;
  return null;
};
// Generate html for whole popup
function popupHTML (a) {
  var article = articleFromAnchor(a);
  var html='';
  html +=imageHTML(article);
  var hint=a.originalTitle;
  if (hint == '' || hint == null) hint = safeDecodeURI(article);
  var oldid=null;
  if (getValueOf('popupHistoricalLinks')) oldid=oldidFromAnchor(a);
  if (getValueOf('popupNavLinks'))        html += navLinksHTML(article, hint, oldid);
  if (getValueOf('popupUnsimplifyLink'))  html += popupUnsimplifyHTML();
  var popupEmptySpans = ;
  for (var i=0; i<popupEmptySpans.length; ++i) html += emptySpanHTML(popupEmptySpans, popupImageId);
  return html;
}; 
function popupUnsimplifyHTML() {
  var html = '';
  html += '<span id="popupUnsimplifySpan' + popupImageId + '">';
  html += '<br>';
  html += '<span onClick="javascript:popupUnsimplify()" ' 
    + 'style="cursor:pointer; border: thin dotted black" ' 
    + 'title="Download preview data from the Misplaced Pages servers">' 
    + 'Get preview data' 
    + '</span>';
  html += '</span>';
  return html;
};
function popupUnsimplify() {};
function isIpUser(user) {return ipUserRegex.test(user);};
function popupToggleVar(varstring) {
  defaultize(varstring);
  eval('window.'+varstring+'=!window.' + varstring);
  defaultize('popupCookies');
  if (popupCookies) createCookie(varstring, String(eval(varstring)));
};
function popupToggleShowOptions (dummy) {
  // just update state if dummy is true
  defaultize('popupLiveOptionsExpanded');
  if (!dummy) window.popupLiveOptionsExpanded=!window.popupLiveOptionsExpanded;
  setPopupHTML((window.popupLiveOptionsExpanded) ? '&lt;&lt;' : '&gt;&gt;',
               'optionPopped');
  var s=document.getElementById('popupOptionsDiv');
  // if (!s) return;
  if (window.popupLiveOptionsExpanded) s.style.display='inline';
  else s.style.display='none';
};
function popupOptionsCheckboxHTML(varstring, label, title) {
  var html='<br>';
  html += '<span title="'+title+'">';
  html += '<input type="checkbox" id="'+varstring+'Checkbox" ';
  html += (eval(varstring)) ? 'checked="checked" ' : '';
  html += 'onClick="javascript:popupToggleVar(' + "'" + varstring + "'" + 
    ')">' + label + '</input></span>';
  return html;
};
function popupLiveOptionsHTML() {
  var html = '';
  html += '<br>';
  html += '<span title="Show/hide options" ';
  html += 'style="border: thin dotted black; cursor: pointer" ';
  html += 'onClick="javascript:popupToggleShowOptions()">';
  html += 'Options <span id="optionPopped' + popupImageId + '"></span>';
  html += '</span>';
  html += '<div style="display: none" id="popupOptionsDiv">';
  html += popupOptionsCheckboxHTML('simplePopups', 'Simple popups', 
               'Never download extra stuff for images/previews');
  html += popupOptionsCheckboxHTML('popupUnsimplifyLink', 'Preview only on click', 
               'Only start downloading when told to do so');
  //html += popupOptionsCheckboxHTML('popupCookies', 'cookies', 
  //             'Use cookies to store popups options');
  html += popupOptionsCheckboxHTML('popupNavLinks', 'Show navigation links', 
               'Display navigation links at the top of the popup');
  html += popupOptionsCheckboxHTML('popupImages', 'Show image previews', 
               'Load images');
  html += popupOptionsCheckboxHTML('popupSummaryData', 'Show summary data', 
               'Show page summary data');
  html += popupOptionsCheckboxHTML('popupPreviews', 'Show text previews', 
               'Show previews');
  var extraOptions=[
                    'imagePopupsForImages',
                    'popupAdminLinks',
                    'popupAppendRedirNavLinks',
                    'popupCookies',
                    'popupFixDabs',
                    'popupFixRedirs',
                    'popupHistoricalLinks',
                    'popupImagesFromThisWikiOnly',
                    'popupImagesToggleSize',
                    'popupLastEditLink',
                    'popupLiveOptions',
                    'popupLoadImagesSequentially',
                    'popupNeverGetThumbs',
                    'popupOnlyArticleLinks',
                    'popupShortcutKeys',
                    'popupSimplifyMainLink',
                    'removeTitles' // no ,
  ];
  for (var i=0; i<extraOptions.length; ++i) {
    html += popupOptionsCheckboxHTML(extraOptions, extraOptions, 'Toggle this option');
  }
  html += '</div>';
  return html;
};
function mainLinkHTML(article, hint, oldid) {
  var html='';
  var visibleMainLinkText=safeDecodeURI(article);
  if ( getValueOf('popupSimplifyMainLink') ) { 
    var s= visibleMainLinkText.split('/');
    visibleMainLinkText = s;
    if (visibleMainLinkText == '' && s.length > 1) {
      // shouldn't happen...
      visibleMainLinkText=s;
    }
  }
  if (typeof hint =='undefined') hint=safeDecodeURI(article);
  if (oldid) hint = 'Revision '+ oldid +' of ' + hint;
  html+='<b>';
  html+=addPopupShortcut(titledWikiLink(article, 'view', visibleMainLinkText, hint, oldid), ' ');
  if (oldid)
    html+='|' + titledWikiLink(article, 'view', 'cur', 
                               'Current revision of '+visibleMainLinkText);
  html+='</b>';
  if (getValueOf('popupLastEditLink')) {
    html += popupNavLinkSeparator
      + addPopupShortcut(
                         titledDiffLink(article, 'lastEdit', 'Show the last edit made to '+visibleMainLinkText, 'prev', 'cur')
                         , '/');
  }
  if (oldid) {
    if (popupLastEditLink) html += '|';
    else html += popupNavLinkSeparator;
    html += titledDiffLink(article, 'oldEdit', 
                           'Show the edit made to get revision '+ oldid,
                           'prev', oldid); 
    html += '|' + titledDiffLink(article, 'diffCur',
                           'Show differences between revision '+oldid
                           +' and the current revision',
                           oldid, 'cur');
  }
  return html;
};
function emptySpanHTML(name, id) {return '<span id="' + name + id + '"></span>';};
function addLinkProperty(html, property) {
  // take "<a href=...>...</a> and add a property
  // not sophisticated at all, easily broken
  var i=html.indexOf('>');
  if (i<0) return html;
  return html.substring(0,i) + ' ' + property + html.substring(i);
};
function addPopupShortcut(html, key) {
  var ret= addLinkProperty(html, 'popupkey="'+key+'"');
  if (key==' ') key='space';
  return ret.replace(RegExp('^(.*?)(title=")(.*?)(".*)$', 'i'),'$1$2$3 $4');
};
function userNavLinksHTML(article) {
  // contribs - count - email - block
  // count only if applicable; block only if popupAdminLinks
  var html = '';
  html += addPopupShortcut(contribsLink(article, 'contribs'), 'c');
  var k = kateLink(article, 'count'); 
  if (k) html += popupNavLinkSeparator + addPopupShortcut(k, '#');
  html += popupNavLinkSeparator + addPopupShortcut(emailLink(article, 'email'), 'M');
  if (popupAdminLinks) html += popupNavLinkSeparator + addPopupShortcut(blockLink(article, 'block'), 'b');
  return html;
};
function reportErrorHTML(err) {
  return 'Error: '+err+ ' Please <a href="' + 
    'http://en.wikipedia.org/User_talk:Lupin?action=edit&section=new' + 
    '">report this</a>!';
};
// this function, rather ugly
function editingNavLinksHTML(article, oldid) {
  // edit - history - un|watch - talk|edit|new, OR (if a talk page)
  // edit|new - history - un|watch - article|edit
  var html = '';
  var t=talkPage(article);
  if (t) {
    // it's not a talk page
    if (oldid) {
      html += addPopupShortcut(wikiLink(article, 'edit', 'editOld', oldid), 'e') 
        + '|' + wikiLink(article, 'edit', 'cur', null);
    } else {
      html += addPopupShortcut(wikiLink(article, 'edit', 'edit'), 'e'); 
    }
    html += popupNavLinkSeparator + addPopupShortcut(wikiLink(article, 'history', 'history'), 'h'); 
    html += popupNavLinkSeparator + wikiLink(article, 'unwatch', 'un') 
      + '|' + addPopupShortcut(wikiLink(article, 'watch', 'watch'), 'w');
    html += popupNavLinkSeparator + 
      '<b>' + addPopupShortcut(wikiLink(t, 'view', 'talk'), 't') 
      + '</b>' +
      '|' + wikiLink(t, 'edit', 'edit') +
      '|' + addPopupShortcut(wikiLink(t, 'edit&section=new', 'new'), '+'); 
  } else {
    var ta=articleFromTalkPage(article);
    if (!ta) return reportErrorHTML('Not a talk page and not an article.');
    // it's a talk page
    if (oldid) {
      html += addPopupShortcut(wikiLink(article, 'edit', 'editOld', oldid), 'e') 
        + '|' + wikiLink(article, 'edit', 'cur', null);
    } else {
      html += addPopupShortcut(wikiLink(article, 'edit', 'edit'), 'e'); 
    }
    html += '|' + addPopupShortcut(wikiLink(article, 'edit&section=new', 'new'), '+'); 
    html += addPopupShortcut(popupNavLinkSeparator + wikiLink(article, 'history', 'history'), 'h'); 
    html += popupNavLinkSeparator + wikiLink(article, 'unwatch', 'un') 
      + '|' + addPopupShortcut(wikiLink(article, 'watch', 'watch'), 'w');
    html += popupNavLinkSeparator + 
      '<b>' + addPopupShortcut(wikiLink(ta, 'view', 'article'), 'a') 
      + '</b>' +
      '|' + wikiLink(ta, 'edit', 'edit');
  }
  return html;
};
function miscNavLinksHTML(article) {
  // whatLinksHere - relatedChanges - move
  var html='';
  html += addPopupShortcut(specialLink(article, 'Whatlinkshere', 'whatLinksHere'), 'l');
  // shortcut: r
  html += popupNavLinkSeparator + addPopupShortcut(specialLink(article, 'Recentchangeslinked', 'relatedChanges'), 'r'); 
  html += popupNavLinkSeparator + addPopupShortcut(specialLink(article, 'Movepage', 'move'), 'm');
  return html;
};
function adminNavLinksHTML(article) {
  var html = '';
  html += wikiLink(article, 'unprotect', 'un') + '|';
  html += addPopupShortcut(wikiLink(article, 'protect', 'protect'), 'p');
  html += popupNavLinkSeparator + undeleteLink(article, 'un') + '|';
  html += addPopupShortcut(wikiLink(article, 'delete', 'delete'), 'd');
  return html;
};
function navLinksHTML (article, hint, oldid) {
  var html='';
  defaultize('popupNavLinkSeparator');
  html += mainLinkHTML(article, hint, oldid);
  // Get rid of anchor (or whatever the bit after the # is called) now
  article=removeAnchor(article);
  // span for blinkenlights
  html+=emptySpanHTML('popupImageStatus', popupImageId);
  if (userName(article) != null) html += '<br>' + userNavLinksHTML(article);
  html += '<br>' + editingNavLinksHTML(article, oldid);
  html += '<br>' + miscNavLinksHTML(article);
  if (getValueOf('popupAdminLinks')) html += '<br>' + adminNavLinksHTML(article);
  return html;
};
/////////////////
// DOWNLOADING //
/////////////////
//////////////
//
// downloader
//
//
function downloader(url) {
  // Source: http://jibbering.com/2002/4/httprequest.html
  this.http= false;
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  // JScript gives us Conditional compilation, 
  // we can cope with old IE versions.
  // and security blocked creation of the objects.
  try {
  this.http = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
  try {
  this.http = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
  // this.http = false;
  }
  }
  @end @*/
  if (! this.http && typeof XMLHttpRequest!='undefined') this.http = new XMLHttpRequest();
  this.url = url; this.id=null;
  this.callbackFunction = null;
};
new downloader();
downloader.prototype.send = function (x) {if (!this.http) return; return this.http.send(x);};
downloader.prototype.abort = function () {if (!this.http) return;return this.http.abort();};
downloader.prototype.runCallback = function () {this.callbackFunction(this);};
downloader.prototype.getData = function () {if(!this.http) return; return this.http.responseText;};
downloader.prototype.setTarget = function () {if(!this.http) return; this.http.open("GET", this.url, true);};
downloader.prototype.start=function () {if(!this.http) return; return this.http.send(null);};
downloader.prototype.getReadyState=function () {if(!this.http) return; return this.http.readyState;};
downloader.prototype.setCallback = function (f) { 
  if(!this.http) return;
  this.http.onreadystatechange = f;
  this.callbackFunction = f;
};
function newDownload(url, id, callback) {
  var d=new downloader(url);
  d.id=id;
  d.setTarget();
  var f = function () {
    if (d.getReadyState() == 4)
    { d.data=d.getData(); callback(d);}
  };
  d.setCallback(f);
  return d;//d.start();
};
function fakeDownload(url,id,callback,data) {
  var d=newDownload(url,callback);
  d.id=id;
  d.data=data;
  return callback(d);
};
function startDownload(url, id, callback) {var d=newDownload(url, id, callback); d.start();};
//
//
// downloader
//
//////////////
// Schematic for a getWiki call
//
//   getWiki->-getPageWithCaching
//                    |
//       false        |          true
// getPage<-->-onComplete(a fake download)
//   \.
//     (async)->addPageToCache(download)->-onComplete(download)
function getWiki(wikipage, onComplete, oldid) {
  // set global variable (ugh) to holdwikipage
  window.currentArticle=wikipage;
  // set ctype=text/css to get around opera bug
  var url = titlebase + removeAnchor(wikipage) + '&action=raw&ctype=text/css';
  if (oldid!=null && oldid!='') url += '&oldid='+oldid;
  return getPageWithCaching(url, onComplete);
};
// check cache to see if page exists
function getPageWithCaching(url, onComplete) {
  var i=findInPageCache(url);
  if (i > -1) return fakeDownload(url, popupImageId, onComplete, gCachedPages.data);
  return getPage(url, onComplete);
};
function getPage(url, onComplete) {
  var callback= function (d) {addPageToCache(d); onComplete(d) };
  return startDownload(url, popupImageId, callback);
};
function findInPageCache(url) {
  for (var i=0; i<gCachedPages.length; ++i) if (url==gCachedPages.url) return i;
  return -1; 
};
function cachedPage (url,data) {this.url=url; this.data=data;};
function addPageToCache(download) {
  var page = new cachedPage(download.url, download.data);
  return gCachedPages.push(page);
};
/*
  var gCurrentDownload = null;
  function abortCurrentDownload(download) {
  if (gCurrentDownload) {
  try { gCurrentDownload.abort(); }
  catch (anerror) {return 'could not abort download object';}
  }
  return true;
  }
*/
/////////////////////
// LINK GENERATION //
/////////////////////
// titledDiffLink --> titledWikiLink
// wikiLink       --> titledWikiLink
// contribsLink, emailLink, blockLink, undeleteLink -> specialLink
// kateLink
function titledDiffLink(article, text, title, from, to) {
  return titledWikiLink(article, to + '&oldid=' + from, text, title, null, 'diff');
};
function wikiLink(article, action, text, oldid) {
  var prehint=null;
  switch (action) {
  case 'edit':             prehint = 'Edit ';                 break;
  case 'history':          prehint = 'Show history for ';     break;
  case 'unwatch':          prehint = 'Stop watching ';        break;
  case 'watch':            prehint = 'Watch ';                break;
  case 'view':             prehint = 'Go to ';                break;
  case 'unprotect':        prehint = 'Unprotect ';            break;
  case 'protect':          prehint = 'Protect ';              break;
  case 'delete':           prehint = 'Delete ';               break;
  case 'edit&section=new': prehint = 'Start a new topic on '; break;
  default: true;
  }
  if (action!='edit' && action!='view') oldid=null;
  var hint;
  if (prehint != null) {
    if (oldid) prehint += 'revision '+oldid +' of ';
    hint=prehint + safeDecodeURI(article);
  }
  else hint = safeDecodeURI(article + '&action=' + action) 
         + (oldid) ? '&oldid='+oldid : '';
  return titledWikiLink(article, action, text, hint, oldid);
};
function titledWikiLink(article, action, text, title, oldid, actionName) {
  var base = titlebase +  article;
  var url=base;
  // no need to add action&view, and this confuses anchors
  if (typeof actionName=='undefined' || actionName=='') {
    actionName='action';
  }
  if (action != 'view') url = base + '&' + actionName + '=' + action;
  var hint='';
  if (title != null && title != '')
    hint = 'title="' + title + '"'; 
  if (oldid != null && oldid != '')
    url+='&oldid='+oldid;
  return '<a href="' + url + '" ' + hint + '>' + text + '</a>';
};
function specialLink(article, specialpage, text, sep) {
  var base = titlebase +  'Special:'+specialpage;
  if (typeof sep == 'undefined' || sep===null) sep='&target=';
  var url = base + sep + article;
  var prehint=null;
  switch (specialpage) {
  case 'Whatlinkshere':       prehint='Show articles which link to '; break;
  case 'Recentchangeslinked': prehint='Show changes in articles related to '; break;
  case 'Contributions':       prehint='Show contributions made by '; break;
  case 'Emailuser':           prehint='Email '; break;
  case 'Blockip':             prehint='Block '; break;
  case 'Movepage':            prehint='Move '; break;
  case 'Undelete':            prehint='Show deletion history for '; break;
  }
  var hint;
  if (prehint != null) hint = prehint + safeDecodeURI(article);
  else hint = safeDecodeURI(specialpage+':'+article) ;
  return '<a href="' + url + '" title="' + hint + '">' + text + '</a>';
};
function literalizeRegex(str){
  return str.replace(RegExp('(])', 'g'), '\\$1');
};
function appendParamsToLink(linkstr, params) {
  var sp=linkstr.parenSplit(RegExp('(href="+?)"', 'i'));
  if (sp.length<2) return null;
  var ret=sp.shift() + sp.shift();
  ret += '&' + params + '"';
  ret += sp.join('');
 return ret;
};
function changeLinkTargetLink(newTarget, text, hint, summary, clickButton, minor) {
  // escape '&' and other nasties
  newTarget=encodeURI(newTarget);
  text=encodeURI(text);
  clickButton=encodeURI(clickButton);
  // this'll break if charAt(0) is nasty
  var cA=literalizeRegex(decodeURI(window.currentArticle));
  var chs=cA.charAt(0).toUpperCase();
  chs='';
  var currentArticleRegexBit=chs+cA.substring(1);
  currentArticleRegexBit=currentArticleRegexBit
    .split(RegExp('', 'g')).join('');
  // autoedit=s~\ad)\]\]~]~g;s~\AD)~[[Computer-aided%20design|~g
  var lk=titledWikiLink(removeAnchor(articleFromURL(location.href)),
                        'edit', text, hint);
  var cmd='s~\\\\]~]~g;';
  cmd +=  's~\\~[['+newTarget+'|~g';
  cmd += '&autoclick='+clickButton;
  cmd += '&autominor='+minor;
  cmd += '&autosummary='+summary;
  return appendParamsToLink(lk, 'autoedit='+cmd);
}
function redirLink(redirMatch) { 
  /* NB redirMatch is in wikiText */
  defaultize('popupAppendRedirNavLinks');
  defaultize('popupNavLinks');
  defaultize('popupFixRedirs');
  var ret='';
  if (popupAppendRedirNavLinks && popupNavLinks) {
    ret += '<hr>';
    if (popupFixRedirs && typeof autoEdit != 'undefined' && autoEdit) {
      ret += addPopupShortcut(
                              changeLinkTargetLink(redirMatch, 'Redirects', 'Fix this redirect',
                                                   'Bypassing redirect from [[' + window.currentArticle.split('_').join(' ') 
                                                   + ']] to ]',
                                                   'wpDiff', true)
                              , 'R');
      ret += ' to ';
    }
    else ret += 'Redirects to ';
    // BUG: duplicate IDs this way (eg popupImageStatus divs)
    // this is a hackish fix
    var realPopupImageId=popupImageId;
    popupImageId='' + popupImageId + 'redir';
    ret += navLinksHTML(wikiMarkupToAddressFragment(redirMatch));
    popupImageId=realPopupImageId;
    return ret;
  }
  else return '<br> Redirects to ' +
         titledWikiLink(myEncodeURI(redirMatch), 'view', 
                        safeDecodeURI(redirMatch), 'Bypass redirect');
};
function doNotRedirLink(redirPage, linkText, hintText) { 
  /* NB redirPage is in wikiText */
  return titledWikiLink(myEncodeURI(redirPage), 'edit', linkText, hintText);
};
function contribsLink(article, text) {
  return specialLink(userName(article), 'Contributions', text);
};
function emailLink(article, text) {
  return specialLink(userName(article), 'Emailuser', text);
};
function blockLink(article, text) {
  return specialLink(userName(article), 'Blockip', text, '&ip=');
};
function kateLink(article, text) {
  if (isIpUser(userName(article)) || ! wikimediaWiki) return null;
  var uN=safeDecodeURI(userName(article));
  return '<a href="' + kateBase + uN + '" title="'
    + 'Count the contributions made by ' + uN + '">' + text + '</a>';
};
function undeleteLink(article, text) {
  return specialLink(article, 'Undelete', text, '/');
};
////////////////////////////
// MANIPULATION FUNCTIONS //
////////////////////////////
function upcaseFirst(str) {
  if (typeof str != typeof '' || str=='') return '';
  return str.charAt(0).toUpperCase() + str.substring(1);
};
function formatBytes(num) {return (num > 949) ? (Math.round(num/100)/10+'kB') : (num +'&nbsp;bytes') ;};
function popupFilterStubDetect(data) {return (isStub(data)) ? 'stub' : '';};
function popupFilterDisambigDetect(data) {
  if (!isDisambig(data)) return '';
  if (getValueOf('popupFixDabs') && location.href.indexOf('Special:') == -1) 
    setPopupHTML(makeFixDab(data), 'popupFixDab', popupImageId);
  return 'disambig';
};
function listLinks(wikitext) {
  var reg=RegExp('\\*?)(\\||\\]\\])', 'gi');
  var ret=;
  var splitted=wikitext.parenSplit(reg);
  var omitRegex=RegExp('^*:|^pecial:|^mage|^ategory');
  for (var i=1; i<splitted.length; i=i+3) {
    if (typeof splitted == typeof 'string' && splitted.length>0 && !omitRegex.test(splitted)) {
      ret.push(changeLinkTargetLink(splitted, 
                                    splitted.split(' ').join('&nbsp;'),
                                    'Disambiguate the this link to +']]',
                                    ']-assisted disambiguation from [[' +
                                    window.currentArticle.split('_').join(' ') + ']] to [['+
                                    splitted + ']]',
                                    'wpDiff', true));
    } /* if */
  } /* for loop */
  return ret.sort(); // FIXME: duplicates not eliminated 
};
function makeFixDab(data) {
  var list=listLinks(data);
  if (list.length==0) return;
  var html='<hr>Click to disambiguate this link to:<br>';
  html+=list;
  for (var i=1; i<list.length; ++i) html += ', '+list;
  return html;
};
function popupFilterPageSize(data) {return formatBytes(data.length);};
function popupFilterCountLinks(data) {var num=countLinks(data);return String(num) + '&nbsp;wikiLink' + ((num!=1)?'s':'');};
function popupFilterCountImages(data) {var num=countImages(data);return String(num) + '&nbsp;image' + ((num!=1)?'s':'');};
function popupFilterCountCategories(data) {
  var num=countCategories(data);
  return String(num) + '&nbsp;categor' + ((num!=1)?'ies':'y');
};
var popupFilters=[popupFilterStubDetect,popupFilterDisambigDetect,popupFilterPageSize,popupFilterCountLinks,
                  popupFilterCountImages,popupFilterCountCategories];
if (typeof extraPopupFilters=='undefined') { var extraPopupFilters=new Array(); }
function getPageInfo(data) {
  if (!data || data.length == 0) return 'Empty page';
  var pageInfoArray=new Array();
  for (var i=0; i<     popupFilters.length; ++i) {var s=     popupFilters(data);if (s!='') pageInfoArray.push(s);}
  for (var i=0; i<extraPopupFilters.length; ++i) {var s=extraPopupFilters(data);if (s!='') pageInfoArray.push(s);}
  var pageInfo=pageInfoArray.join(', ');
  if (pageInfo != '' ) pageInfo = upcaseFirst(pageInfo);
  return pageInfo;
};     
function getValidImageFromWikiText(wikiText) {
  var imagePage=null;
  // nb in imageRegex we're interested in the second bracketed expression 
  // this may change if the regex changes :-(
  //var match=imageRegex.exec(wikiText);
  var matched=null;
  var match;
  defaultize('popupMinImageWidth');
  while ( match = imageRegex.exec(wikiText)) {
    /* now find a sane image name - exclude templates by seeking { */
    var m = match;
    var pxWidth=match;
    if ( isValidImageName(m) && (!pxWidth || parseInt(pxWidth) >= popupMinImageWidth) ) { 
      matched=m; 
      break;
    }
  } 
  imageRegex.lastIndex=0;
  if (!matched) return null;
  return 'Image:'+upcaseFirst(matched);
};
function countLinks(wikiText) { 
  // this could be improved!
  return wikiText.split('[[').length - 1;
};
// if N = # matches, n = # brackets, then
// String.parenSplit(regex) intersperses the N+1 split elements
// with Nn other elements. So total length is
// L= N+1 + Nn = N(n+1)+1. So N=(L-1)/(n+1).
function countImages(wikiText) {return (wikiText.parenSplit(imageRegex).length - 1) / (imageRegexBracketCount + 1);};
function countCategories(wikiText) {return (wikiText.parenSplit(categoryRegex).length - 1) / (categoryRegexBracketCount + 1); };
var wikiNamespaces = ["Media", "Special", "Talk", "User", "User talk", "Misplaced Pages", "Misplaced Pages talk", "Image",
                      "Image talk", "MediaWiki", "MediaWiki talk", "Template", "Template talk", "Help", "Help talk",
                      "Category", "Category talk", "Portal", "Portal talk"];
var wikiTalkNamespaces=["Talk", "User talk", "Misplaced Pages talk", "Image talk", "MediaWiki talk", 
                        "Template talk", "Help talk", "Category talk", "Portal talk"];
var wikiNamespacesWithTalk=[ null, // NB root (article) namespace is omitted
                             "User", "Misplaced Pages", "Image", "MediaWiki", "Template", "Help", "Category", "Portal"];
// returns /^(Talk|Usertalk|Wikipediatalk|...):$/
function namespaceListToRegex(list) {return RegExp('^('+list.join('|').split(' ').join('')+'):');};
function talkPage(article) {
  var talkRegex=namespaceListToRegex(wikiTalkNamespaces);
  if (talkRegex.exec(article)) {return null;}
  var nsRegex=namespaceListToRegex(wikiNamespacesWithTalk);
  var splitted=article.parenSplit(nsRegex);
  if (splitted.length<2) return (wikiTalkNamespaces+':'+article).split(' ').join('_');
  for (var i=0; i< wikiNamespacesWithTalk.length; ++i) {
    if (splitted==wikiNamespacesWithTalk) {
      splitted=wikiTalkNamespaces;
      return splitted.join(':').substring(1).split(' ').join('_');
    }
  }
  return null;
};
function articleFromTalkPage(talkpage) {
  var talkRegex=namespaceListToRegex(wikiTalkNamespaces);
  var splitted=talkpage.parenSplit(talkRegex);
  if (splitted.length < 2 || splitted.length > 0) return null;
  if (splitted==wikiTalkNamespaces) {
    splitted=''; return splitted.join(':').substring(2).split(' ').join('_');
  }
  for (var i=1; i< wikiTalkNamespaces.length; ++i) {
    if (splitted==wikiTalkNamespaces 
        || splitted==wikiTalkNamespaces.split(' ').join('_')) {
      splitted=wikiNamespacesWithTalk;
      return splitted.join(':').substring(1).split(' ').join('_');
    }
  }
  return null;
};
function userName(article) {
  var i=article.indexOf('User');
  var j=article.indexOf(':');
  if  (i != 0 || j < -1) return null;
  var k=article.indexOf('/');
  if (k==-1) return article.substring(j+1);
  else return article.substring(j+1,k);
};
function stripNamespace(article) {
  // this isn't very sophisticated 
  // it just removes everything up to the final :
  // BUG: probably does silly things for images with colons in the name - check it out
  var list = article.split(':');
  return list;
};
// those odd a/a5/ bits of image urls
function imagePathComponent(article) {
  var stripped=stripNamespace(article);
  var forhash=safeDecodeURI(stripped).split(' ').join('_');
  var hash=md5_hex(forhash);
  return hash.substring(0,1) + '/' + hash.substring(0,2) + '/';
};
function getImageUrlStart(wiki) { // this returns a trailing slash
  switch (wiki) {
    case 'en.wikipedia.org':  return 'http://upload.wikimedia.org/wikipedia/en/';
    case commonsWiki:         return 'http://upload.wikimedia.org/wikipedia/commons/';
    case 'en.wiktionary.org': return 'http://en.wiktionary.org/upload/en/';
    default: // unsupported - take a guess
      if (wikimediaWiki) {
        var lang=wiki.split('.');
        return 'http://' + wiki + '/upload/' + lang +'/';
      }
      else /* this should work for wikicities */
        return 'http://' + wiki + '/images/';
  }
};
function imageURL(img, wiki) {
  if (getValueOf('popupImagesFromThisWikiOnly') && wiki != thisWiki) return null;
  var imgurl=null;
  if (isImage(img)) {
    var pathcpt = imagePathComponent(img);
    var stripped=stripNamespace(img);
    imgurl=getImageUrlStart(wiki) + pathcpt + stripped;
  }
  return imgurl;
};
function imageThumbURL(img, wiki, width) {
  // 
  // eg http://upload.wikimedia.org/wikipedia/en/thumb/6/61/ 
  //           Rubiks_cube_solved.jpg/120px-Rubiks_cube_solved.jpg
  //           ^^^^^^^^^^^^^^^^^^^^^^^ 
  //          wikicities omits this bit
  //  AND wikicities needs a new pathcpt for each filename including thumbs
  if (getValueOf('popupImagesFromThisWikiOnly') && wiki != thisWiki) return null;
  if (getValueOf('popupNeverGetThumbs')) return null;
  var imgurl=null;
  if (isImage(img)) {
    var stripped=stripNamespace(img);
    var pathcpt;
    if (wikimediaWiki) pathcpt = imagePathComponent(stripped);
    else pathcpt = imagePathComponent(width+'px-'+stripped);
    imgurl=getImageUrlStart(wiki) +  "thumb/" + pathcpt;
    if (wikimediaWiki) imgurl += stripped + '/';
    imgurl += width +"px-" + stripped;
  }
  return imgurl;
};
// (a) myDecodeURI (first standard decodeURI, then exceptions)
// (b) change spaces to underscores
// (c) encodeURI (just the straight one, no exceptions)
function wikiMarkupToAddressFragment (str) { // for images
  var ret = safeDecodeURI(str);
  ret = ret.split(' ').join('_');
  ret = encodeURI(ret);
  return ret;
};
function addressFragmentToWikiMarkup (str) { 
  // seemingly, not :( the inverse of wikiMarkupToAddressFragment
  return safeDecodeURI(str);
};
function myDecodeURI (str) {
  log('myDecodeURI, str=' + str);
  var ret;
  try { ret=decodeURI(str); }
  catch (summat) { return null; }
  for (var i=0; i<decodeExtras.length; ++i) {
    var from=decodeExtras.from;
    var to=decodeExtras.to;
    ret=ret.split(from).join(to);
  }
  return ret;
};
function safeDecodeURI(str) {var ret=myDecodeURI(str); return ret || str;};
function myEncodeURI (str) {
  log ('myEncodeURI: str='+str);
  var ret=str;
  ret=encodeURI(ret);
  for (var i=0; i<decodeExtras.length; ++i) {
    var from=decodeExtras.from;
    var to=decodeExtras.to;
    ret=ret.split(to).join(from);
  }
  return ret;
};
function removeAnchor(article) {
  // is there a #? if not, we're done
  var i=article.indexOf('#');
  if (i == -1) return article;
  return article.substring(0,i);
};
///////////
// TESTS //
///////////
function isStub(data) { return stubRegex.test(data); };
function isDisambig(data) { return disambigRegex.test(data); };
function isValidImageName(str){ // extend as needed...
  return ( str.indexOf('{') == -1 );
};
function isInNamespace(article, namespace) {
  var i=article.indexOf(namespace+':');
  var j=article.indexOf(namespace+'_talk:');
  if  (i == 0 || j == 0) return true;
  return false;
};
function isImage(thing) {return isInNamespace(thing, 'Image');};
function isImageOk(img)
{ 
  // IE test
  if (!img.complete)
    return false;
  // gecko test
  if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0)
    return false;
  // test for konqueror and opera   
  // note that img.width must not be defined in the html with a width="..."
  // for this to work.
  // konq seems to give "broken images" width 16, presumably an icon width
  // this test would probably work in gecko too, *except for very small images*
  if (typeof img.width == 'undefined' || img.width <=  16) return false;
  // No other way of checking: assume it's ok.
  return true;
};
function anchorContainsImage(a) {
  // iterate over children of anchor a
  // see if any are images
  if (a===null) return false;
  kids=a.childNodes;
  for (var i=0; i<kids.length; ++i) if (kids.nodeName=='IMG') return true;
  return false;
};
/////////////
// ACTIONS //
/////////////
var imageCache = new Array ();
function loadThisImage(image) {
  if (getValueOf('popupLoadImagesSequentially')) return sequentialLoadThisImage(image);
  else return parallelLoadThisImage(image);
};
// this is probably very wasteful indeed of bandwidth
// hey ho
function getImageUrls(image) {
  var imageUrls=new Array();
  for (var i=0; i<imageSources.length; ++i) {
    var url;
    if (imageSources.thumb) 
      url=imageThumbURL(image, imageSources.wiki, imageSources.width);
    else 
      url=imageURL(image, imageSources.wiki);
    for (var j=0; j<gImageCache.length; ++j) {
      if (url == gImageCache) {
        loadThisImageAtThisUrl(image, url);
        return null;
      }
    }
    if (url!=null) imageUrls.push(url);
  }
  return imageUrls;
};
function parallelLoadThisImage (image) {
  if (!popupImages) return;
  if (!isValidImageName(image)) return false;
  var imageUrls=getImageUrls(image);
  if (!imageUrls) return null;
  for (var i=0; i<imageUrls.length; ++i) {
    var url = imageUrls;
    imageArray=new Image();
    imageArray.src=url;
  }
  if (popupImageTimer != null) {
    clearInterval(popupImageTimer);
    counter=0;
  }
  gImage=image;
  popupImageTimer=setInterval("checkImages()", 250);
  return;
};
function nextOne (array, value) {
  // NB if the array has two consecutive entries equal 
  //    then this will loop on successive calls
  if (typeof array.length == 'undefined') return null;
  for (var i=0; i<array.length-1; ++i) {
    if (array==value) return array;
  }
  return null;
};
function findThis(array, value) {
  if (typeof array.length == 'undefined') return null;
  for (var i=0; i<array.length; ++i) {
    if (array==value) return i;
  }
  return null;
};
// global array for 404'ed image urls
var gBadImageUrls=;
function sequentialLoadThisImage (image) {
  if (!popupImages) return;
  if (!isValidImageName(image)) return false;
  var imageUrls=getImageUrls(image);
  if (!imageUrls) return null;
  var img=new Image();
  img.isNew=true;
  img.popupImageId=popupImageId;
  img.counter=1;
  img.onload = function () {
    // clear status thingy
    setImageStatus('');
    var i=findThis(imageUrls, this.src);
    var goodSrc=this.src;
    var setPopupImage=function () {
      var popupImage=document.getElementById("popupImage"+this.popupImageId);
      if (popupImage && typeof popupImage.src != 'undefined') {
        clearInterval(popupImageTimer);
        popupImage.src=goodSrc;
        popupImage.width=popupImageSize;
        popupImage.style.display='inline';
        setPopupImageLink(image, imageSources.wiki);
      } else return;
    };
    popupImageTimer=setInterval(setPopupImage, 250);
    gImageCache.push(goodSrc); 
  };
  img.onerror = function () {
    gBadImageUrls.push(this.src);
    // if the popup is visible, move on
    if (over && over.style.visibility=='visible' && this.popupImageId==popupImageId) this.setNext();
  };
  img.setNext = function () {
    var currentSrc=null;
    var newSrc;
    if (!this.isNew) currentSrc=this.src;
    this.isNew=false;
    newSrc= (currentSrc) ? nextOne(imageUrls, currentSrc) : imageUrls;
    while (findThis(gBadImageUrls, newSrc))  {
      newSrc=nextOne(imageUrls, newSrc);
      if (!newSrc) {
        setImageStatus (' :-(');
        return;
      }
    }
    setImageStatus(' '+findThis(imageUrls, newSrc));
    this.src=newSrc;
  }
  // start the ball rolling
  img.setNext();
};
function loadThisImageAtThisUrl(image, url) {
  //myalert('loading "best" image:\n'+url);
  gImage=image;
  imageArray = new Array();
  imageArray = new Image();
  imageArray.src=url;
  if (popupImageTimer != null) {
    clearInterval(popupImageTimer);
    counter=0;
  }
  popupImageTimer=setInterval("checkImages()", 250);
  return;
};
function loadImages(article) {if(! isImage(article) ) return; return loadThisImage(article);};
// this has to use a timer loop as we don't know if the DOM element exists when we want to set the text
function setPopupHTML (str, elementId, popupId, onSuccess) {
  if (typeof popupId === 'undefined') popupId = popupImageId;
  var popupElement=document.getElementById(elementId+popupId);
  var timer;
  if (typeof popupHTMLTimers == 'undefined') timer=null;
  else timer=popupHTMLTimers;
  if (popupElement != null) {
    if(timer) clearInterval(timer);
    popupHTMLTimers=null;
    popupElement.innerHTML=str;
    if (onSuccess) onSuccess();
    return true;
  } else {
    // call this function again in a little while...
    var loopFunction=function() { setPopupHTML(str,elementId,popupId,onSuccess);}
    popupHTMLLoopFunctions = loopFunction;
    if (!timer) {
      var doThis = 'popupHTMLLoopFunctions()';
      popupHTMLTimers = setInterval(doThis, 600);
    }
  }
};
function setImageStatus(str, id) {return setPopupHTML(str, 'popupImageStatus', id);};
function setPopupTrailer(str,id) {return setPopupHTML(str, 'popupGubbins', id);};
// methinks this is unbelievably silly
// it dovetails with the parallel image loader function
function checkImages() {
  if (checkImagesTimer!=null) {
    clearInterval(checkImagesTimer);
    checkImagesTimer=null;
    if (loopcounter > 10); {loopcounter=0; return;}
    loopcounter++;
  } else counter++;
  var status =  ( counter % 2 ) ? ':' : '.' ;
  setImageStatus(status);
  if (counter > 100) {counter = 0; clearInterval(popupImageTimer);}
  var popupImage=null;
  popupImage=document.getElementById("popupImage"+popupImageId);
  if (popupImage == null) {
    // this doesn't seem to happen any more in practise for some reason
    // still, I'll leave it in
    checkImagesTimer=setInterval("checkImages()",333);
    return;
  }
  // get the first image to successfully load
  // and put it in the popupImage
  for(var i = 0; i < imageArray.length; ++i) {
    if(isImageOk(imageArray)) {
      // stop all the gubbins, assign the image and return
      clearInterval(popupImageTimer);
      if(isImage(gImage)) {
        popupImage.src=imageArray.src;
        popupImage.width=popupImageSize;
        popupImage.style.display='inline';
        // should we check to see if it's already there? maybe...
        gImageCache.push(imageArray.src); 
        setPopupImageLink(gImage, imageSources.wiki);
        stopImagesDownloading();
      }
      setImageStatus('');
      // reset evil nonconstant globals
      delete imageArray; imageArray=new Array();
      popupImageTimer=null;
      counter=0;
      loopcounter=0;
      return popupImage.src; 
    }
  }
};
function stopImagesDownloading() {
  gImage=null;
  if (imageArray == null) return null;
  var i;
  for (i=0; i<imageArray.length; ++i) {
    //imageArray.src=''; // this is a REALLY BAD IDEA
    delete imageArray;
    //imageArray = new Image();
  }
  imageArray = new Array ();
  return i;
};
function toggleSize() {
  var imgContainer=this;
  if (!imgContainer) { alert('imgContainer is null :/'); return;}
  img=imgContainer.firstChild;
  if (!img) { alert('img is null :/'); return;}
  if (!img.style.width || img.style.width=='') img.style.width='100%'; 
  else img.style.width=''; // popupImageSize+'px';
};
function setPopupImageLink (img, wiki) {
  if( wiki === null || img === null ) return null;
  var a=document.getElementById("popupImageLink"+popupImageId);
  if (a === null) return null; 
  var linkURL = imageURL(img, wiki); 
  if (linkURL != null) {
    if (getValueOf('popupImagesToggleSize')) { a.onclick=toggleSize; a.title='Toggle image size'; } 
    else { a.href=linkURL; a.title='Open full-size image'; }
  }
  return linkURL;
};
var ranSetupTooltipsAlready=false;
function setupTooltips() {
  if (ranSetupTooltipsAlready) return;
  ranSetupTooltipsAlready=true;
  var anchors;
  // article/content is a skin-dependent thing
  if (getValueOf('popupOnlyArticleLinks'))
    anchors=( document.getElementById('article') || 
              document.getElementById('content')   ).getElementsByTagName('A');
  else
    anchors=document.getElementsByTagName('A');
  for (var i=0; i<anchors.length; ++i) {
    var a=anchors;
    var h=a.href;
    if (
        ( (re.test(h)  && !exceptions.test(h)) 
          || 
          (contributions.test(h) && h.indexOf('&limit=') == -1 ) 
        )
        && (! isInToc(a)) 
       ) {
      a.onmouseover=mouseOverWikiLink;
      a.onmouseout= mouseOutWikiLink;
      a.onclick= killPopup;
      if (getValueOf('removeTitles') && typeof a.originalTitle=='undefined') {
        a.originalTitle=a.title;
        a.title='';
      }
    }
  }
};
//////////////
// THINGIES //
//////////////
// How the URLs for images in the popup come about
//   loadPreviewImage 
//          |                                  
//       getWiki                                
//          |<----------------see other schematic for details 
//    insertPreviewImage      (insertPreviewImage = onComplete)
//          |
//          |            insertPreviewImage gets a wikiText fragment from 
//          |                       the wikiText downloaded by getWiki
//          |                                   
//           
//       |                                      
//       |                     mouseOverWikiLink  (gets an "address fragment",       
//       |                            |            no processing needed)
//       \->-loadThisImage---<----loadImages    
//                 |                            
//           -->--hopefully valid image urls
var currentLink=null;
function popupHandleKeypress(evt) {
  var keyCode = evt.keyCode ? evt.keyCode : evt.charCode ? evt.charCode : evt.which;
  if (!keyCode || !over) return;
  var letter=String.fromCharCode(keyCode);
  var links=over.getElementsByTagName('A');
  var startLink=0;
  if (window.lastPopupLinkSelected) {
    for (var i=0; i<links.length; ++i) {
      if (links==window.lastPopupLinkSelected) startlink=i;
    }
  }
  for (var j=0; j<links.length; ++j) {
    var i=(startLink + j) % links.length;
    if (links.getAttribute('popupkey')==letter)
      {
        if (evt.preventDefault) evt.preventDefault();
        links.focus();
        window.lastPopupLinkSelected=links;
      }
  }
};
function addPopupShortcuts() {
  if (document.onkeypress==popupHandleKeypress) return;
  document.oldPopupOnkeypress=document.onkeypress;
  document.onkeypress=popupHandleKeypress;
};
function rmPopupShortcuts() {
  if (String(document.oldPopupOnkeypress)==String(popupHandleKeypress)) {
    // panic
    document.onkeypress=function () {};
    return;
  }
  document.onkeypress=document.oldPopupOnkeypress;
};
// add CSS class to table
function addPopupStylesheetClasses () {
  var tables=over.getElementsByTagName('table');
  tables.className='popupBorderTable';
  tables.className='popupTable';
  var fonts=over.getElementsByTagName('font');
  fonts.className='popupFont';
  fonts.id='overFontWrapper';
};
function mouseOverWikiLink() {
  // FIXME: should not generate the HTML until the delay has elapsed,
  //        and then popup immediately. Can be a CPU hog otherwise.
  var a=this;
  // try not to duplicate effort
  if (a==currentLink) return;
  currentLink=a;
  var html = popupHTML(a);
  var article=articleFromAnchor(a); 
  var oldid=oldidFromAnchor(a);
  if (popupImageTimer != null) {
    clearInterval(popupImageTimer);
    counter=0;
  }
  // keep this (or fix other refs)
  defaultize('popupImages');
  defaultize('popupMaxWidth');
  log('running overlib now');
  if (typeof popupMaxWidth == 'number') {
    window.setmaxwidth = function () {
      over.style.maxWidth = popupMaxWidth+'px'; 
      // hack for IE
      // see http://www.svendtofte.com/code/max_width_in_ie/
      // who knows if this will work? not me.
      // use setExpression as documented here on msdn: http://tinyurl.com/dqljn 
      if (over.style.setExpression) {
        over.style.setExpression('width', 
                                 'document.body.clientWidth > '
                                 + popupMaxWidth + ' ? "' 
                                 + popupMaxWidth + 'px": "auto" );');
      }
    };
    registerHook("createPopup", window.setmaxwidth, FAFTER);
  }
  if (getValueOf('popupShortcutKeys')) {
    registerHook("createPopup", window.addPopupShortcuts, FAFTER);
    registerHook("hideObject", window.rmPopupShortcuts, FAFTER);
  }
  registerHook("createPopup", window.addPopupStylesheetClasses, FAFTER);
  overlib(html, STICKY, WRAP, CELLPAD, 5, OFFSETX, 2, OFFSETY, 2, 
          DELAY, getValueOf('popupDelay')*1000);
  if (getValueOf('popupLiveOptions')) {
    setPopupHTML(popupLiveOptionsHTML(), 'popupLiveOptions', popupImageId,
                 function () { popupToggleShowOptions(true); } );
  }
  if(getValueOf('simplePopups')) return;
  // dunno what this is doing here
  // FIXME: what is going on?
  window.popupUnsimplify = function () {
    var previewImage=true;
    gImage=null;
    if (isImage(article) && ( getValueOf('imagePopupsForImages') || ! anchorContainsImage(a) )) {
      loadImages(article);
    }
    else if (!isImage(article) && previewImage) {
      redirCount=0;
      loadPreviewImage(article, oldid);
    }
    var s=document.getElementById('popupUnsimplifySpan' + popupImageId);
    if (s && s.style) {
      s.style.display='none';
    }
  };
  if (getValueOf('popupUnsimplifyLink')) return;
  window.popupUnsimplify();
};
function loadPreviewImage(article, oldid) {return getWiki(article, insertPreviewImage, oldid);};
function loadPreviewImageFromRedir(redirPage, redirMatch) {
  /* redirMatch is a regex match */
  var target = redirMatch;
  var trailingRubbish=redirMatch;
  ++redirCount;
  var warnRedir = redirLink(target);
  setPopupHTML(warnRedir, 'popupWarnRedir');
  return loadPreviewImage(myEncodeURI(target));
};
// header...!___ -> ...
function extractChunk(str, header, breakChar) {
  if (str.indexOf(header) != 0) return null;
  if (!breakChar) return str.substring(header.length);
  var findChar=str.indexOf(breakChar);
  if (findChar==-1) return str.substring(header.length);
  return str.substring(header.length, findChar);
};
function urlToWikiPage (url) {
  log ('urlToWikiPage\nurl='+url);
  var urlFragment=null;
  if (!urlFragment) urlFragment=extractChunk(url, titlebase, '&');
  if (!urlFragment) urlFragment=extractChunk(url, wikibase, '?');
  if (!urlFragment) return null;
  return addressFragmentToWikiMarkup(urlFragment);
};
function insertPreviewImage(download) {
  if (download.id != popupImageId) return;
  var wikiText=download.data;
  var redirectRegex= RegExp('^*redirect*\\]*)\\]\\]\\s*(.*)', 'i') ;
  var redirMatch = redirectRegex.exec(wikiText);
  if (redirMatch && redirCount==0) { 
    return loadPreviewImageFromRedir(urlToWikiPage(download.url), redirMatch);
  } else redirCount=0;
  if (getValueOf('popupSummaryData')) {
    var pgInfo=getPageInfo(wikiText);
    setPopupTrailer('<br>' + pgInfo);
  }
  var imagePage=getValidImageFromWikiText(wikiText);
  if(imagePage) {
    // loadThisImage expects an "address fragment"
    imagePage = wikiMarkupToAddressFragment(imagePage); 
    defaultize('popupLoadImagesSequentially');
    loadThisImage(imagePage);
  }
  if (getValueOf('popupPreviews')) {popupPreview(download);}
};
var localTest=false;
// possibly the daftest thing so far
// split this up, for crying out loud
function popupPreview(download) {
  // FIXME: horizonal rules should be skipped
  // FIXME: get rid of html tagsx
  if (localTest)
    var data = download.substring(0,8000); // FOR TESTING
  else {
    if (!download || typeof download.data=='undefined' 
        || typeof download.data.length=='undefined') return;
    var data=download.data.substring(0,10000); // huge pages be gone
  }
  var datum=new Array();
  datum.push(data.substring(0,1000));
  //   we strip in order:
  // 
  //    * html comments <!-- ... -->
  //    * contents of <div...> ... </div> and <gallery> ... </gallery>
  //    * HACK: {{taxobox_start ... taxobox_end}}
  //    * templates {{ .... }} (replace with spaces so that '''{{template}}''' works)
  //    * wikitext tables 
  //    * wikitext images and category tags
  //    * wikitext rules ----
  //    * lines starting with a :
  //    * html tables
  //    * a mop-up: delete all lines starting with <
  //    * all html tags
  //    * "chunks" of italic text (heuristics alert)
  //    * __TOC__, __NOTOC__
  // hasta la vista, comments
  // NB *? is non-greedy (minimal) version of * - see 
  // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:RegExp
  data=data.replace(RegExp('<!--(\\n|.)*?-->', 'g'), '');
  // say goodbye, divs (can be nested, so use * not *?)
  data=data.replace(RegExp('< *div* *>(.|\\n)*< */ *div *>',
                             'gi'), '');
  // and galleries
  data=data.replace(RegExp('< *gallery* *>(.|\\n)*?< */ *gallery *>',
                             'gi'),
                      '');
  // taxobox hack... in fact, there's a saudiprincebox_begin, so let's be more general
  data=data.replace(RegExp('*boxbegin' + 
                           '(.|\\n)**boxend *',
                           'gi'), '');
  // float_begin, ... float_end
  data=data.replace(RegExp('*floatbegin' + 
                           '(.|\\n)**floatend.*?',
                           'gi'), '');
  // try to remove templates
  data=data.replace(RegExp('(*|)*', 'g'), ' ');
//datum.push(data);
  // tables are bad, too
  data=data.replace
    (RegExp('\\|((|\\|)*||\\|)*\\|', 'g')
     , '');
  datum.push(data.substring(0,1000));
  // remove lines starting with a pipe
  data=data.replace(RegExp('^.*$', 'mg'), '');
  // images are a nono
  // who says regexes aren't fun?
  // this ain't so good, try it on ]
  // i think we should match:
  // ] where ....... is consists of repetitions of any of:
  // 1. not 
  // 2. )* ]] 
  // 3. )* ]
  var imagedetector
    ='\\s*(image|category)\\s*:(]|\\]*\\]\\]|\\]*\\])*\\]\\]';
  var crudeImageRegex = RegExp(imagedetector, 'gi');
  // alert(data.match(crudeImageRegex).join('\n-\n'));
  data=data.replace(crudeImageRegex, '');
  // we simply *can't* be doing with horizontal rules right now
  data=data.replace(RegExp('^-{4,}','mg'),'');
  // no indented lines 
  data=data.replace(RegExp('(^|\\n) *:*','g'), '\n');
  // or html tables // this doesn't cope with embedded tables
  //data=data.replace(RegExp('<table*>(||<|</|'+
  // may this is good enough?
  data=data.replace(RegExp('<table.*?>(.|\\n.)*?\\n?</ *table *>\\n+', 'gi'),
                    '');
  // let's delete lines starting with <. it's worth a try.
  data=data.replace(RegExp('(^|\\n) *<.*', 'g'), '\n');
  // and those pesky html tags
  data=data.replace(RegExp('<.*?>','g'),'');
  // chunks of italic text? you crazy, man?
  var italicChunkRegex=new RegExp
    ("((^|\\n)\\s*:*\\s*''(|'''|'){20}(.|\\n)*''*\\n)*"
     , 'g');
  data=data.replace(italicChunkRegex, '');
  //return data; //TESTING
  // replace __TOC__, __NOTOC__ and whatever else there is
  // this'll probably do
  data=data.replace(RegExp('^__*__ *$', 'gmi'),'');
  // dont't be givin' me no subsequent paragraphs, either, you hear me?
  /// first we "normalize" section headings, removing whitespace after, adding before
  data=data.replace(RegExp('\\s*(==+*==+)\\s*', 'g'), '\n\n$1 ');
  /// then we want to get rid of paragraph breaks whose text ends badly
  data=data.replace(RegExp('() *\\n{2,}', 'g'), '$1\n');
  data=data.replace(RegExp('^*'), '');
  stuff=(RegExp('^(|\\n)*')).exec(data);
  if (stuff) 
    data = stuff;  
  /// now put \n\n after sections so that bullets and numbered lists work
  data=data.replace(RegExp('(==+*==+)\\s*', 'g'), '$1\n\n');
  // superfluous sentences are RIGHT OUT.
  // note: exactly 1 set of parens here needed to make the slice work
  data = data.parenSplit(RegExp('(+*\\s)','g'));
  // leading space is bad, mmkay?
  data=data.replace(RegExp('^\\s*'), '');
  var notSentenceEnds=RegExp('(|etc|sic|Dr|Mr|Mrs|Ms)$'
                             + '|' +
                             '\\]*$'
                             , 'i');
  data = fixSentenceEnds(data, notSentenceEnds);
  defaultize('popupMaxPreviewSentences');
  defaultize('popupMaxPreviewCharacters');
  var n=popupMaxPreviewSentences; 
  var d;
  do {d=firstSentences(data,n); --n; } 
  while ( d.length > popupMaxPreviewCharacters && n > 0 );
  data = d;
  datum.push('\n\nfinal one:');
  datum.push(data.substring(0,1000));
  if (localTest) return data; // FOR TESTING
  var newhtml=wiki2html(data); // needs livepreview
  if (!RegExp('^\\s*$').test(newhtml) && 
      (popupNavLinks || popupSummaryData)) 
    {
      newhtml = '<hr>' + newhtml;
      setPopupHTML(newhtml, 'popupPreview');
    }
};
function fixSentenceEnds(strs, reg) { 
  // take an array of strings, strs
  // join strs to strs & strs if strs matches regex reg
  for (var i=0; i<strs.length-2; ++i) {
    if (reg.test(strs)) {
      a=;
      for (var j=0; j<strs.length; ++j) {
        if (j<i)   a=strs;
        if (j==i)  a=strs+strs+strs;
        if (j>i+2) a=strs;
      }
      return fixSentenceEnds(a,reg);
    }
  }
  //alert('returning '+strs.join('\n\n'));
  return strs;
};
function firstSentences(strs, howmany) {var t=strs.slice(0, 2*howmany); return t.join(''); };
var stopPopupTimer=null;
function fuzzyCursorOff(fuzz) {
  if (!over) return null;
  var left = parseInt(over.style.left);
  var top = parseInt(over.style.top);
  var right = left + 
    (over.offsetWidth >= parseInt(o3_width) ? over.offsetWidth : parseInt(o3_width));
  var bottom = top + 
    (over.offsetHeight >= o3_aboveheight ? over.offsetHeight : o3_aboveheight);
  if (o3_x < left-fuzz || o3_x > right+fuzz || o3_y < top-fuzz || o3_y > bottom + fuzz)
    return true;
  return false;
};
// seems that fuzzyCursorOff should precede mouseOutWikiLink in the source
// or sometimes during page loads, errors are generated
function mouseOutWikiLink () {
  if (fuzzyCursorOff(5)) { 
    if (stopPopupTimer) {
      clearInterval(stopPopupTimer); 
      stopPopupTimer=null; 
    }
    killPopup(); 
    return;
  }
  if (!stopPopupTimer) 
    stopPopupTimer=setInterval("mouseOutWikiLink()", 500);
};
function killPopup() {
  // o3_showingsticky should be defined in overlib.js
  //if ( typeof o3_showingsticky != "undefined" && o3_showingsticky == 0 ) {
  if (getValueOf('popupShortcutKeys')) rmPopupShortcuts();
  cClick();
  currentLink=null;
  // abortCurrentDownload();
  stopImagesDownloading();
  if (checkImagesTimer != null) {
    clearInterval(checkImagesTimer); checkImagesTimer=null;
  }
  if (popupImageTimer != null) {
    clearInterval(popupImageTimer); popupImageTimer=null;
  }
  //}
  return true; // preserve default action (eg from onclick)
};
////////////////////////////////////////////////////////////////////
// Run things
////////////////////////////////////////////////////////////////////
if (window.addEventListener) {
  window.addEventListener("load",setupTooltips,false);
}
else if (window.attachEvent) {
  window.attachEvent("onload",setupTooltips);
}
else {
  window._old_popup_onload = window.onload;
  window.onload = function() {
    window._old_popup_onload();
    setupTooltips();
  }
}
/// Local Variables: ///
/// mode:c ///
/// End: ///
// --FILE BOUNDARY-- // --FILE BOUNDARY-- // --FILE BOUNDARY--
function getParamValue(paramName) {
  var cmdRe=RegExp(''+paramName+'=(*)');
  var h=document.location;
  var m;
  if (m=cmdRe.exec(h)) {
    try { 
      return decodeURI(m);
    } catch (someError) {}
  }
  return null;
};
function substitute(data,cmdBody) {
  // alert('sub\nfrom: '+cmdBody.from+'\nto: '+cmdBody.to+'\nflags: '+cmdBody.flags);
  var fromRe=RegExp(cmdBody.from, cmdBody.flags);
  return data.replace(fromRe, cmdBody.to);
};
function execCmds(data, cmdList) {
  for (var i=0; i<cmdList.length; ++i) {
    data=cmdList.action(data, cmdList);
  }
  return data;
}
function parseCmd(str) {
  // returns a list of commands
  if (!str.length) return ;
  var p=false;
  switch (str.charAt(0)) {
  case 's':
    p=parseSubstitute(str);
    break;
  case 'j':
    p=parseJavascript(str);
    break;
  default:
    return false;
  }
  if (p) return .concat(parseCmd(p.remainder));
  return false;
};
function unEscape(str, sep) {
  return str.split('\\\\').join('\\')
        .split('\\'+sep).join(sep)
        .split('\\n').join('\n');
};
function runJavascript(data, argWrapper) {
  // flags aren't used (yet)
  // from the user's viewpoint,
  // data is a special variable may appear inside code
  // and gets assigned the text in the edit box
  // alert('eval-ing '+argWrapper.code);
  return eval(argWrapper.code);
};
function parseJavascript(str) {
  // takes a string like j/code/;othercmds and parses it
  var tmp,code,flags;
  if (str.length<3) return false;
  var sep=str.charAt(1);
  str=str.substring(2);
  tmp=skipOver(str,sep);
  if (tmp) { code=tmp.segment.split('\n').join('\\n'); str=tmp.remainder; }
  else return false;
  flags='';
  if (str.length) {
    tmp=skipOver(str,';') || skipToEnd(str, ';');
    if (tmp) {flags=tmp.segment; str=tmp.remainder; }
  }
  return { action: runJavascript, code: code, flags: flags, remainder: str };
};
function parseSubstitute(str) {
  // takes a string like s/a/b/flags;othercmds and parses it
  var from,to,flags,tmp;
  if (str.length<4) return false;
  var sep=str.charAt(1);
  str=str.substring(2);
  tmp=skipOver(str,sep);
  if (tmp) { from=tmp.segment; str=tmp.remainder; } 
  else return false;
  tmp=skipOver(str,sep);
  if (tmp) { to=tmp.segment; str=tmp.remainder; } 
  else return false;
  flags='';
  if (str.length) {
    tmp=skipOver(str,';') || skipToEnd(str, ';');
    if (tmp) {flags=tmp.segment; str=tmp.remainder; }
  }
  return {action: substitute, from: from, to: to, flags: flags, remainder: str};
};
function skipOver(str,sep) {
  var endSegment=findNext(str,sep);
  if (endSegment<0) return false;
  var segment=unEscape(str.substring(0,endSegment), sep);
  return {segment: segment, remainder: str.substring(endSegment+1)};
}
function skipToEnd(str,sep) {
  return {segment: str, remainder: ''};
}
function findNext(str, ch) {
  for (var i=0; i<str.length; ++i) {
    if (str.charAt(i)=='\\') i+=2;
    if (str.charAt(i)==ch) return i;
  }
  return -1;
};
function runOnLoad(f) {
  if (window.addEventListener) {
    window.addEventListener("load",f,false);
  }
  else if (window.attachEvent) {
    window.attachEvent("onload",f);
  }
  else {
    window._old_popup_autoedit_onload = window.onload;
    window.onload = function() {
      window._old_popup_autoedit_onload();
      f();
    }
  }
};
function autoEdit() {
  var cmdString=getParamValue('autoedit');
  if (cmdString) {
    try { 
      var editbox=document.editform.wpTextbox1;
    } catch (dang) { return; }
    var cmdList=parseCmd(cmdString);
    var input=editbox.value;
    var output=execCmds(input, cmdList);
    editbox.value=output;
  }
  var summary=getParamValue('autosummary');
  if (summary) document.editform.wpSummary.value=summary;
  var minor=getParamValue('autominor');
  if (minor) {
    switch (minor) {
    case '1':
    case 'yes':
    case 'true':
      document.editform.wpMinoredit.checked=true;
      break;
    case '0':
    case 'no':
    case 'false':
      document.editform.wpMinoredit.checked=false;
    }
  }
  var btn=getParamValue('autoclick');
  if (btn) {
    if (document.editform && eval('document.editform.'+btn)) {
      var headings=document.getElementsByTagName('h1');
      if (headings) {
        var div=document.createElement('div');
        var button=eval('document.editform.'+btn);
        div.innerHTML='<font size=+1><b>The "' + button.value + 
          '" button has been automatically clicked.' + 
          ' Please wait for the next page to load.</b></font>';
        document.title='('+document.title+')';
        headings.parentNode.insertBefore(div, headings);
        button.click();
      }
    } else {
      alert('autoedit.js\n\nautoclick: could not find button "'+ btn +'".');
    }  
  }
};
runOnLoad(autoEdit);
// --FILE BOUNDARY-- // --FILE BOUNDARY-- // --FILE BOUNDARY--
// Last update: 21:51, 15 Feb 2005 (UTC)
// Script to embed Live Preview in MediaWiki's edit page
function LivePreviewInstall()
{
 copywarn = document.getElementById('editpage-copywarn');
 if (copywarn != null) {
  var cleaner = "<br style=\\'clear:both;\\' />";
  LivePreviewHTML = '<input type="button" value="Live Preview" onclick="document.getElementById(\'PreviewBox\').innerHTML = wiki2html(editform.wpTextbox1.value) + \'' + cleaner + '\';" />';
  //LivePreviewHTML = '<input type="button" value="Live Preview" onclick="document.getElementById(\'PreviewBox\').innerHTML = wiki2html(editform.wpTextbox1.value);" />';
  LivePreviewHTML += '<div style="margin-top: 5px; margin-bottom: 5px; padding: 5px; border: 3px double orange;" id="PreviewBox"></div>';
  copywarn.innerHTML = LivePreviewHTML + copywarn.innerHTML;
 }
}
// User options
var wpUserName=wpUserName||'Wikipedian';
var wpUserSignature=wpUserSignature||wpUserName;
var wpShowImages=wpShowImages||true;
// System options
var wpLanguageCode=wpLanguageCode||'en';
var wpInterwikiCodes=wpInterwikiCodes||'ab|aa|af|ak|sq|als|am|ang|ar|an|arc|hy|roa-rup|as|ast|av|ay|az|bm|ba|eu|be|bn|bh|bi|bs|br|bg|my|ca|ch|ce|chr|chy|ny|zh|zh-tw|zh-cn|cho|cv|kw|co|cr|hr|cs|da|dv|nl|dz|en|eo|et|ee|fo|fj|fi|fr|fy|ff|gl|ka|de|got|el|kl|gn|gu|ht|ha|haw|he|hz|hi|ho|hu|is|io|ig|id|ia|ie|iu|ik|ga|it|ja|jv|kn|kr|csb|ks|kk|km|ki|rw|rn|tlh|kv|kg|ko|kj|ku|ky|lo|la|lv|li|ln|lt|jbo|nds|lg|lb|mk|mg|ms|ml|mt|gv|mi|minnan|mr|mh|zh-min-nan|mo|mn|mus|nah|na|nv|ne|se|no|nn|oc|or|om|pi|fa|pl|pt|pa|ps|qu|ro|rm|ru|sm|sg|sa|sc|gd|sr|sh|st|tn|sn|scn|simple|sd|si|sk|sl|so|st|es|su|sw|ss|sv|tl|ty|tg|ta|tt|te|th|bo|ti|tpi|to|tokipona|ts|tum|tr|tk|tw|uk|ur|ug|uz|ve|vi|vo|wa|cy|wo|xh|ii|yi|yo|za|zu';
var wpBaseArticlePath=wpBaseArticlePath||'/';
var wpMathBasePath=wpMathBasePath||'/math/';
var wpImageBasePath=wpImageBasePath||'http://upload.wikimedia.org/wikipedia/'+wpLanguageCode+'/';
var wpImageFallbackPath=wpImageFallbackPath||'http://upload.wikimedia.org/wikipedia/commons/';
var wpDefaultThumbWidth=wpDefaultThumbWidth||180;
var wpSkinMagnifyClip=wpSkinMagnifyClip||'/skins/common/images/magnify-clip.png';
var wpUserNamespace=wpUserNamespace||'User';
var wpImageNamespace=wpImageNamespace||'Image';
var wpCategoryNamespace=wpCategoryNamespace||'Category';
// Packed code (DO NOT MODIFY)
function wiki2html(str)
{str=strip_cr(str);var w=new WikiCode();w.lines=str.split(/\n/);w.parse();return w.html;};var wpSignature=']';var wpBlockImage=new RegExp('^\\[\\['+wpImageNamespace+':.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)','i');function WikiCode()
{this.lines=new Array;this.html=new String;this._endline=function(str)
{this.html+=str;this.lines.shift();};this.parse=function()
{var p=false;do{if(h_match=this.lines.match(/^(={1,6})(.*)\1(.*)$/)){p=false;this._endline('<h'+h_match.length+'>'+_parse_inline_nowiki(h_match)+'</h'+h_match.length+'>'+h_match);}else if(this.lines.match(/^/)){p=false;this._parse_list();}else if(this.lines.charAt(0)==' '){p=false;this._parse_pre();}else if(this.lines.substr(0,2)=='{|'){p=false;this._parse_table();}else if(this.lines.match(/^----+$/)){p=false;this._endline('<hr/>');}else if(this.lines.match(wpBlockImage)){p=false;this._parse_block_image();}else{if(this.lines==''){if(p=(this.lines.length>1&&this.lines=='')){this._endline('<p><br />');}}else{if(!p){this.html+='<p>';p=true;}
this.html+=_parse_inline_nowiki(this.lines)+' ';}
this.lines.shift();}}while(this.lines.length);};this._parse_list=function(){var prev=new String;var l_match,imatch,dt_match;while(this.lines.length&&(l_match=this.lines.match(/^(+)(.*)$/))){this.lines.shift();imatch=str_imatch(prev,l_match);for(var i=prev.length-1;i>=imatch;i--){if(prev.charAt(i)=='*'){this.html+='</ul>';}else if(prev.charAt(i)=='#'){this.html+='</ol>'}else{this.html+='</d'+((prev.charAt(i)==';')?'t':'d')+'>';switch(l_match.charAt(i)){case'':case'*':case'#':this.html+='</dl>';}}}
for(var i=imatch;i<l_match.length;i++){if(l_match.charAt(i)=='*'){this.html+='<ul>';}else if(l_match.charAt(i)=='#'){this.html+='<ol>';}else{switch(prev.charAt(i)){case'':case'*':case'#':this.html+='<dl>';}
this.html+='<d'+((l_match.charAt(i)==';')?'t':'d')+'>';}}
switch(l_match.charAt(l_match.length-1)){case'*':case'#':this.html+='<li>'+_parse_inline_nowiki(l_match);break;case';':if(dt_match=l_match.match(/(.*?) (:.*?)$/)){this.html+=_parse_inline_nowiki(dt_match);this.lines.unshift(dt_match);break;}
case':':this.html+=_parse_inline_nowiki(l_match);}
prev=l_match;}
for(i=prev.length-1;i>=0;i--){if(prev.charAt(i)=='*'){this.html+='</ul>';}else if(prev.charAt(i)=='#'){this.html+='</ol>';}else{this.html+='</d'+((prev.charAt(i)==';')?'t':'d')+'></dl>';}}};this._parse_table=function()
{var table_match;if(table_match=this.lines.match(/^\{\|( .*)$/)){this._endline('<table'+table_match+'>');}else this._endline('<table>');do{if(this.lines.charAt(0)=='|'){switch(this.lines.charAt(1)){case'}':this._endline('</table>');return;case'-':this._endline('<tr '+this.lines.match(/\|-*(.*)/)+'>');break;default:this._parse_table_data();}}else if(this.lines.charAt(0)=='!'){this._parse_table_data();}else{this.lines.shift();}}while(this.lines.length)};this._parse_table_data=function()
{var td_match,td_line;td_match=this.lines.shift().match(/^(\|\+|\||!)((?:(*?)\|(?!\|))?(.*))$/);if(td_match=='|+'){this.html+='<caption';}else{this.html+='<t'+((td_match=='|')?'d':'h');}
if(typeof td_match!='undefined'){this.html+=' '+td_match;td_line=td_match.split('||');}else{td_line=td_match.split('||');}
this.html+='>';while(td_line.length>1){this.lines.unshift(td_match+td_line.pop());}
this.html+=_parse_inline_nowiki(td_line);var td=new WikiCode;var table_count=0;while(this.lines.length){if(this.lines.charAt(0)=='|'){if(table_count==0)break;else if(this.lines.charAt(1)=='}')table_count--;}else if(this.lines.charAt(0)=='!'&&table_count==0){break;}else if(this.lines.substr(0,2)=='{|')table_count++;td.lines.push(this.lines.shift());}
if(td.lines.length){td.parse();}
this.html+=td.html;};this._parse_pre=function()
{this.html+='<pre>';do{this._endline(_parse_inline_nowiki(this.lines.substring(1,this.lines.length))+"\n");}while(this.lines.length&&this.lines.charAt(0)==' ');this.html+='</pre>';};this._parse_block_image=function()
{this.html+=_parse_image(this.lines.shift());};};function _parse_image(str)
{var attr=str.substring(wpImageNamespace.length+3,str.length-2).split(/\s*\|\s*/);var filename=attr;var caption=attr;var width,w_match;var thumb=false;var frame=false;var center=false;var align='';var html='';do{if(w_match=attr.match(/^(\d*)px$/)){width=w_match;}else switch(attr){case'thumb':case'thumbnail':thumb=true;case'frame':frame=true;break;case'none':case'right':case'left':center=false;align=attr;break;case'center':center=true;align='none';}
attr.shift();}while(attr.length);if(frame){if(align=='')align='right';html+="<div class='thumb t"+align+"'>";if(thumb){if(!width)width=wpDefaultThumbWidth;html+="<div style='width:"+(2+parseInt(width))+"px;'>";html+=_make_image(filename,caption,width);html+="<div class='thumbcaption'><div class='magnify' style='float:right'><a href='"+wpBaseArticlePath+wpImageNamespace+':'+filename+"' class='internal' title='Enlarge'><img src='"+wpSkinMagnifyClip+"' /></a></div>"+_parse_inline_nowiki(caption)+"</div>";}else{html+='<div>';html+=_make_image(filename,caption);html+="<div class='thumbcaption'>"+_parse_inline_nowiki(caption)+"</div>";}
html+='</div></div>';}else if(align!=''){html+="<div class='float"+align+"'><span>"+_make_image(filename,caption,width)+"</span></div>";}else{return _make_image(filename,caption,width);}
if(center){return"<div class='center'>"+html+'</div>';}else{return html;}};this._parse_inline_nowiki=function(str)
{var start,lastend=0
var substart=0,nestlev=0,open,close,subloop;var html='';while(-1!=(start=str.indexOf('<'+'nowiki>',substart))){html+=_parse_inline_wiki(str.substring(lastend,start));start+=8;substart=start;subloop=true;do{open=str.indexOf('<'+'nowiki>',substart);close=str.indexOf('</nowiki>',substart);if(close<=open||open==-1){if(close==-1){return html+html_entities(str.substr(start));}
substart=close+9;if(nestlev){nestlev--;}else{lastend=substart;html+=html_entities(str.substring(start,lastend-9));subloop=false;}}else{substart=open+8;nestlev++;}}while(subloop);}
return html+_parse_inline_wiki(str.substr(lastend));};function _make_image(filename,caption,width)
{filename=filename.charAt(0).toUpperCase()+filename.substr(1);filename=filename.replace(/ /g,'_');var md5=hex_md5(filename);var source=md5.charAt(0)+'/'+md5.substr(0,2)+'/'+filename;var img;if(wpShowImages){if(width){width="width='"+width+"px'";}
img="<img onerror='this.onerror=null;this.src=\""+wpImageFallbackPath+source+"\";' src='"+wpImageBasePath+source+"' alt='"+caption+"' "+width+"/>";}else{img=wpImageNamespace+':'+filename+" <em style='color:red;'>(images disabled)</em>";}
caption=_strip_inline_wiki(caption);return"<a class='image' title='"+caption+"' href='"+wpBaseArticlePath+wpImageNamespace+':'+filename+"'>"+img+"</a>";};function _parse_inline_images(str)
{var start,substart=0,nestlev=0;var loop,close,open,wiki,html;while(-1!=(start=str.indexOf(']',substart);open=str.indexOf('[[',substart);if(close<=open||open==-1){if(close==-1)return str;substart=close;if(nestlev){nestlev--;}else{wiki=str.substring(start,close+2);html=_parse_image(wiki);str=str.replace(wiki,html);substart=start+html.length;loop=false;}}else{substart=open;nestlev++;}}while(loop);}else{break;}}
return str;};function _parse_inline_wiki(str)
{var aux_match,math_md5;str=_parse_inline_images(str);while(aux_match=str.match(/<(?:)math>(.*?)<\/math>/i)){math_md5=hex_md5(aux_match);str=str.replace(aux_match,"<img src='"+wpMathBasePath+math_md5+'.png'+"' />");}
return str.replace(/'''''(.*?)''(.*?)'''/g,'<strong><em>$1</em>$2</strong>').replace(/'''''(.*?)'''(.*?)''/g,'<em><strong>$1</strong>$2</em>').replace(/'''(.*?)''(.*?)'''''/g,'<strong>$1<em>$2</em></strong>').replace(/'''(.*?)'''/g,'<strong>$1</strong>').replace(/''(.*?)''/g,'<em>$1</em>').replace(/~{5}(?!~)/g,Date()).replace(/~{4}(?!~)/g,wpSignature+' '+Date()).replace(/~{3}(?!~)/g,wpSignature).replace(RegExp('\\\\]','gi'),"<a href='"+wpBaseArticlePath+"$1'>$1</a>").replace(RegExp('\\\\]','gi'),'').replace(/\*?)\]\](\w*)/g,"<a href='"+wpBaseArticlePath+"$1'>$1$2</a>").replace(/\]+?)\]\](\w*)/g,"<a href='"+wpBaseArticlePath+"$1'>$2$3</a>").replace(/\]*?:)?(.*?)( *\(.*?\))?\|\]\]/g,"<a href='"+wpBaseArticlePath+"$1$2$3'>$2</a>").replace(/\]*?) (.*?)\]/g,"<a href='$1:$2$3'>$4</a>").replace(/\/g,"<a href='http://$1'></a>").replace(/\/g,"<a href='$1:$2$3'>$1:$2$3</a>").replace(/(^| )(http|news|ftp|mailto|gopher|irc):(\/*)(*)/g,"$1<a href='$2:$3$4'>$2:$3$4</a>").replace('__NOTOC__','').replace('__NOEDITSECTION__','');};function _strip_inline_wiki(str)
{return str.replace(/\]*\|(.*?)\]\]/g,'$1').replace(/\\]/g,'$1').replace(/''(.*?)''/g,'$1');};function max(a,b)
{if(a>b)return a;else return b;};function min(a,b)
{if(a<b)return a;else return b;};function str_imatch(str_a,str_b)
{var lim=min(str_a.length,str_b.length);for(var i=0;i<lim;i++){if(str_a.charAt(i)!=str_b.charAt(i))return i;}
return i;};function strip_cr(str)
{return str.replace(/\n\r/g,"\n").replace(/\r/g,'');};function html_entities(str)
{return str.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");};var chrsz=8;var hex_tab="0123456789abcdef";function hex_md5(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz));};function core_md5(x,len)
{x|=0x80<<((len)%32);x=len;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;for(var i=0;i<x.length;i+=16)
{var olda=a;var oldb=b;var oldc=c;var oldd=d;a=md5_ff(a,b,c,d,x,7,-680876936);d=md5_ff(d,a,b,c,x,12,-389564586);c=md5_ff(c,d,a,b,x,17,606105819);b=md5_ff(b,c,d,a,x,22,-1044525330);a=md5_ff(a,b,c,d,x,7,-176418897);d=md5_ff(d,a,b,c,x,12,1200080426);c=md5_ff(c,d,a,b,x,17,-1473231341);b=md5_ff(b,c,d,a,x,22,-45705983);a=md5_ff(a,b,c,d,x,7,1770035416);d=md5_ff(d,a,b,c,x,12,-1958414417);c=md5_ff(c,d,a,b,x,17,-42063);b=md5_ff(b,c,d,a,x,22,-1990404162);a=md5_ff(a,b,c,d,x,7,1804603682);d=md5_ff(d,a,b,c,x,12,-40341101);c=md5_ff(c,d,a,b,x,17,-1502002290);b=md5_ff(b,c,d,a,x,22,1236535329);a=md5_gg(a,b,c,d,x,5,-165796510);d=md5_gg(d,a,b,c,x,9,-1069501632);c=md5_gg(c,d,a,b,x,14,643717713);b=md5_gg(b,c,d,a,x,20,-373897302);a=md5_gg(a,b,c,d,x,5,-701558691);d=md5_gg(d,a,b,c,x,9,38016083);c=md5_gg(c,d,a,b,x,14,-660478335);b=md5_gg(b,c,d,a,x,20,-405537848);a=md5_gg(a,b,c,d,x,5,568446438);d=md5_gg(d,a,b,c,x,9,-1019803690);c=md5_gg(c,d,a,b,x,14,-187363961);b=md5_gg(b,c,d,a,x,20,1163531501);a=md5_gg(a,b,c,d,x,5,-1444681467);d=md5_gg(d,a,b,c,x,9,-51403784);c=md5_gg(c,d,a,b,x,14,1735328473);b=md5_gg(b,c,d,a,x,20,-1926607734);a=md5_hh(a,b,c,d,x,4,-378558);d=md5_hh(d,a,b,c,x,11,-2022574463);c=md5_hh(c,d,a,b,x,16,1839030562);b=md5_hh(b,c,d,a,x,23,-35309556);a=md5_hh(a,b,c,d,x,4,-1530992060);d=md5_hh(d,a,b,c,x,11,1272893353);c=md5_hh(c,d,a,b,x,16,-155497632);b=md5_hh(b,c,d,a,x,23,-1094730640);a=md5_hh(a,b,c,d,x,4,681279174);d=md5_hh(d,a,b,c,x,11,-358537222);c=md5_hh(c,d,a,b,x,16,-722521979);b=md5_hh(b,c,d,a,x,23,76029189);a=md5_hh(a,b,c,d,x,4,-640364487);d=md5_hh(d,a,b,c,x,11,-421815835);c=md5_hh(c,d,a,b,x,16,530742520);b=md5_hh(b,c,d,a,x,23,-995338651);a=md5_ii(a,b,c,d,x,6,-198630844);d=md5_ii(d,a,b,c,x,10,1126891415);c=md5_ii(c,d,a,b,x,15,-1416354905);b=md5_ii(b,c,d,a,x,21,-57434055);a=md5_ii(a,b,c,d,x,6,1700485571);d=md5_ii(d,a,b,c,x,10,-1894986606);c=md5_ii(c,d,a,b,x,15,-1051523);b=md5_ii(b,c,d,a,x,21,-2054922799);a=md5_ii(a,b,c,d,x,6,1873313359);d=md5_ii(d,a,b,c,x,10,-30611744);c=md5_ii(c,d,a,b,x,15,-1560198380);b=md5_ii(b,c,d,a,x,21,1309151649);a=md5_ii(a,b,c,d,x,6,-145523070);d=md5_ii(d,a,b,c,x,10,-1120210379);c=md5_ii(c,d,a,b,x,15,718787259);b=md5_ii(b,c,d,a,x,21,-343485551);a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd);}
return Array(a,b,c,d);};function md5_cmn(q,a,b,x,s,t)
{return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b);};function md5_ff(a,b,c,d,x,s,t)
{return md5_cmn((b&c)|((~b)&d),a,b,x,s,t);};function md5_gg(a,b,c,d,x,s,t)
{return md5_cmn((b&d)|(c&(~d)),a,b,x,s,t);};function md5_hh(a,b,c,d,x,s,t)
{return md5_cmn(b^c^d,a,b,x,s,t);};function md5_ii(a,b,c,d,x,s,t)
{return md5_cmn(c^(b|(~d)),a,b,x,s,t);};function safe_add(x,y)
{var lsw=(x&0xFFFF)+(y&0xFFFF);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF);};function bit_rol(num,cnt)
{return(num<<cnt)|(num>>>(32-cnt));};function str2binl(str)
{var bin=Array();var mask=(1<<chrsz)-1;for(var i=0;i<str.length*chrsz;i+=chrsz)
bin|=(str.charCodeAt(i/chrsz)&mask)<<(i%32);return bin;};function binl2hex(binarray)
{var str='';for(var i=0;i<binarray.length*4;i++)
{str+=hex_tab.charAt((binarray>>((i%4)*8+4))&0xF)+
hex_tab.charAt((binarray>>((i%4)*8))&0xF);}
return str;}; // </math>// --FILE BOUNDARY-- // --FILE BOUNDARY-- // --FILE BOUNDARY--
/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
function b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
function hex_hmac_md5(k, d)
  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_md5(k, d)
  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_md5(k, d, e)
  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
/*
 * Perform a simple self-test to see if the VM is working
 */
function md5_vm_test()
{
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
/*
 * Calculate the MD5 of a raw string
 */
function rstr_md5(s)
{
  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
}
/*
 * Calculate the HMAC-MD5, of a key and some data (raw strings)
 */
function rstr_hmac_md5(key, data)
{
  var bkey = rstr2binl(key);
  if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++)
  {
    ipad = bkey ^ 0x36363636;
    opad = bkey ^ 0x5C5C5C5C;
  }
  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
}
/*
 * Convert a raw string to a hex string
 */
function rstr2hex(input)
{
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var output = "";
  var x;
  for(var i = 0; i < input.length; i++)
  {
    x = input.charCodeAt(i);
    output += hex_tab.charAt((x >>> 4) & 0x0F)
           +  hex_tab.charAt( x        & 0x0F);
  }
  return output;
}
/*
 * Convert a raw string to a base-64 string
 */
function rstr2b64(input)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var output = "";
  var len = input.length;
  for(var i = 0; i < len; i += 3)
  {
    var triplet = (input.charCodeAt(i) << 16)
                | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
                | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > input.length * 8) output += b64pad;
      else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
    }
  }
  return output;
}
/*
 * Convert a raw string to an arbitrary string encoding
 */
function rstr2any(input, encoding)
{
  var divisor = encoding.length;
  var remainders = Array();
  var i, q, x, quotient;
  /* Convert to an array of 16-bit big-endian values, forming the dividend */
  var dividend = Array(input.length / 2);
  for(i = 0; i < dividend.length; i++)
  {
    dividend = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
  }
  /*
   * Repeatedly perform a long division. The binary array forms the dividend,
   * the length of the encoding is the divisor. Once computed, the quotient
   * forms the dividend for the next step. We stop when the dividend is zero.
   * All remainders are stored for later use.
   */
  while(dividend.length > 0)
  {
    quotient = Array();
    x = 0;
    for(i = 0; i < dividend.length; i++)
    {
      x = (x << 16) + dividend;
      q = Math.floor(x / divisor);
      x -= q * divisor;
      if(quotient.length > 0 || q > 0)
        quotient = q;
    }
    remainders = x;
    dividend = quotient;
  }
  /* Convert the remainders to the output string */
  var output = "";
  for(i = remainders.length - 1; i >= 0; i--)
    output += encoding.charAt(remainders);
  return output;
}
/*
 * Encode a string as utf-8.
 * For efficiency, this assumes the input is valid utf-16.
 */
function str2rstr_utf8(input)
{
  var output = "";
  var i = -1;
  var x, y;
  while(++i < input.length)
  {
    /* Decode utf-16 surrogate pairs */
    x = input.charCodeAt(i);
    y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
    if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
    {
      x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
      i++;
    }
    /* Encode output as utf-8 */
    if(x <= 0x7F)
      output += String.fromCharCode(x);
    else if(x <= 0x7FF)
      output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
                                    0x80 | ( x         & 0x3F));
    else if(x <= 0xFFFF)
      output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
                                    0x80 | ((x >>> 6 ) & 0x3F),
                                    0x80 | ( x         & 0x3F));
    else if(x <= 0x1FFFFF)
      output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
                                    0x80 | ((x >>> 12) & 0x3F),
                                    0x80 | ((x >>> 6 ) & 0x3F),
                                    0x80 | ( x         & 0x3F));
  }
  return output;
}
/*
 * Encode a string as utf-16
 */
function str2rstr_utf16le(input)
{
  var output = "";
  for(var i = 0; i < input.length; i++)
    output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
                                  (input.charCodeAt(i) >>> 8) & 0xFF);
  return output;
}
function str2rstr_utf16be(input)
{
  var output = "";
  for(var i = 0; i < input.length; i++)
    output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
                                   input.charCodeAt(i)        & 0xFF);
  return output;
}
/*
 * Convert a raw string to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */
function rstr2binl(input)
{
  var output = Array(input.length >> 2);
  for(var i = 0; i < output.length; i++)
    output = 0;
  for(var i = 0; i < input.length * 8; i += 8)
    output |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
  return output;
}
/*
 * Convert an array of little-endian words to a string
 */
function binl2rstr(input)
{
  var output = "";
  for(var i = 0; i < input.length * 32; i += 8)
    output += String.fromCharCode((input >>> (i % 32)) & 0xFF);
  return output;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */
function binl_md5(x, len)
{
  /* append padding */
  x |= 0x80 << ((len) % 32);
  x = len;
  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;
  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5_ff(a, b, c, d, x, 7 , -680876936);
    d = md5_ff(d, a, b, c, x, 12, -389564586);
    c = md5_ff(c, d, a, b, x, 17,  606105819);
    b = md5_ff(b, c, d, a, x, 22, -1044525330);
    a = md5_ff(a, b, c, d, x, 7 , -176418897);
    d = md5_ff(d, a, b, c, x, 12,  1200080426);
    c = md5_ff(c, d, a, b, x, 17, -1473231341);
    b = md5_ff(b, c, d, a, x, 22, -45705983);
    a = md5_ff(a, b, c, d, x, 7 ,  1770035416);
    d = md5_ff(d, a, b, c, x, 12, -1958414417);
    c = md5_ff(c, d, a, b, x, 17, -42063);
    b = md5_ff(b, c, d, a, x, 22, -1990404162);
    a = md5_ff(a, b, c, d, x, 7 ,  1804603682);
    d = md5_ff(d, a, b, c, x, 12, -40341101);
    c = md5_ff(c, d, a, b, x, 17, -1502002290);
    b = md5_ff(b, c, d, a, x, 22,  1236535329);
    a = md5_gg(a, b, c, d, x, 5 , -165796510);
    d = md5_gg(d, a, b, c, x, 9 , -1069501632);
    c = md5_gg(c, d, a, b, x, 14,  643717713);
    b = md5_gg(b, c, d, a, x, 20, -373897302);
    a = md5_gg(a, b, c, d, x, 5 , -701558691);
    d = md5_gg(d, a, b, c, x, 9 ,  38016083);
    c = md5_gg(c, d, a, b, x, 14, -660478335);
    b = md5_gg(b, c, d, a, x, 20, -405537848);
    a = md5_gg(a, b, c, d, x, 5 ,  568446438);
    d = md5_gg(d, a, b, c, x, 9 , -1019803690);
    c = md5_gg(c, d, a, b, x, 14, -187363961);
    b = md5_gg(b, c, d, a, x, 20,  1163531501);
    a = md5_gg(a, b, c, d, x, 5 , -1444681467);
    d = md5_gg(d, a, b, c, x, 9 , -51403784);
    c = md5_gg(c, d, a, b, x, 14,  1735328473);
    b = md5_gg(b, c, d, a, x, 20, -1926607734);
    a = md5_hh(a, b, c, d, x, 4 , -378558);
    d = md5_hh(d, a, b, c, x, 11, -2022574463);
    c = md5_hh(c, d, a, b, x, 16,  1839030562);
    b = md5_hh(b, c, d, a, x, 23, -35309556);
    a = md5_hh(a, b, c, d, x, 4 , -1530992060);
    d = md5_hh(d, a, b, c, x, 11,  1272893353);
    c = md5_hh(c, d, a, b, x, 16, -155497632);
    b = md5_hh(b, c, d, a, x, 23, -1094730640);
    a = md5_hh(a, b, c, d, x, 4 ,  681279174);
    d = md5_hh(d, a, b, c, x, 11, -358537222);
    c = md5_hh(c, d, a, b, x, 16, -722521979);
    b = md5_hh(b, c, d, a, x, 23,  76029189);
    a = md5_hh(a, b, c, d, x, 4 , -640364487);
    d = md5_hh(d, a, b, c, x, 11, -421815835);
    c = md5_hh(c, d, a, b, x, 16,  530742520);
    b = md5_hh(b, c, d, a, x, 23, -995338651);
    a = md5_ii(a, b, c, d, x, 6 , -198630844);
    d = md5_ii(d, a, b, c, x, 10,  1126891415);
    c = md5_ii(c, d, a, b, x, 15, -1416354905);
    b = md5_ii(b, c, d, a, x, 21, -57434055);
    a = md5_ii(a, b, c, d, x, 6 ,  1700485571);
    d = md5_ii(d, a, b, c, x, 10, -1894986606);
    c = md5_ii(c, d, a, b, x, 15, -1051523);
    b = md5_ii(b, c, d, a, x, 21, -2054922799);
    a = md5_ii(a, b, c, d, x, 6 ,  1873313359);
    d = md5_ii(d, a, b, c, x, 10, -30611744);
    c = md5_ii(c, d, a, b, x, 15, -1560198380);
    b = md5_ii(b, c, d, a, x, 21,  1309151649);
    a = md5_ii(a, b, c, d, x, 6 , -145523070);
    d = md5_ii(d, a, b, c, x, 10, -1120210379);
    c = md5_ii(c, d, a, b, x, 15,  718787259);
    b = md5_ii(b, c, d, a, x, 21, -343485551);
    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */
function md5_cmn(q, a, b, x, s, t)
{
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */
function bit_rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}// --FILE BOUNDARY-- // --FILE BOUNDARY-- // --FILE BOUNDARY--
//\/////
//\  overLIB 4.21 - You may not remove or change this notice.
//\  Copyright Erik Bosrup 1998-2004. All rights reserved.
//\
//\  Contributors are listed on the homepage.
//\  This file might be old, always check for the latest version at:
//\  http://www.bosrup.com/web/overlib/
//\
//\  Please read the license agreement (available through the link above)
//\  before using overLIB. Direct any licensing questions to erik@bosrup.com.
//\
//\  Do not sell this as your own work or remove this copyright notice. 
//\  For full details on copying or changing this script please read the
//\  license agreement at the link above. Please give credit on sites that
//\  use overLIB and submit changes of the script so other people can use
//\  them as well.
//\/////
//\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
var olLoaded=0,pmStart=10000000,pmUpper=10001000,pmCount=pmStart+1,pmt='',pms=new Array(),olInfo=new Info('4.21',1),FREPLACE=0,FBEFORE=1,FAFTER=2,FALTERNATE=3,FCHAIN=4,olHideForm=0,olHautoFlag=0,olVautoFlag=0,hookPts=new Array(),postParse=new Array(),cmdLine=new Array(),runTime=new Array();
registerCommands('donothing,inarray,caparray,sticky,background,noclose,caption,left,right,center,offsetx,offsety,fgcolor,bgcolor,textcolor,capcolor,closecolor,width,border,cellpad,status,autostatus,autostatuscap,height,closetext,snapx,snapy,fixx,fixy,relx,rely,fgbackground,bgbackground,padx,pady,fullhtml,above,below,capicon,textfont,captionfont,closefont,textsize,captionsize,closesize,timeout,function,delay,hauto,vauto,closeclick,wrap,followmouse,mouseoff,closetitle,cssoff,compatmode,cssclass,fgclass,bgclass,textfontclass,captionfontclass,closefontclass');
if(typeof ol_fgcolor=='undefined')var ol_fgcolor="#CCCCFF";if(typeof ol_bgcolor=='undefined')var ol_bgcolor="#333399";if(typeof ol_textcolor=='undefined')var ol_textcolor="#000000";if(typeof ol_capcolor=='undefined')var ol_capcolor="#FFFFFF";if(typeof ol_closecolor=='undefined')var ol_closecolor="#9999FF";if(typeof ol_textfont=='undefined')var ol_textfont="Verdana,Arial,Helvetica";if(typeof ol_captionfont=='undefined')var ol_captionfont="Verdana,Arial,Helvetica";if(typeof ol_closefont=='undefined')var ol_closefont="Verdana,Arial,Helvetica";if(typeof ol_textsize=='undefined')var ol_textsize="1";if(typeof ol_captionsize=='undefined')var ol_captionsize="1";if(typeof ol_closesize=='undefined')var ol_closesize="1";if(typeof ol_width=='undefined')var ol_width="200";if(typeof ol_border=='undefined')var ol_border="1";if(typeof ol_cellpad=='undefined')var ol_cellpad=2;if(typeof ol_offsetx=='undefined')var ol_offsetx=10;if(typeof ol_offsety=='undefined')var ol_offsety=10;if(typeof ol_text=='undefined')var ol_text="Default Text";if(typeof ol_cap=='undefined')var ol_cap="";if(typeof ol_sticky=='undefined')var ol_sticky=0;if(typeof ol_background=='undefined')var ol_background="";if(typeof ol_close=='undefined')var ol_close="Close";if(typeof ol_hpos=='undefined')var ol_hpos=RIGHT;if(typeof ol_status=='undefined')var ol_status="";if(typeof ol_autostatus=='undefined')var ol_autostatus=0;if(typeof ol_height=='undefined')var ol_height=-1;if(typeof ol_snapx=='undefined')var ol_snapx=0;if(typeof ol_snapy=='undefined')var ol_snapy=0;if(typeof ol_fixx=='undefined')var ol_fixx=-1;if(typeof ol_fixy=='undefined')var ol_fixy=-1;if(typeof ol_relx=='undefined')var ol_relx=null;if(typeof ol_rely=='undefined')var ol_rely=null;if(typeof ol_fgbackground=='undefined')var ol_fgbackground="";if(typeof ol_bgbackground=='undefined')var ol_bgbackground="";if(typeof ol_padxl=='undefined')var ol_padxl=1;if(typeof ol_padxr=='undefined')var ol_padxr=1;if(typeof ol_padyt=='undefined')var ol_padyt=1;if(typeof ol_padyb=='undefined')var ol_padyb=1;if(typeof ol_fullhtml=='undefined')var ol_fullhtml=0;if(typeof ol_vpos=='undefined')var ol_vpos=BELOW;if(typeof ol_aboveheight=='undefined')var ol_aboveheight=0;if(typeof ol_capicon=='undefined')var ol_capicon="";if(typeof ol_frame=='undefined')var ol_frame=self;if(typeof ol_timeout=='undefined')var ol_timeout=0;if(typeof ol_function=='undefined')var ol_function=null;if(typeof ol_delay=='undefined')var ol_delay=0;if(typeof ol_hauto=='undefined')var ol_hauto=0;if(typeof ol_vauto=='undefined')var ol_vauto=0;if(typeof ol_closeclick=='undefined')var ol_closeclick=0;if(typeof ol_wrap=='undefined')var ol_wrap=0;if(typeof ol_followmouse=='undefined')var ol_followmouse=1;if(typeof ol_mouseoff=='undefined')var ol_mouseoff=0;if(typeof ol_closetitle=='undefined')var ol_closetitle='Close';if(typeof ol_compatmode=='undefined')var ol_compatmode=0;if(typeof ol_css=='undefined')var ol_css=CSSOFF;if(typeof ol_fgclass=='undefined')var ol_fgclass="";if(typeof ol_bgclass=='undefined')var ol_bgclass="";if(typeof ol_textfontclass=='undefined')var ol_textfontclass="";if(typeof ol_captionfontclass=='undefined')var ol_captionfontclass="";if(typeof ol_closefontclass=='undefined')var ol_closefontclass="";
if(typeof ol_texts=='undefined')var ol_texts=new Array("Text 0","Text 1");if(typeof ol_caps=='undefined')var ol_caps=new Array("Caption 0","Caption 1");
var o3_text="",o3_cap="",o3_sticky=0,o3_background="",o3_close="Close",o3_hpos=RIGHT,o3_offsetx=2,o3_offsety=2,o3_fgcolor="",o3_bgcolor="",o3_textcolor="",o3_capcolor="",o3_closecolor="",o3_width=100,o3_border=1,o3_cellpad=2,o3_status="",o3_autostatus=0,o3_height=-1,o3_snapx=0,o3_snapy=0,o3_fixx=-1,o3_fixy=-1,o3_relx=null,o3_rely=null,o3_fgbackground="",o3_bgbackground="",o3_padxl=0,o3_padxr=0,o3_padyt=0,o3_padyb=0,o3_fullhtml=0,o3_vpos=BELOW,o3_aboveheight=0,o3_capicon="",o3_textfont="Verdana,Arial,Helvetica",o3_captionfont="Verdana,Arial,Helvetica",o3_closefont="Verdana,Arial,Helvetica",o3_textsize="1",o3_captionsize="1",o3_closesize="1",o3_frame=self,o3_timeout=0,o3_timerid=0,o3_allowmove=0,o3_function=null,o3_delay=0,o3_delayid=0,o3_hauto=0,o3_vauto=0,o3_closeclick=0,o3_wrap=0,o3_followmouse=1,o3_mouseoff=0,o3_closetitle='',o3_compatmode=0,o3_css=CSSOFF,o3_fgclass="",o3_bgclass="",o3_textfontclass="",o3_captionfontclass="",o3_closefontclass="";
var o3_x=0,o3_y=0,o3_showingsticky=0,o3_removecounter=0;
var over=null,fnRef,hoveringSwitch=false,olHideDelay;
var isMac=(navigator.userAgent.indexOf("Mac")!=-1),olOp=(navigator.userAgent.toLowerCase().indexOf('opera')>-1&&document.createTextNode),olNs4=(navigator.appName=='Netscape'&&parseInt(navigator.appVersion)==4),olNs6=(document.getElementById)?true:false,olKq=(olNs6&&/konqueror/i.test(navigator.userAgent)),olIe4=(document.all)?true:false,olIe5=false,olIe55=false,docRoot='document.body';
if(olNs4){var oW=window.innerWidth;var oH=window.innerHeight;window.onresize=function(){if(oW!=window.innerWidth||oH!=window.innerHeight)location.reload();}}
if(olIe4){var agent=navigator.userAgent;if(/MSIE/.test(agent)){var versNum=parseFloat(agent.match(/MSIE(\d\.\d+)\.*/i));if(versNum>=5){olIe5=true;olIe55=(versNum>=5.5&&!olOp)?true:false;if(olNs6)olNs6=false;}}
if(olNs6)olIe4=false;}
if(document.compatMode&&document.compatMode=='CSS1Compat'){docRoot=((olIe4&&!olOp)?'document.documentElement':docRoot);}
if(window.addEventListener)window.addEventListener("load",OLonLoad_handler,false);else if(window.attachEvent)window.attachEvent("onload",OLonLoad_handler);
var capExtent;
function overlib(){if(!olLoaded||isExclusive(overlib.arguments))return true;if(olCheckMouseCapture)olMouseCapture();if(over){over=(typeof over.id!='string')?o3_frame.document.all:over;cClick();}
olHideDelay=0;o3_text=ol_text;o3_cap=ol_cap;o3_sticky=ol_sticky;o3_background=ol_background;o3_close=ol_close;o3_hpos=ol_hpos;o3_offsetx=ol_offsetx;o3_offsety=ol_offsety;o3_fgcolor=ol_fgcolor;o3_bgcolor=ol_bgcolor;o3_textcolor=ol_textcolor;o3_capcolor=ol_capcolor;o3_closecolor=ol_closecolor;o3_width=ol_width;o3_border=ol_border;o3_cellpad=ol_cellpad;o3_status=ol_status;o3_autostatus=ol_autostatus;o3_height=ol_height;o3_snapx=ol_snapx;o3_snapy=ol_snapy;o3_fixx=ol_fixx;o3_fixy=ol_fixy;o3_relx=ol_relx;o3_rely=ol_rely;o3_fgbackground=ol_fgbackground;o3_bgbackground=ol_bgbackground;o3_padxl=ol_padxl;o3_padxr=ol_padxr;o3_padyt=ol_padyt;o3_padyb=ol_padyb;o3_fullhtml=ol_fullhtml;o3_vpos=ol_vpos;o3_aboveheight=ol_aboveheight;o3_capicon=ol_capicon;o3_textfont=ol_textfont;o3_captionfont=ol_captionfont;o3_closefont=ol_closefont;o3_textsize=ol_textsize;o3_captionsize=ol_captionsize;o3_closesize=ol_closesize;o3_timeout=ol_timeout;o3_function=ol_function;o3_delay=ol_delay;o3_hauto=ol_hauto;o3_vauto=ol_vauto;o3_closeclick=ol_closeclick;o3_wrap=ol_wrap;o3_followmouse=ol_followmouse;o3_mouseoff=ol_mouseoff;o3_closetitle=ol_closetitle;o3_css=ol_css;o3_compatmode=ol_compatmode;o3_fgclass=ol_fgclass;o3_bgclass=ol_bgclass;o3_textfontclass=ol_textfontclass;o3_captionfontclass=ol_captionfontclass;o3_closefontclass=ol_closefontclass;
setRunTimeVariables();
fnRef='';
o3_frame=ol_frame;
if(!(over=createDivContainer()))return false;
parseTokens('o3_',overlib.arguments);if(!postParseChecks())return false;
if(o3_delay==0){return runHook("olMain",FREPLACE);}else{o3_delayid=setTimeout("runHook('olMain',FREPLACE)",o3_delay);return false;}}
function nd(time){if(olLoaded&&!isExclusive()){hideDelay(time);
if(o3_removecounter>=1){o3_showingsticky=0 };
if(o3_showingsticky==0){o3_allowmove=0;if(over!=null&&o3_timerid==0)runHook("hideObject",FREPLACE,over);}else{o3_removecounter++;}}
return true;}
function cClick(){if(olLoaded){runHook("hideObject",FREPLACE,over);o3_showingsticky=0;}
return false;}
function overlib_pagedefaults(){parseTokens('ol_',overlib_pagedefaults.arguments);}
function olMain(){var layerhtml,styleType;runHook("olMain",FBEFORE);
if(o3_background!=""||o3_fullhtml){
layerhtml=runHook('ol_content_background',FALTERNATE,o3_css,o3_text,o3_background,o3_fullhtml);}else{
styleType=(pms=="cssoff"||pms=="cssclass");
if(o3_fgbackground!="")o3_fgbackground="background=\""+o3_fgbackground+"\"";if(o3_bgbackground!="")o3_bgbackground=(styleType?"background=\""+o3_bgbackground+"\"":o3_bgbackground);
if(o3_fgcolor!="")o3_fgcolor=(styleType?"bgcolor=\""+o3_fgcolor+"\"":o3_fgcolor);if(o3_bgcolor!="")o3_bgcolor=(styleType?"bgcolor=\""+o3_bgcolor+"\"":o3_bgcolor);
if(o3_height>0)o3_height=(styleType?"height=\""+o3_height+"\"":o3_height);else o3_height="";
if(o3_cap==""){
layerhtml=runHook('ol_content_simple',FALTERNATE,o3_css,o3_text);}else{
if(o3_sticky){
layerhtml=runHook('ol_content_caption',FALTERNATE,o3_css,o3_text,o3_cap,o3_close);}else{
layerhtml=runHook('ol_content_caption',FALTERNATE,o3_css,o3_text,o3_cap,"");}}}
if(o3_sticky){if(o3_timerid>0){clearTimeout(o3_timerid);o3_timerid=0;}
o3_showingsticky=1;o3_removecounter=0;}
if(!runHook("createPopup",FREPLACE,layerhtml))return false;
if(o3_autostatus>0){o3_status=o3_text;if(o3_autostatus>1)o3_status=o3_cap;}
o3_allowmove=0;
if(o3_timeout>0){if(o3_timerid>0)clearTimeout(o3_timerid);o3_timerid=setTimeout("cClick()",o3_timeout);}
runHook("disp",FREPLACE,o3_status);runHook("olMain",FAFTER);
return(olOp&&event&&event.type=='mouseover'&&!o3_status)?'':(o3_status!='');}
function ol_content_simple(text){var cpIsMultiple=/,/.test(o3_cellpad);var txt='<table width="'+o3_width+'" border="0" cellpadding="'+o3_border+'" cellspacing="0" '+(o3_bgclass?'class="'+o3_bgclass+'"':o3_bgcolor+' '+o3_height)+'><tr><td><table width="100%" border="0" '+((olNs4||!cpIsMultiple)?'cellpadding="'+o3_cellpad+'" ':'')+'cellspacing="0" '+(o3_fgclass?'class="'+o3_fgclass+'"':o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'><tr><td valign="TOP"'+(o3_textfontclass?' class="'+o3_textfontclass+'">':((!olNs4&&cpIsMultiple)?' style="'+setCellPadStr(o3_cellpad)+'">':'>'))+(o3_textfontclass?'':wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'</td></tr></table></td></tr></table>';
set_background("");return txt;}
function ol_content_caption(text,title,close){var nameId,txt,cpIsMultiple=/,/.test(o3_cellpad);var closing,closeevent;
closing="";closeevent="onmouseover";if(o3_closeclick==1)closeevent=(o3_closetitle?"title='"+o3_closetitle+"'":"")+" onclick";if(o3_capicon!=""){nameId=' hspace=\"5\"'+' align=\"middle\" alt=\"\"';if(typeof o3_dragimg!='undefined'&&o3_dragimg)nameId=' hspace=\"5\"'+' name=\"'+o3_dragimg+'\" id=\"'+o3_dragimg+'\" align=\"middle\" alt=\"Drag Enabled\" title=\"Drag Enabled\"';o3_capicon='<img src=\"'+o3_capicon+'\"'+nameId+' />';}
if(close!="")
closing='<td '+(!o3_compatmode&&o3_closefontclass?'class="'+o3_closefontclass:'align="RIGHT')+'"><a href="javascript:return '+fnRef+'cClick();"'+((o3_compatmode&&o3_closefontclass)?' class="'+o3_closefontclass+'" ':' ')+closeevent+'="return '+fnRef+'cClick();">'+(o3_closefontclass?'':wrapStr(0,o3_closesize,'close'))+close+(o3_closefontclass?'':wrapStr(1,o3_closesize,'close'))+'</a></td>';txt='<table width="'+o3_width+'" border="0" cellpadding="'+o3_border+'" cellspacing="0" '+(o3_bgclass?'class="'+o3_bgclass+'"':o3_bgcolor+' '+o3_bgbackground+' '+o3_height)+'><tr><td><table width="100%" border="0" cellpadding="2" cellspacing="0"><tr><td'+(o3_captionfontclass?' class="'+o3_captionfontclass+'">':'>')+(o3_captionfontclass?'':'<b>'+wrapStr(0,o3_captionsize,'caption'))+o3_capicon+title+(o3_captionfontclass?'':wrapStr(1,o3_captionsize)+'</b>')+'</td>'+closing+'</tr></table><table width="100%" border="0" '+((olNs4||!cpIsMultiple)?'cellpadding="'+o3_cellpad+'" ':'')+'cellspacing="0" '+(o3_fgclass?'class="'+o3_fgclass+'"':o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'><tr><td valign="TOP"'+(o3_textfontclass?' class="'+o3_textfontclass+'">' :((!olNs4&&cpIsMultiple)?' style="'+setCellPadStr(o3_cellpad)+'">':'>'))+(o3_textfontclass?'':wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'</td></tr></table></td></tr></table>';
set_background("");return txt;}
function ol_content_background(text,picture,hasfullhtml){if(hasfullhtml){txt=text;}else{txt='<table width="'+o3_width+'" border="0" cellpadding="0" cellspacing="0" height="'+o3_height+'"><tr><td colspan="3" height="'+o3_padyt+'"></td></tr><tr><td width="'+o3_padxl+'"></td><td valign="TOP" width="'+(o3_width-o3_padxl-o3_padxr)+(o3_textfontclass?'" class="'+o3_textfontclass:'')+'">'+(o3_textfontclass?'':wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'</td><td width="'+o3_padxr+'"></td></tr><tr><td colspan="3" height="'+o3_padyb+'"></td></tr></table>';}
set_background(picture);return txt;}
function set_background(pic){if(pic==""){if(olNs4){over.background.src=null;}else if(over.style){over.style.backgroundImage="none";}
}else{if(olNs4){over.background.src=pic;}else if(over.style){over.style.width=o3_width+'px';over.style.backgroundImage="url("+pic+")";}}}
var olShowId=-1;
function disp(statustext){runHook("disp",FBEFORE);
if(o3_allowmove==0){runHook("placeLayer",FREPLACE);(olNs6&&olShowId<0)?olShowId=setTimeout("runHook('showObject',FREPLACE,over)",1):runHook("showObject",FREPLACE,over);o3_allowmove=(o3_sticky||o3_followmouse==0)?0:1;}
runHook("disp",FAFTER);
if(statustext!="")self.status=statustext;}
function createPopup(lyrContent){runHook("createPopup",FBEFORE);
if(o3_wrap){var wd,ww,theObj=(olNs4?over:over.style);theObj.top=theObj.left=((olIe4&&!olOp)?0:-10000)+(!olNs4?'px':0);layerWrite(lyrContent);wd=(olNs4?over.clip.width:over.offsetWidth);if(wd>(ww=windowWidth())){lyrContent=lyrContent.replace(/\&nbsp;/g,' ');o3_width=ww;o3_wrap=0;}}
layerWrite(lyrContent);
if(o3_wrap)o3_width=(olNs4?over.clip.width:over.offsetWidth);
runHook("createPopup",FAFTER,lyrContent);
return true;}
function placeLayer(){var placeX,placeY,widthFix=0;
if(o3_frame.innerWidth)widthFix=18;iwidth=windowWidth();
winoffset=(olIe4)?eval('o3_frame.'+docRoot+'.scrollLeft'):o3_frame.pageXOffset;
placeX=runHook('horizontalPlacement',FCHAIN,iwidth,winoffset,widthFix);
if(o3_frame.innerHeight){iheight=o3_frame.innerHeight;}else if(eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientHeight=='number'")&&eval('o3_frame.'+docRoot+'.clientHeight')){iheight=eval('o3_frame.'+docRoot+'.clientHeight');}
scrolloffset=(olIe4)?eval('o3_frame.'+docRoot+'.scrollTop'):o3_frame.pageYOffset;placeY=runHook('verticalPlacement',FCHAIN,iheight,scrolloffset);
repositionTo(over,placeX,placeY);}
function olMouseMove(e){var e=(e)?e:event;
if(e.pageX){o3_x=e.pageX;o3_y=e.pageY;}else if(e.clientX){o3_x=eval('e.clientX+o3_frame.'+docRoot+'.scrollLeft');o3_y=eval('e.clientY+o3_frame.'+docRoot+'.scrollTop');}
if(o3_allowmove==1)runHook("placeLayer",FREPLACE);
if(hoveringSwitch&&!olNs4&&runHook("cursorOff",FREPLACE)){(olHideDelay?hideDelay(olHideDelay):cClick());hoveringSwitch=!hoveringSwitch;}}
function no_overlib(){return ver3fix;}
function olMouseCapture(){capExtent=document;var fN,str='',l,k,f,wMv,sS,mseHandler=olMouseMove;var re=/function*(\w*)\(/;
wMv=(!olIe4&&window.onmousemove);if(document.onmousemove||wMv){if(wMv)capExtent=window;f=capExtent.onmousemove.toString();fN=f.match(re);if(fN==null){str=f+'(e);';}else if(fN=='anonymous'||fN=='olMouseMove'||(wMv&&fN=='onmousemove')){if(!olOp&&wMv){l=f.indexOf('{')+1;k=f.lastIndexOf('}');sS=f.substring(l,k);if((l=sS.indexOf('('))!=-1){sS=sS.substring(0,l).replace(/^\s+/,'').replace(/\s+$/,'');if(eval("typeof "+sS+"=='undefined'"))window.onmousemove=null;else str=sS+'(e);';}}
if(!str){olCheckMouseCapture=false;return;}
}else{if(fN)str=fN+'(e);';else{l=f.indexOf('{')+1;k=f.lastIndexOf('}');str=f.substring(l,k)+'\n';}}
str+='olMouseMove(e);';mseHandler=new Function('e',str);}
capExtent.onmousemove=mseHandler;if(olNs4)capExtent.captureEvents(Event.MOUSEMOVE);}
function parseTokens(pf,ar){
var v,i,mode=-1,par=(pf!='ol_'),fnMark=(par&&!ar.length?1:0);
for(i=0;i<ar.length;i++){if(mode<0){
if(typeof ar=='number'&&ar>pmStart&&ar<pmUpper){fnMark=(par?1:0);i--;}else{switch(pf){case 'ol_':
ol_text=ar.toString();break;default:
o3_text=ar.toString();}}
mode=0;}else{
if(ar>=pmCount||ar==DONOTHING){continue;}
if(ar==INARRAY){fnMark=0;eval(pf+'text=ol_texts+'].toString()');continue;}
if(ar==CAPARRAY){eval(pf+'cap=ol_caps+'].toString()');continue;}
if(ar==STICKY){if(pf!='ol_')eval(pf+'sticky=1');continue;}
if(ar==BACKGROUND){eval(pf+'background="'+ar+'"');continue;}
if(ar==NOCLOSE){if(pf!='ol_')opt_NOCLOSE();continue;}
if(ar==CAPTION){eval(pf+"cap='"+escSglQuote(ar)+"'");continue;}
if(ar==CENTER||ar==LEFT||ar==RIGHT){eval(pf+'hpos='+ar);if(pf!='ol_')olHautoFlag=1;continue;}
if(ar==OFFSETX){eval(pf+'offsetx='+ar);continue;}
if(ar==OFFSETY){eval(pf+'offsety='+ar);continue;}
if(ar==FGCOLOR){eval(pf+'fgcolor="'+ar+'"');continue;}
if(ar==BGCOLOR){eval(pf+'bgcolor="'+ar+'"');continue;}
if(ar==TEXTCOLOR){eval(pf+'textcolor="'+ar+'"');continue;}
if(ar==CAPCOLOR){eval(pf+'capcolor="'+ar+'"');continue;}
if(ar==CLOSECOLOR){eval(pf+'closecolor="'+ar+'"');continue;}
if(ar==WIDTH){eval(pf+'width='+ar);continue;}
if(ar==BORDER){eval(pf+'border='+ar);continue;}
if(ar==CELLPAD){i=opt_MULTIPLEARGS(++i,ar,(pf+'cellpad'));continue;}
if(ar==STATUS){eval(pf+"status='"+escSglQuote(ar)+"'");continue;}
if(ar==AUTOSTATUS){eval(pf+'autostatus=('+pf+'autostatus==1)?0:1');continue;}
if(ar==AUTOSTATUSCAP){eval(pf+'autostatus=('+pf+'autostatus==2)?0:2');continue;}
if(ar==HEIGHT){eval(pf+'height='+pf+'aboveheight='+ar);continue;}
if(ar==CLOSETEXT){eval(pf+"close='"+escSglQuote(ar)+"'");continue;}
if(ar==SNAPX){eval(pf+'snapx='+ar);continue;}
if(ar==SNAPY){eval(pf+'snapy='+ar);continue;}
if(ar==FIXX){eval(pf+'fixx='+ar);continue;}
if(ar==FIXY){eval(pf+'fixy='+ar);continue;}
if(ar==RELX){eval(pf+'relx='+ar);continue;}
if(ar==RELY){eval(pf+'rely='+ar);continue;}
if(ar==FGBACKGROUND){eval(pf+'fgbackground="'+ar+'"');continue;}
if(ar==BGBACKGROUND){eval(pf+'bgbackground="'+ar+'"');continue;}
if(ar==PADX){eval(pf+'padxl='+ar);eval(pf+'padxr='+ar);continue;}
if(ar==PADY){eval(pf+'padyt='+ar);eval(pf+'padyb='+ar);continue;}
if(ar==FULLHTML){if(pf!='ol_')eval(pf+'fullhtml=1');continue;}
if(ar==BELOW||ar==ABOVE){eval(pf+'vpos='+ar);if(pf!='ol_')olVautoFlag=1;continue;}
if(ar==CAPICON){eval(pf+'capicon="'+ar+'"');continue;}
if(ar==TEXTFONT){eval(pf+"textfont='"+escSglQuote(ar)+"'");continue;}
if(ar==CAPTIONFONT){eval(pf+"captionfont='"+escSglQuote(ar)+"'");continue;}
if(ar==CLOSEFONT){eval(pf+"closefont='"+escSglQuote(ar)+"'");continue;}
if(ar==TEXTSIZE){eval(pf+'textsize="'+ar+'"');continue;}
if(ar==CAPTIONSIZE){eval(pf+'captionsize="'+ar+'"');continue;}
if(ar==CLOSESIZE){eval(pf+'closesize="'+ar+'"');continue;}
if(ar==TIMEOUT){eval(pf+'timeout='+ar);continue;}
if(ar==FUNCTION){if(pf=='ol_'){if(typeof ar!='number'){v=ar;ol_function=(typeof v=='function'?v:null);}}else{fnMark=0;v=null;if(typeof ar!='number')v=ar; opt_FUNCTION(v);} continue;}
if(ar==DELAY){eval(pf+'delay='+ar);continue;}
if(ar==HAUTO){eval(pf+'hauto=('+pf+'hauto==0)?1:0');continue;}
if(ar==VAUTO){eval(pf+'vauto=('+pf+'vauto==0)?1:0');continue;}
if(ar==CLOSECLICK){eval(pf+'closeclick=('+pf+'closeclick==0)?1:0');continue;}
if(ar==WRAP){eval(pf+'wrap=('+pf+'wrap==0)?1:0');continue;}
if(ar==FOLLOWMOUSE){eval(pf+'followmouse=('+pf+'followmouse==1)?0:1');continue;}
if(ar==MOUSEOFF){eval(pf+'mouseoff=('+pf+'mouseoff==0)?1:0');v=ar;if(pf!='ol_'&&eval(pf+'mouseoff')&&typeof v=='number'&&(v<pmStart||v>pmUpper))olHideDelay=ar;continue;}
if(ar==CLOSETITLE){eval(pf+"closetitle='"+escSglQuote(ar)+"'");continue;}
if(ar==CSSOFF||ar==CSSCLASS){eval(pf+'css='+ar);continue;}
if(ar==COMPATMODE){eval(pf+'compatmode=('+pf+'compatmode==0)?1:0');continue;}
if(ar==FGCLASS){eval(pf+'fgclass="'+ar+'"');continue;}
if(ar==BGCLASS){eval(pf+'bgclass="'+ar+'"');continue;}
if(ar==TEXTFONTCLASS){eval(pf+'textfontclass="'+ar+'"');continue;}
if(ar==CAPTIONFONTCLASS){eval(pf+'captionfontclass="'+ar+'"');continue;}
if(ar==CLOSEFONTCLASS){eval(pf+'closefontclass="'+ar+'"');continue;}
i=parseCmdLine(pf,i,ar);}}
if(fnMark&&o3_function)o3_text=o3_function();
if((pf=='o3_')&&o3_wrap){o3_width=0;
var tReg=/<.*\n*>/ig;if(!tReg.test(o3_text))o3_text=o3_text.replace(/+/g,'&nbsp;');if(!tReg.test(o3_cap))o3_cap=o3_cap.replace(/+/g,'&nbsp;');}
if((pf=='o3_')&&o3_sticky){if(!o3_close&&(o3_frame!=ol_frame))o3_close=ol_close;if(o3_mouseoff&&(o3_frame==ol_frame))opt_NOCLOSE(' ');}}
function layerWrite(txt){txt+="\n";if(olNs4){var lyr=o3_frame.document.layers.document
lyr.write(txt)
lyr.close()
}else if(typeof over.innerHTML!='undefined'){if(olIe5&&isMac)over.innerHTML='';over.innerHTML=txt;}else{range=o3_frame.document.createRange();range.setStartAfter(over);domfrag=range.createContextualFragment(txt);
while(over.hasChildNodes()){over.removeChild(over.lastChild);}
over.appendChild(domfrag);}}
function showObject(obj){runHook("showObject",FBEFORE);
var theObj=(olNs4?obj:obj.style);theObj.visibility='visible';
runHook("showObject",FAFTER);}
function hideObject(obj){runHook("hideObject",FBEFORE);
var theObj=(olNs4?obj:obj.style);if(olNs6&&olShowId>0){clearTimeout(olShowId);olShowId=0;}
theObj.visibility='hidden';theObj.top=theObj.left=((olIe4&&!olOp)?0:-10000)+(!olNs4?'px':0);
if(o3_timerid>0)clearTimeout(o3_timerid);if(o3_delayid>0)clearTimeout(o3_delayid);
o3_timerid=0;o3_delayid=0;self.status="";
if(obj.onmouseout||obj.onmouseover){if(olNs4)obj.releaseEvents(Event.MOUSEOUT||Event.MOUSEOVER);obj.onmouseout=obj.onmouseover=null;}
runHook("hideObject",FAFTER);}
function repositionTo(obj,xL,yL){var theObj=(olNs4?obj:obj.style);theObj.left=xL+(!olNs4?'px':0);theObj.top=yL+(!olNs4?'px':0);}
function cursorOff(){var left=parseInt(over.style.left);var top=parseInt(over.style.top);var right=left+(over.offsetWidth>=parseInt(o3_width)?over.offsetWidth:parseInt(o3_width));var bottom=top+(over.offsetHeight>=o3_aboveheight?over.offsetHeight:o3_aboveheight);
if(o3_x<left||o3_x>right||o3_y<top||o3_y>bottom)return true;
return false;}
function opt_FUNCTION(callme){o3_text=(callme?(typeof callme=='string'?(/.+\(.*\)/.test(callme)?eval(callme):callme):callme()):(o3_function?o3_function():'No Function'));
return 0;}
function opt_NOCLOSE(unused){if(!unused)o3_close="";
if(olNs4){over.captureEvents(Event.MOUSEOUT||Event.MOUSEOVER);over.onmouseover=function(){if(o3_timerid>0){clearTimeout(o3_timerid);o3_timerid=0;} }
over.onmouseout=function(e){if(olHideDelay)hideDelay(olHideDelay);else cClick(e);}
}else{over.onmouseover=function(){hoveringSwitch=true;if(o3_timerid>0){clearTimeout(o3_timerid);o3_timerid=0;} }}
return 0;}
function opt_MULTIPLEARGS(i,args,parameter){var k=i,re,pV,str='';
for(k=i;k<args.length;k++){if(typeof args=='number'&&args>pmStart)break;str+=args+',';}
if(str)str=str.substring(0,--str.length);
k--;pV=(olNs4&&/cellpad/i.test(parameter))?str.split(','):str;eval(parameter+'="'+pV+'"');
return k;}
function nbspCleanup(){if(o3_wrap){o3_text=o3_text.replace(/\&nbsp;/g,' ');o3_cap=o3_cap.replace(/\&nbsp;/g,' ');}}
function escSglQuote(str){return str.toString().replace(/'/g,"\\'");}
function OLonLoad_handler(e){var re=/\w+\(.*\)+/g,olre=/overlib\(|nd\(|cClick\(/,fn,l,i;
if(!olLoaded)olLoaded=1;
if(window.removeEventListener&&e.eventPhase==3)window.removeEventListener("load",OLonLoad_handler,false);else if(window.detachEvent){window.detachEvent("onload",OLonLoad_handler);var fN=document.body.getAttribute('onload');if(fN){fN=fN.toString().match(re);if(fN&&fN.length){for(i=0;i<fN.length;i++){if(/anonymous/.test(fN))continue;while((l=fN.search(/\)+/))!=-1){fn=fN.substring(0,l+1);fN=fN.substring(l+2);if(olre.test(fn))eval(fn);}}}}}}
function wrapStr(endWrap,fontSizeStr,whichString){var fontStr,fontColor,isClose=((whichString=='close')?1:0),hasDims=/+$/.test(fontSizeStr);fontSizeStr=(olNs4)?(!hasDims?fontSizeStr:'1'):fontSizeStr;if(endWrap)return(hasDims&&!olNs4)?(isClose?'</span>':'</div>'):'</font>';else{fontStr='o3_'+whichString+'font';fontColor='o3_'+((whichString=='caption')? 'cap':whichString)+'color';return(hasDims&&!olNs4)?(isClose?'<span style="font-family: '+quoteMultiNameFonts(eval(fontStr))+';color: '+eval(fontColor)+';font-size: '+fontSizeStr+';">':'<div style="font-family: '+quoteMultiNameFonts(eval(fontStr))+';color: '+eval(fontColor)+';font-size: '+fontSizeStr+';">'):'<font face="'+eval(fontStr)+'" color="'+eval(fontColor)+'" size="'+(parseInt(fontSizeStr)>7?'7':fontSizeStr)+'">';}}
function quoteMultiNameFonts(theFont){var v,pM=theFont.split(',');for(var i=0;i<pM.length;i++){v=pM;v=v.replace(/^\s+/,'').replace(/\s+$/,'');if(/\s/.test(v)&&!//.test(v)){v="\'"+v+"\'";pM=v;}}
return pM.join();}
function isExclusive(args){return false;}
function setCellPadStr(parameter){var Str='',j=0,ary=new Array(),top,bottom,left,right;
Str+='padding: ';ary=parameter.replace(/\s+/g,'').split(',');
switch(ary.length){case 2:
top=bottom=ary;left=right=ary;break;case 3:
top=ary;left=right=ary;bottom=ary;break;case 4:
top=ary;right=ary;bottom=ary;left=ary;break;}
Str+=((ary.length==1)?ary+'px;':top+'px '+right+'px '+bottom+'px '+left+'px;');
return Str;}
function hideDelay(time){if(time&&!o3_delay){if(o3_timerid>0)clearTimeout(o3_timerid);
o3_timerid=setTimeout("cClick()",(o3_timeout=time));}}
function horizontalPlacement(browserWidth,horizontalScrollAmount,widthFix){var placeX,iwidth=browserWidth,winoffset=horizontalScrollAmount;var parsedWidth=parseInt(o3_width);
if(o3_fixx>-1||o3_relx!=null){
placeX=(o3_relx!=null?( o3_relx<0?winoffset+o3_relx+iwidth-parsedWidth-widthFix:winoffset+o3_relx):o3_fixx);}else{
if(o3_hauto==1){if((o3_x-winoffset)>(iwidth/2)){o3_hpos=LEFT;}else{o3_hpos=RIGHT;}}
if(o3_hpos==CENTER){placeX=o3_x+o3_offsetx-(parsedWidth/2);
if(placeX<winoffset)placeX=winoffset;}
if(o3_hpos==RIGHT){placeX=o3_x+o3_offsetx;
if((placeX+parsedWidth)>(winoffset+iwidth-widthFix)){placeX=iwidth+winoffset-parsedWidth-widthFix;if(placeX<0)placeX=0;}}
if(o3_hpos==LEFT){placeX=o3_x-o3_offsetx-parsedWidth;if(placeX<winoffset)placeX=winoffset;}
if(o3_snapx>1){var snapping=placeX % o3_snapx;
if(o3_hpos==LEFT){placeX=placeX-(o3_snapx+snapping);}else{
placeX=placeX+(o3_snapx-snapping);}
if(placeX<winoffset)placeX=winoffset;}}
return placeX;}
function verticalPlacement(browserHeight,verticalScrollAmount){var placeY,iheight=browserHeight,scrolloffset=verticalScrollAmount;var parsedHeight=(o3_aboveheight?parseInt(o3_aboveheight):(olNs4?over.clip.height:over.offsetHeight));
if(o3_fixy>-1||o3_rely!=null){
placeY=(o3_rely!=null?(o3_rely<0?scrolloffset+o3_rely+iheight-parsedHeight:scrolloffset+o3_rely):o3_fixy);}else{
if(o3_vauto==1){if((o3_y-scrolloffset)>(iheight/2)&&o3_vpos==BELOW&&(o3_y+parsedHeight+o3_offsety-(scrolloffset+iheight)>0)){o3_vpos=ABOVE;}else if(o3_vpos==ABOVE&&(o3_y-(parsedHeight+o3_offsety)-scrolloffset<0)){o3_vpos=BELOW;}}
if(o3_vpos==ABOVE){if(o3_aboveheight==0)o3_aboveheight=parsedHeight;
placeY=o3_y-(o3_aboveheight+o3_offsety);if(placeY<scrolloffset)placeY=scrolloffset;}else{
placeY=o3_y+o3_offsety;}
if(o3_snapy>1){var snapping=placeY % o3_snapy;
if(o3_aboveheight>0&&o3_vpos==ABOVE){placeY=placeY-(o3_snapy+snapping);}else{placeY=placeY+(o3_snapy-snapping);}
if(placeY<scrolloffset)placeY=scrolloffset;}}
return placeY;}
function checkPositionFlags(){if(olHautoFlag)olHautoFlag=o3_hauto=0;if(olVautoFlag)olVautoFlag=o3_vauto=0;return true;}
function windowWidth(){var w;if(o3_frame.innerWidth)w=o3_frame.innerWidth;else if(eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientWidth=='number'")&&eval('o3_frame.'+docRoot+'.clientWidth'))
w=eval('o3_frame.'+docRoot+'.clientWidth');return w;}
function createDivContainer(id,frm,zValue){id=(id||'overDiv'),frm=(frm||o3_frame),zValue=(zValue||1000);var objRef,divContainer=layerReference(id);
if(divContainer==null){if(olNs4){divContainer=frm.document.layers=new Layer(window.innerWidth,frm);objRef=divContainer;}else{var body=(olIe4?frm.document.all.tags('BODY'):frm.document.getElementsByTagName("BODY"));if(olIe4&&!document.getElementById){body.insertAdjacentHTML("beforeEnd",'<div id="'+id+'"></div>');divContainer=layerReference(id);}else{divContainer=frm.document.createElement("DIV");divContainer.id=id;body.appendChild(divContainer);}
objRef=divContainer.style;}
objRef.position='absolute';objRef.visibility='hidden';objRef.zIndex=zValue;if(olIe4&&!olOp)objRef.left=objRef.top='0px';else objRef.left=objRef.top=-10000+(!olNs4?'px':0);}
return divContainer;}
function layerReference(id){return(olNs4?o3_frame.document.layers:(document.all?o3_frame.document.all:o3_frame.document.getElementById(id)));}
function isFunction(fnRef){var rtn=true;
if(typeof fnRef=='object'){for(var i=0;i<fnRef.length;i++){if(typeof fnRef=='function')continue;rtn=false;break;}
}else if(typeof fnRef!='function'){rtn=false;}
return rtn;}
function argToString(array,strtInd,argName){var jS=strtInd,aS='',ar=array;argName=(argName?argName:'ar');
if(ar.length>jS){for(var k=jS;k<ar.length;k++)aS+=argName+', ';aS=aS.substring(0,aS.length-2);}
return aS;}
function reOrder(hookPt,fnRef,order){var newPt=new Array(),match,i,j;
if(!order||typeof order=='undefined'||typeof order=='number')return hookPt;
if(typeof order=='function'){if(typeof fnRef=='object'){newPt=newPt.concat(fnRef);}else{newPt=fnRef;}
for(i=0;i<hookPt.length;i++){match=false;if(typeof fnRef=='function'&&hookPt==fnRef){continue;}else{for(j=0;j<fnRef.length;j++)if(hookPt==fnRef){match=true;break;}}
if(!match)newPt=hookPt;}
newPt=order;
}else if(typeof order=='object'){if(typeof fnRef=='object'){newPt=newPt.concat(fnRef);}else{newPt=fnRef;}
for(j=0;j<hookPt.length;j++){match=false;if(typeof fnRef=='function'&&hookPt==fnRef){continue;}else{for(i=0;i<fnRef.length;i++)if(hookPt==fnRef){match=true;break;}}
if(!match)newPt=hookPt;}
for(i=0;i<newPt.length;i++)hookPt=newPt;newPt.length=0;
for(j=0;j<hookPt.length;j++){match=false;for(i=0;i<order.length;i++){if(hookPt==order){match=true;break;}}
if(!match)newPt=hookPt;}
newPt=newPt.concat(order);}
hookPt=newPt;
return hookPt;}
function setRunTimeVariables(){if(typeof runTime!='undefined'&&runTime.length){for(var k=0;k<runTime.length;k++){runTime();}}}
function parseCmdLine(pf,i,args){if(typeof cmdLine!='undefined'&&cmdLine.length){for(var k=0;k<cmdLine.length;k++){var j=cmdLine(pf,i,args);if(j >-1){i=j;break;}}}
return i;}
function postParseChecks(pf,args){if(typeof postParse!='undefined'&&postParse.length){for(var k=0;k<postParse.length;k++){if(postParse(pf,args))continue;return false;}}
return true;}
function registerCommands(cmdStr){if(typeof cmdStr!='string')return;
var pM=cmdStr.split(',');pms=pms.concat(pM);
for(var i=0;i< pM.length;i++){eval(pM.toUpperCase()+'='+pmCount++);}}
function registerNoParameterCommands(cmdStr){if(!cmdStr&&typeof cmdStr!='string')return;pmt=(!pmt)?cmdStr:pmt+','+cmdStr;}
function registerHook(fnHookTo,fnRef,hookType,optPm){var hookPt,last=typeof optPm;
if(fnHookTo=='plgIn'||fnHookTo=='postParse')return;if(typeof hookPts=='undefined')hookPts=new FunctionReference();
hookPt=hookPts;
if(hookType!=null){if(hookType==FREPLACE){hookPt.ovload=fnRef;if(fnHookTo.indexOf('ol_content_')>-1)hookPt.alt]=fnRef;
}else if(hookType==FBEFORE||hookType==FAFTER){var hookPt=(hookType==1?hookPt.before:hookPt.after);
if(typeof fnRef=='object'){hookPt=hookPt.concat(fnRef);}else{hookPt=fnRef;}
if(optPm)hookPt=reOrder(hookPt,fnRef,optPm);
}else if(hookType==FALTERNATE){if(last=='number')hookPt.alt]=fnRef;}else if(hookType==FCHAIN){hookPt=hookPt.chain;if(typeof fnRef=='object')hookPt=hookPt.concat(fnRef);else hookPt=fnRef;}
return;}}
function registerRunTimeFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){runTime=runTime.concat(fn);}else{runTime=fn;}}}
function registerCmdLineFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){cmdLine=cmdLine.concat(fn);}else{cmdLine=fn;}}}
function registerPostParseFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){postParse=postParse.concat(fn);}else{postParse=fn;}}}
function runHook(fnHookTo,hookType){var l=hookPts,k,rtnVal=null,optPm,arS,ar=runHook.arguments;
if(hookType==FREPLACE){arS=argToString(ar,2);
if(typeof l=='undefined'||!(l=l.ovload))rtnVal=eval(fnHookTo+'('+arS+')');else rtnVal=eval('l('+arS+')');
}else if(hookType==FBEFORE||hookType==FAFTER){if(typeof l!='undefined'){l=(hookType==1?l.before:l.after);
if(l.length){arS=argToString(ar,2);for(var k=0;k<l.length;k++)eval('l('+arS+')');}}
}else if(hookType==FALTERNATE){optPm=ar;arS=argToString(ar,3);
if(typeof l=='undefined'||(l=l.alt])=='undefined'){rtnVal=eval(fnHookTo+'('+arS+')');}else{rtnVal=eval('l('+arS+')');}
}else if(hookType==FCHAIN){arS=argToString(ar,2);l=l.chain;
for(k=l.length;k>0;k--)if((rtnVal=eval('l('+arS+')'))!=void(0))break;}
return rtnVal;}
function FunctionReference(){this.ovload=null;this.before=new Array();this.after=new Array();this.alt=new Array();this.chain=new Array();}
function Info(version,prerelease){this.version=version;this.prerelease=prerelease;
this.simpleversion=Math.round(this.version*100);this.major=parseInt(this.simpleversion/100);this.minor=parseInt(this.simpleversion/10)-this.major * 10;this.revision=parseInt(this.simpleversion)-this.major * 100-this.minor * 10;this.meets=meets;}
function meets(reqdVersion){return(!reqdVersion)?false:this.simpleversion>=Math.round(100*parseFloat(reqdVersion));}
registerHook("ol_content_simple",ol_content_simple,FALTERNATE,CSSOFF);registerHook("ol_content_caption",ol_content_caption,FALTERNATE,CSSOFF);registerHook("ol_content_background",ol_content_background,FALTERNATE,CSSOFF);registerHook("ol_content_simple",ol_content_simple,FALTERNATE,CSSCLASS);registerHook("ol_content_caption",ol_content_caption,FALTERNATE,CSSCLASS);registerHook("ol_content_background",ol_content_background,FALTERNATE,CSSCLASS);registerPostParseFunction(checkPositionFlags);registerHook("hideObject",nbspCleanup,FAFTER);registerHook("horizontalPlacement",horizontalPlacement,FCHAIN);registerHook("verticalPlacement",verticalPlacement,FCHAIN);if(olNs4||(olIe5&&isMac)||olKq)olLoaded=1;registerNoParameterCommands('sticky,autostatus,autostatuscap,fullhtml,hauto,vauto,closeclick,wrap,followmouse,mouseoff,compatmode');
var olCheckMouseCapture=true;if((olNs4||olNs6||olIe4)){olMouseCapture();}else{overlib=no_overlib;nd=no_overlib;ver3fix=true;}