:User:Hall Monitor/popups.js

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=[0-9])') ;

var contributions=RegExp('(title=|/)Special:Contributions(&target=|/|/User:)(.*)') ;

var emailuser= RegExp('(title=|/)Special:Emailuser' +'(&target=|/|/User:)(.*)') ;

var talk=RegExp('Talk:', 'i') ;

// (^|\[\[)image: *([^|\]]*[^|\] ]) *

// (^|\[\[)image: *([^|\]]*[^|\] ])([^0-9\]]*([0-9]+) *px)?

// $4 = 120 as in 120px

var imageRegex= RegExp('(^|\\[\\[)image: *([^|\\]]*[^|\\] ])([^0-9\\]]*([0-9]+) *px)?',

'img') ;

var imageRegexBracketCount = 4;

var categoryRegex= RegExp('\\[\\[category: *([^|\\]]*[^|\\] ]) *', '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[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}' +

'(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])');

var oldidRegex=RegExp('[?&]oldid=([0-9]*)');

var splitLoc=window.location.href.split('/');

var thisWiki=splitLoc[2];

var wikimediaWiki=RegExp('wiki\([pm]edia\|source\|books\)\.org\|wiktionary\.org').test(thisWiki);

var localWiki=RegExp('^localhost').test(thisWiki);

var protocol=splitLoc[0].split(':')[0];

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='';

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+'/wiki/';

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[i];

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', "' ⋅ '");

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', false);

newOption('popupImagesToggleSize',true);

// browser-specific hacks

// if (typeof window.opera != 'undefined') {}

if ((self.navigator.appName)=='Konqueror') {

dpopupNavLinkSeparator=' • ';

} else if ((self.navigator.appName).indexOf("Microsoft")!=-1) {

dpopupNavLinkSeparator=' · ';

}

// 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 [this];

// without this, we have

// 'ab'.parenSplit(/a|(b)/) != 'ab'.split(/a|(b)/)

for(var i=0; i

if (typeof m[i]=='undefined') m[i]='';

}

return [this.substring(0,m.index)]

.concat(m.slice(1))

.concat(this.substring(m.index+m[0].length).parenSplit(re));

};

} else {

String.prototype.parenSplit=function (re) {return this.split(re);};

}

/////////////////////

// HTML GENERATION //

/////////////////////

// generate html for popup image

//

// where n=popupImageId

function imageHTML(article) {

var ret='';

popupImageId++;

ret += '';

ret += '

+ 'style="display: none;">';

ret += '';

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[3];

return article;

}

var email=emailuser.exec(h);

if (email != null) {

article='User:'+email[3];

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[2];

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[1];

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 = ['popupWarnRedir','popupGubbins','popupLiveOptions','popupPreview','popupFixDab'];

for (var i=0; i

return html;

};

function popupUnsimplifyHTML() {

var html = '';

html += '';

html += '
';

html += '

+ 'style="cursor:pointer; border: thin dotted black" '

+ 'title="Download preview data from the Wikipedia servers">'

+ 'Get preview data'

+ '';

html += '';

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) ? '<<' : '>>',

'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='
';

html += '';

html += '

html += (eval(varstring)) ? 'checked="checked" ' : '';

html += 'onClick="javascript:popupToggleVar(' + "'" + varstring + "'" +

')">' + label + '';

return html;

};

function popupLiveOptionsHTML() {

var html = '';

html += '
';

html += '

html += 'style="border: thin dotted black; cursor: pointer" ';

html += 'onClick="javascript:popupToggleShowOptions()">';

html += 'Options ';

html += '';

html += '

';

return html;

};

function mainLinkHTML(article, hint, oldid) {

var html='';

var visibleMainLinkText=safeDecodeURI(article);

if ( getValueOf('popupSimplifyMainLink') ) {

var s= visibleMainLinkText.split('/');

visibleMainLinkText = s[s.length-1];

if (visibleMainLinkText == '' && s.length > 1) {

// shouldn't happen...

visibleMainLinkText=s[s.length-2];

}

}

if (typeof hint =='undefined') hint=safeDecodeURI(article);

if (oldid) hint = 'Revision '+ oldid +' of ' + hint;

html+='';

html+=addPopupShortcut(titledWikiLink(article, 'view', visibleMainLinkText, hint, oldid), ' ');

if (oldid)

html+='|' + titledWikiLink(article, 'view', 'cur',

'Current revision of '+visibleMainLinkText);

html+='';

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 '';};

function addLinkProperty(html, property) {

// take "... 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 ['+key+']$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 report this!';

};

// 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 +

'' + addPopupShortcut(wikiLink(t, 'view', 'talk'), 't')

+ '' +

'|' + wikiLink(t, 'edit', 'edit') +

'|' + addPopupShortcut(wikiLink(t, 'edit§ion=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§ion=new', 'new'), '+');

html += addPopupShortcut(popupNavLinkSeparator + wikiLink(article, 'history', 'history'), 'h');

html += popupNavLinkSeparator + wikiLink(article, 'unwatch', 'un')

+ '|' + addPopupShortcut(wikiLink(article, 'watch', 'watch'), 'w');

html += popupNavLinkSeparator +

'' + addPopupShortcut(wikiLink(ta, 'view', 'article'), 'a')

+ '' +

'|' + 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 += '
' + userNavLinksHTML(article);

html += '
' + editingNavLinksHTML(article, oldid);

html += '
' + miscNavLinksHTML(article);

if (getValueOf('popupAdminLinks')) html += '
' + 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<-[findPictureInCache]->-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[i].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

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§ion=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 '' + text + '';

};

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 '' + text + '';

};

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='['+chs + chs.toLowerCase()+']';

var currentArticleRegexBit=chs+cA.substring(1);

currentArticleRegexBit=currentArticleRegexBit

.split(RegExp('[_ ]', 'g')).join('[_ ]');

// autoedit=s~\[\[([Cc]ad)\]\]~$1~g;s~\[\[([Cc]AD)[|]~[[Computer-aided%20design|~g

var lk=titledWikiLink(removeAnchor(articleFromURL(location.href)),

'edit', text, hint);

var cmd='s~\\[\\[('+currentArticleRegexBit+')\\]\\]~$1~g;';

cmd += 's~\\[\\[('+currentArticleRegexBit+')[|]~[['+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 += '


';

if (popupFixRedirs && typeof autoEdit != 'undefined' && autoEdit) {

ret += addPopupShortcut(

changeLinkTargetLink(redirMatch, 'Redirects', 'Fix this redirect',

'Bypassing redirect from [[' + window.currentArticle.split('_').join(' ')

+ ']] to ' + redirMatch + '',

'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 '
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 '' + text + '';

};

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 +' 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('^[a-z]*:|^[Ss]pecial:|^[Ii]mage|^[Cc]ategory');

for (var i=1; i

if (typeof splitted[i] == typeof 'string' && splitted[i].length>0 && !omitRegex.test(splitted[i])) {

ret.push(changeLinkTargetLink(splitted[i],

splitted[i].split(' ').join(' '),

'Disambiguate the this link to '+splitted[i]+'',

'Popups-assisted disambiguation from [[' +

window.currentArticle.split('_').join(' ') + ']] to [['+

splitted[i] + ']]',

'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='


Click to disambiguate this link to:
';

html+=list[0];

for (var i=1; i

return html;

};

function popupFilterPageSize(data) {return formatBytes(data.length);};

function popupFilterCountLinks(data) {var num=countLinks(data);return String(num) + ' wikiLink' + ((num!=1)?'s':'');};

function popupFilterCountImages(data) {var num=countImages(data);return String(num) + ' image' + ((num!=1)?'s':'');};

function popupFilterCountCategories(data) {

var num=countCategories(data);

return String(num) + ' 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[i](data);if (s!='') pageInfoArray.push(s);}

for (var i=0; i

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[2];

var pxWidth=match[4];

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", "Wikipedia", "Wikipedia talk", "Image",

"Image talk", "MediaWiki", "MediaWiki talk", "Template", "Template talk", "Help", "Help talk",

"Category", "Category talk", "Portal", "Portal talk"];

var wikiTalkNamespaces=["Talk", "User talk", "Wikipedia talk", "Image talk", "MediaWiki talk",

"Template talk", "Help talk", "Category talk", "Portal talk"];

var wikiNamespacesWithTalk=[ null, // NB root (article) namespace is omitted

"User", "Wikipedia", "Image", "MediaWiki", "Template", "Help", "Category", "Portal"];

// returns /^(Talk|User[_ ]talk|Wikipedia[_ ]talk|...):$/

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[0]+':'+article).split(' ').join('_');

for (var i=0; i< wikiNamespacesWithTalk.length; ++i) {

if (splitted[1]==wikiNamespacesWithTalk[i]) {

splitted[1]=wikiTalkNamespaces[i];

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[0].length > 0) return null;

if (splitted[1]==wikiTalkNamespaces[0]) {

splitted[1]=''; return splitted.join(':').substring(2).split(' ').join('_');

}

for (var i=1; i< wikiTalkNamespaces.length; ++i) {

if (splitted[1]==wikiTalkNamespaces[i]

|| splitted[1]==wikiTalkNamespaces[i].split(' ').join('_')) {

splitted[1]=wikiNamespacesWithTalk[i];

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[list.length-1];

};

// 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('.')[0];

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

var from=decodeExtras[i].from;

var to=decodeExtras[i].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

var from=decodeExtras[i].from;

var to=decodeExtras[i].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

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

var url;

if (imageSources[i].thumb)

url=imageThumbURL(image, imageSources[i].wiki, imageSources[i].width);

else

url=imageURL(image, imageSources[i].wiki);

for (var j=0; j

if (url == gImageCache[j]) {

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

var url = imageUrls[i];

imageArray[i]=new Image();

imageArray[i].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

if (array[i]==value) return array[i+1];

}

return null;

};

function findThis(array, value) {

if (typeof array.length == 'undefined') return null;

for (var i=0; i

if (array[i]==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[i].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[0];

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[0] = new Image();

imageArray[0].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[elementId] == 'undefined') timer=null;

else timer=popupHTMLTimers[elementId];

if (popupElement != null) {

if(timer) clearInterval(timer);

popupHTMLTimers[elementId]=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[elementId] = loopFunction;

if (!timer) {

var doThis = 'popupHTMLLoopFunctions["'+elementId+'"]()';

popupHTMLTimers[elementId] = 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[i])) {

// stop all the gubbins, assign the image and return

clearInterval(popupImageTimer);

if(isImage(gImage)) {

popupImage.src=imageArray[i].src;

popupImage.width=popupImageSize;

popupImage.style.display='inline';

// should we check to see if it's already there? maybe...

gImageCache.push(imageArray[i].src);

setPopupImageLink(gImage, imageSources[i].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[i].src=''; // this is a REALLY BAD IDEA

delete imageArray[i];

//imageArray[i] = 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

var a=anchors[i];

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

// |

// [wikiMarkupToAddressFragment]

// |

// | mouseOverWikiLink (gets an "address fragment",

// | | no processing needed)

// \->-loadThisImage---<----loadImages

// |

// [image(Thumb)URL]-->--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

if (links[i]==window.lastPopupLinkSelected) startlink=i;

}

}

for (var j=0; j

var i=(startLink + j) % links.length;

if (links[i].getAttribute('popupkey')==letter)

{

if (evt.preventDefault) evt.preventDefault();

links[i].focus();

window.lastPopupLinkSelected=links[i];

}

}

};

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[0].className='popupBorderTable';

tables[1].className='popupTable';

var fonts=over.getElementsByTagName('font');

fonts[0].className='popupFont';

fonts[0].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[1];

var trailingRubbish=redirMatch[2];

++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('^[ \\n]*[#]redirect[: \\n]*\\[\\[([^\\]]*)\\]\\]\\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('
' + 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 ...

and ...

// * 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('', '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('[{][{][^}\\s|]*box[ _]begin' +

'(.|\\n)*[^{\\s|]*box[ _]end *[}][}]',

'gi'), '');

// float_begin, ... float_end

data=data.replace(RegExp('[{][{][^}\\s|]*float[ _]begin' +

'(.|\\n)*[^{\\s|]*float[ _]end.*?[}][}]',

'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 User:dbenbenn

// i think we should match:

// image: ...... where ....... is consists of repetitions of any of:

// 1. not [ or ]

// 2. (not ])*

// 3. [ (not ])* ]

var imagedetector

='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) *:[^\\n]*','g'), '\n');

// or html tables // this doesn't cope with embedded tables

//data=data.replace(RegExp(']*>([\\n\\s]|[^<]|<[^/]|

// may this is good enough?

data=data.replace(RegExp('(.|\\n.)*?\\n?\\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])*''[.!?\\s]*\\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('^__[A-Z_]*__ *$', '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('^[\\s\\n]*'), '');

stuff=(RegExp('^([^\\n]|\\n[^\\n\\s])*')).exec(data);

if (stuff)

data = stuff[0];

/// 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[0]=data[0].replace(RegExp('^\\s*'), '');

var notSentenceEnds=RegExp('([^.][a-z][.][a-z]|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 = '


' + newhtml;

setPopupHTML(newhtml, 'popupPreview');

}

};

function fixSentenceEnds(strs, reg) {

// take an array of strings, strs

// join strs[i] to strs[i+1] & strs[i+2] if strs[i] matches regex reg

for (var i=0; i

if (reg.test(strs[i])) {

a=[];

for (var j=0; j

if (j

if (j==i) a[i]=strs[i]+strs[i+1]+strs[i+2];

if (j>i+2) a[j-2]=strs[j];

}

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[1]);

} 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

data=cmdList[i].action(data, cmdList[i]);

}

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 [p].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

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='The "' + button.value +

'" button has been automatically clicked.' +

' Please wait for the next page to load.';

document.title='('+document.title+')';

headings[0].parentNode.insertBefore(div, headings[0]);

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 = "
";

LivePreviewHTML = '';

//LivePreviewHTML = '';

LivePreviewHTML += '

';

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||'/wiki/';

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=''+wpUserSignature+'';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[0].match(/^(={1,6})(.*)\1(.*)$/)){p=false;this._endline(''+_parse_inline_nowiki(h_match[2])+''+h_match[3]);}else if(this.lines[0].match(/^[*#:;]/)){p=false;this._parse_list();}else if(this.lines[0].charAt(0)==' '){p=false;this._parse_pre();}else if(this.lines[0].substr(0,2)=='{|'){p=false;this._parse_table();}else if(this.lines[0].match(/^----+$/)){p=false;this._endline('


');}else if(this.lines[0].match(wpBlockImage)){p=false;this._parse_block_image();}else{if(this.lines[0]==){if(p=(this.lines.length>1&&this.lines[1]==)){this._endline('


');}}else{if(!p){this.html+='

';p=true;}

this.html+=_parse_inline_nowiki(this.lines[0])+' ';}

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[0].match(/^([*#:;]+)(.*)$/))){this.lines.shift();imatch=str_imatch(prev,l_match[1]);for(var i=prev.length-1;i>=imatch;i--){if(prev.charAt(i)=='*'){this.html+='';}else if(prev.charAt(i)=='#'){this.html+=''}else{this.html+='';switch(l_match[1].charAt(i)){case'':case'*':case'#':this.html+='';}}}

for(var i=imatch;i';}else if(l_match[1].charAt(i)=='#'){this.html+='

    ';}else{switch(prev.charAt(i)){case'':case'*':case'#':this.html+='
    ';}

    this.html+='';}}

    switch(l_match[1].charAt(l_match[1].length-1)){case'*':case'#':this.html+='

  1. '+_parse_inline_nowiki(l_match[2]);break;case';':if(dt_match=l_match[2].match(/(.*?) (:.*?)$/)){this.html+=_parse_inline_nowiki(dt_match[1]);this.lines.unshift(dt_match[2]);break;}

    case':':this.html+=_parse_inline_nowiki(l_match[2]);}

    prev=l_match[1];}

    for(i=prev.length-1;i>=0;i--){if(prev.charAt(i)=='*'){this.html+='';}else if(prev.charAt(i)=='#'){this.html+='

';}else{this.html+='';}}};this._parse_table=function()

{var table_match;if(table_match=this.lines[0].match(/^\{\|( .*)$/)){this._endline('');}else this._endline('

');do{if(this.lines[0].charAt(0)=='|'){switch(this.lines[0].charAt(1)){case'}':this._endline('
');return;case'-':this._endline('');break;default:this._parse_table_data();}}else if(this.lines[0].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[1]=='|+'){this.html+='

if(typeof td_match[3]!='undefined'){this.html+=' '+td_match[3];td_line=td_match[4].split('||');}else{td_line=td_match[2].split('||');}

this.html+='>';while(td_line.length>1){this.lines.unshift(td_match[1]+td_line.pop());}

this.html+=_parse_inline_nowiki(td_line[0]);var td=new WikiCode;var table_count=0;while(this.lines.length){if(this.lines[0].charAt(0)=='|'){if(table_count==0)break;else if(this.lines[0].charAt(1)=='}')table_count--;}else if(this.lines[0].charAt(0)=='!'&&table_count==0){break;}else if(this.lines[0].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+='

';do{this._endline(_parse_inline_nowiki(this.lines[0].substring(1,this.lines[0].length))+"\n");}while(this.lines.length&&this.lines[0].charAt(0)==' ');this.html+='
';};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[0];var caption=attr[attr.length-1];var width,w_match;var thumb=false;var frame=false;var center=false;var align=;var html=;do{if(w_match=attr[0].match(/^(\d*)px$/)){width=w_match[1];}else switch(attr[0]){case'thumb':case'thumbnail':thumb=true;case'frame':frame=true;break;case'none':case'right':case'left':center=false;align=attr[0];break;case'center':center=true;align='none';}

attr.shift();}while(attr.length);if(frame){if(align=='')align='right';html+="

";if(thumb){if(!width)width=wpDefaultThumbWidth;html+="
";html+=_make_image(filename,caption,width);html+="
"+_parse_inline_nowiki(caption)+"
";}else{html+='
';html+=_make_image(filename,caption);html+="
"+_parse_inline_nowiki(caption)+"
";}

html+='

';}else if(align!=''){html+="
"+_make_image(filename,caption,width)+"
";}else{return _make_image(filename,caption,width);}

if(center){return"

"+html+'
';}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('',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=""+caption+"";}else{img=wpImageNamespace+':'+filename+" (images disabled)";}

caption=_strip_inline_wiki(caption);return""+img+"";};function _parse_inline_images(str)

{var start,substart=0,nestlev=0;var loop,close,open,wiki,html;while(-1!=(start=str.indexOf('',substart))){if(str.substr(start+2).match(RegExp('^'+wpImageNamespace+':','i'))){loop=true;substart=start;do{substart+=2;close=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[1]);str=str.replace(aux_match[0],"");}

return str.replace(/(.*?)(.*?)/g,'$1$2').replace(/(.*?)(.*?)/g,'$1$2').replace(/(.*?)(.*?)/g,'$1$2').replace(/(.*?)/g,'$1').replace(/(.*?)/g,'$1').replace(/~{5}(?!~)/g,Date()).replace(/~{4}(?!~)/g,wpSignature+' '+Date()).replace(/~{3}(?!~)/g,wpSignature).replace(RegExp('\\[\\[:((?:'+wpCategoryNamespace+'|'+wpInterwikiCodes+'):.*?)\\]\\]','gi'),"$1").replace(RegExp('\\[\\[(?:'+wpCategoryNamespace+'|'+wpInterwikiCodes+'):.*?\\]\\]','gi'),).replace(/\[\[([^|]*?)\]\](\w*)/g,"$1$2").replace(/\[\[(.*?)\|([^\]]+?)\]\](\w*)/g,"$2$3").replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g,"$2").replace(/\[(http|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g,"$4").replace(/\[http:\/\/(.*?)\]/g,"[#]").replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g,"$1:$2$3").replace(/(^| )(http|news|ftp|mailto|gopher|irc):(\/*)([^ $]*)/g,"$1$2:$3$4").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

{var lim=min(str_a.length,str_b.length);for(var i=0;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,"&").replace(//g,">");};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[len>>5]|=0x80<<((len)%32);x[(((len+64)>>>9)<<4)+14]=len;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;for(var i=0;i

{var olda=a;var oldb=b;var oldc=c;var oldd=d;a=md5_ff(a,b,c,d,x[i+0],7,-680876936);d=md5_ff(d,a,b,c,x[i+1],12,-389564586);c=md5_ff(c,d,a,b,x[i+2],17,606105819);b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);a=md5_ff(a,b,c,d,x[i+4],7,-176418897);d=md5_ff(d,a,b,c,x[i+5],12,1200080426);c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);b=md5_ff(b,c,d,a,x[i+7],22,-45705983);a=md5_ff(a,b,c,d,x[i+8],7,1770035416);d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);c=md5_ff(c,d,a,b,x[i+10],17,-42063);b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);a=md5_ff(a,b,c,d,x[i+12],7,1804603682);d=md5_ff(d,a,b,c,x[i+13],12,-40341101);c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);b=md5_ff(b,c,d,a,x[i+15],22,1236535329);a=md5_gg(a,b,c,d,x[i+1],5,-165796510);d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);c=md5_gg(c,d,a,b,x[i+11],14,643717713);b=md5_gg(b,c,d,a,x[i+0],20,-373897302);a=md5_gg(a,b,c,d,x[i+5],5,-701558691);d=md5_gg(d,a,b,c,x[i+10],9,38016083);c=md5_gg(c,d,a,b,x[i+15],14,-660478335);b=md5_gg(b,c,d,a,x[i+4],20,-405537848);a=md5_gg(a,b,c,d,x[i+9],5,568446438);d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);c=md5_gg(c,d,a,b,x[i+3],14,-187363961);b=md5_gg(b,c,d,a,x[i+8],20,1163531501);a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);d=md5_gg(d,a,b,c,x[i+2],9,-51403784);c=md5_gg(c,d,a,b,x[i+7],14,1735328473);b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);a=md5_hh(a,b,c,d,x[i+5],4,-378558);d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);c=md5_hh(c,d,a,b,x[i+11],16,1839030562);b=md5_hh(b,c,d,a,x[i+14],23,-35309556);a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);d=md5_hh(d,a,b,c,x[i+4],11,1272893353);c=md5_hh(c,d,a,b,x[i+7],16,-155497632);b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);a=md5_hh(a,b,c,d,x[i+13],4,681279174);d=md5_hh(d,a,b,c,x[i+0],11,-358537222);c=md5_hh(c,d,a,b,x[i+3],16,-722521979);b=md5_hh(b,c,d,a,x[i+6],23,76029189);a=md5_hh(a,b,c,d,x[i+9],4,-640364487);d=md5_hh(d,a,b,c,x[i+12],11,-421815835);c=md5_hh(c,d,a,b,x[i+15],16,530742520);b=md5_hh(b,c,d,a,x[i+2],23,-995338651);a=md5_ii(a,b,c,d,x[i+0],6,-198630844);d=md5_ii(d,a,b,c,x[i+7],10,1126891415);c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);b=md5_ii(b,c,d,a,x[i+5],21,-57434055);a=md5_ii(a,b,c,d,x[i+12],6,1700485571);d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);c=md5_ii(c,d,a,b,x[i+10],15,-1051523);b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);a=md5_ii(a,b,c,d,x[i+8],6,1873313359);d=md5_ii(d,a,b,c,x[i+15],10,-30611744);c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);b=md5_ii(b,c,d,a,x[i+13],21,1309151649);a=md5_ii(a,b,c,d,x[i+4],6,-145523070);d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);c=md5_ii(c,d,a,b,x[i+2],15,718787259);b=md5_ii(b,c,d,a,x[i+9],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<>>(32-cnt));};function str2binl(str)

{var bin=Array();var mask=(1<

bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32);return bin;};function binl2hex(binarray)

{var str='';for(var i=0;i

{str+=hex_tab.charAt((binarray[i>>2]>>((i%4)*8+4))&0xF)+

hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&0xF);}

return str;}; // // --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[i] = bkey[i] ^ 0x36363636;

opad[i] = bkey[i] ^ 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[i] = (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[i];

q = Math.floor(x / divisor);

x -= q * divisor;

if(quotient.length > 0 || q > 0)

quotient[quotient.length] = q;

}

remainders[remainders.length] = x;

dividend = quotient;

}

/* Convert the remainders to the output string */

var output = "";

for(i = remainders.length - 1; i >= 0; i--)

output += encoding.charAt(remainders[i]);

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[i] = 0;

for(var i = 0; i < input.length * 8; i += 8)

output[i>>5] |= (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>>5] >>> (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[len >> 5] |= 0x80 << ((len) % 32);

x[(((len + 64) >>> 9) << 4) + 14] = 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[i+ 0], 7 , -680876936);

d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);

c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);

b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);

a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);

d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);

c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);

b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);

a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);

d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);

c = md5_ff(c, d, a, b, x[i+10], 17, -42063);

b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);

a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);

d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);

c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);

b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);

a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);

d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);

c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);

b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);

a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);

d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);

c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);

b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);

a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);

d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);

c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);

b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);

a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);

d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);

c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);

b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);

d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);

c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);

b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);

a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);

d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);

c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);

b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);

a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);

d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);

c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);

b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);

a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);

d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);

c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);

b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);

d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);

c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);

b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);

a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);

d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);

c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);

b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);

a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);

d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);

c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);

b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);

a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);

d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);

c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);

b = md5_ii(b, c, d, a, x[i+ 9], 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)[1]);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['overDiv']: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[o3_css-1-pmStart]=="cssoff"||pms[o3_css-1-pmStart]=="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='

)+'cellspacing="0" '+(o3_fgclass?'class="'+o3_fgclass+'"':o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'>
':((!olNs4&&cpIsMultiple)?' style="'+setCellPadStr(o3_cellpad)+'">':'>'))+(o3_textfontclass?:wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'
';

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='';}

if(close!="")

closing=''+(o3_closefontclass?:wrapStr(0,o3_closesize,'close'))+close+(o3_closefontclass?:wrapStr(1,o3_closesize,'close'))+'';txt='

':'>')+(o3_captionfontclass?:''+wrapStr(0,o3_captionsize,'caption'))+o3_capicon+title+(o3_captionfontclass?:wrapStr(1,o3_captionsize)+'')+''+closing+'
)+'cellspacing="0" '+(o3_fgclass?'class="'+o3_fgclass+'"':o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'>
' :((!olNs4&&cpIsMultiple)?' style="'+setCellPadStr(o3_cellpad)+'">':'>'))+(o3_textfontclass?:wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'
';

set_background("");return txt;}

function ol_content_background(text,picture,hasfullhtml){if(hasfullhtml){txt=text;}else{txt='

'+(o3_textfontclass?:wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'
';}

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(/\ /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[1]=='anonymous'||fN[1]=='olMouseMove'||(wMv&&fN[1]=='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[1])str=fN[1]+'(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

if(typeof ar[i]=='number'&&ar[i]>pmStart&&ar[i]

ol_text=ar[i].toString();break;default:

o3_text=ar[i].toString();}}

mode=0;}else{

if(ar[i]>=pmCount||ar[i]==DONOTHING){continue;}

if(ar[i]==INARRAY){fnMark=0;eval(pf+'text=ol_texts['+ar[++i]+'].toString()');continue;}

if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[++i]+'].toString()');continue;}

if(ar[i]==STICKY){if(pf!='ol_')eval(pf+'sticky=1');continue;}

if(ar[i]==BACKGROUND){eval(pf+'background="'+ar[++i]+'"');continue;}

if(ar[i]==NOCLOSE){if(pf!='ol_')opt_NOCLOSE();continue;}

if(ar[i]==CAPTION){eval(pf+"cap='"+escSglQuote(ar[++i])+"'");continue;}

if(ar[i]==CENTER||ar[i]==LEFT||ar[i]==RIGHT){eval(pf+'hpos='+ar[i]);if(pf!='ol_')olHautoFlag=1;continue;}

if(ar[i]==OFFSETX){eval(pf+'offsetx='+ar[++i]);continue;}

if(ar[i]==OFFSETY){eval(pf+'offsety='+ar[++i]);continue;}

if(ar[i]==FGCOLOR){eval(pf+'fgcolor="'+ar[++i]+'"');continue;}

if(ar[i]==BGCOLOR){eval(pf+'bgcolor="'+ar[++i]+'"');continue;}

if(ar[i]==TEXTCOLOR){eval(pf+'textcolor="'+ar[++i]+'"');continue;}

if(ar[i]==CAPCOLOR){eval(pf+'capcolor="'+ar[++i]+'"');continue;}

if(ar[i]==CLOSECOLOR){eval(pf+'closecolor="'+ar[++i]+'"');continue;}

if(ar[i]==WIDTH){eval(pf+'width='+ar[++i]);continue;}

if(ar[i]==BORDER){eval(pf+'border='+ar[++i]);continue;}

if(ar[i]==CELLPAD){i=opt_MULTIPLEARGS(++i,ar,(pf+'cellpad'));continue;}

if(ar[i]==STATUS){eval(pf+"status='"+escSglQuote(ar[++i])+"'");continue;}

if(ar[i]==AUTOSTATUS){eval(pf+'autostatus=('+pf+'autostatus==1)?0:1');continue;}

if(ar[i]==AUTOSTATUSCAP){eval(pf+'autostatus=('+pf+'autostatus==2)?0:2');continue;}

if(ar[i]==HEIGHT){eval(pf+'height='+pf+'aboveheight='+ar[++i]);continue;}

if(ar[i]==CLOSETEXT){eval(pf+"close='"+escSglQuote(ar[++i])+"'");continue;}

if(ar[i]==SNAPX){eval(pf+'snapx='+ar[++i]);continue;}

if(ar[i]==SNAPY){eval(pf+'snapy='+ar[++i]);continue;}

if(ar[i]==FIXX){eval(pf+'fixx='+ar[++i]);continue;}

if(ar[i]==FIXY){eval(pf+'fixy='+ar[++i]);continue;}

if(ar[i]==RELX){eval(pf+'relx='+ar[++i]);continue;}

if(ar[i]==RELY){eval(pf+'rely='+ar[++i]);continue;}

if(ar[i]==FGBACKGROUND){eval(pf+'fgbackground="'+ar[++i]+'"');continue;}

if(ar[i]==BGBACKGROUND){eval(pf+'bgbackground="'+ar[++i]+'"');continue;}

if(ar[i]==PADX){eval(pf+'padxl='+ar[++i]);eval(pf+'padxr='+ar[++i]);continue;}

if(ar[i]==PADY){eval(pf+'padyt='+ar[++i]);eval(pf+'padyb='+ar[++i]);continue;}

if(ar[i]==FULLHTML){if(pf!='ol_')eval(pf+'fullhtml=1');continue;}

if(ar[i]==BELOW||ar[i]==ABOVE){eval(pf+'vpos='+ar[i]);if(pf!='ol_')olVautoFlag=1;continue;}

if(ar[i]==CAPICON){eval(pf+'capicon="'+ar[++i]+'"');continue;}

if(ar[i]==TEXTFONT){eval(pf+"textfont='"+escSglQuote(ar[++i])+"'");continue;}

if(ar[i]==CAPTIONFONT){eval(pf+"captionfont='"+escSglQuote(ar[++i])+"'");continue;}

if(ar[i]==CLOSEFONT){eval(pf+"closefont='"+escSglQuote(ar[++i])+"'");continue;}

if(ar[i]==TEXTSIZE){eval(pf+'textsize="'+ar[++i]+'"');continue;}

if(ar[i]==CAPTIONSIZE){eval(pf+'captionsize="'+ar[++i]+'"');continue;}

if(ar[i]==CLOSESIZE){eval(pf+'closesize="'+ar[++i]+'"');continue;}

if(ar[i]==TIMEOUT){eval(pf+'timeout='+ar[++i]);continue;}

if(ar[i]==FUNCTION){if(pf=='ol_'){if(typeof ar[i+1]!='number'){v=ar[++i];ol_function=(typeof v=='function'?v:null);}}else{fnMark=0;v=null;if(typeof ar[i+1]!='number')v=ar[++i]; opt_FUNCTION(v);} continue;}

if(ar[i]==DELAY){eval(pf+'delay='+ar[++i]);continue;}

if(ar[i]==HAUTO){eval(pf+'hauto=('+pf+'hauto==0)?1:0');continue;}

if(ar[i]==VAUTO){eval(pf+'vauto=('+pf+'vauto==0)?1:0');continue;}

if(ar[i]==CLOSECLICK){eval(pf+'closeclick=('+pf+'closeclick==0)?1:0');continue;}

if(ar[i]==WRAP){eval(pf+'wrap=('+pf+'wrap==0)?1:0');continue;}

if(ar[i]==FOLLOWMOUSE){eval(pf+'followmouse=('+pf+'followmouse==1)?0:1');continue;}

if(ar[i]==MOUSEOFF){eval(pf+'mouseoff=('+pf+'mouseoff==0)?1:0');v=ar[i+1];if(pf!='ol_'&&eval(pf+'mouseoff')&&typeof v=='number'&&(vpmUpper))olHideDelay=ar[++i];continue;}

if(ar[i]==CLOSETITLE){eval(pf+"closetitle='"+escSglQuote(ar[++i])+"'");continue;}

if(ar[i]==CSSOFF||ar[i]==CSSCLASS){eval(pf+'css='+ar[i]);continue;}

if(ar[i]==COMPATMODE){eval(pf+'compatmode=('+pf+'compatmode==0)?1:0');continue;}

if(ar[i]==FGCLASS){eval(pf+'fgclass="'+ar[++i]+'"');continue;}

if(ar[i]==BGCLASS){eval(pf+'bgclass="'+ar[++i]+'"');continue;}

if(ar[i]==TEXTFONTCLASS){eval(pf+'textfontclass="'+ar[++i]+'"');continue;}

if(ar[i]==CAPTIONFONTCLASS){eval(pf+'captionfontclass="'+ar[++i]+'"');continue;}

if(ar[i]==CLOSEFONTCLASS){eval(pf+'closefontclass="'+ar[++i]+'"');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,' ');if(!tReg.test(o3_cap))o3_cap=o3_cap.replace(/[ ]+/g,' ');}

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['overDiv'].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_xright||o3_ybottom)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;kpmStart)break;str+=args[k]+',';}

if(str)str=str.substring(0,--str.length);

k--;pV=(olNs4&&/cellpad/i.test(parameter))?str.split(',')[0]:str;eval(parameter+'="'+pV+'"');

return k;}

function nbspCleanup(){if(o3_wrap){o3_text=o3_text.replace(/\ /g,' ');o3_cap=o3_cap.replace(/\ /g,' ');}}

function escSglQuote(str){return str.toString().replace(/'/g,"\\'");}

function OLonLoad_handler(e){var re=/\w+\(.*\)[;\s]+/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

function wrapStr(endWrap,fontSizeStr,whichString){var fontStr,fontColor,isClose=((whichString=='close')?1:0),hasDims=/[%\-a-z]+$/.test(fontSizeStr);fontSizeStr=(olNs4)?(!hasDims?fontSizeStr:'1'):fontSizeStr;if(endWrap)return(hasDims&&!olNs4)?(isClose?'':'

'):'';else{fontStr='o3_'+whichString+'font';fontColor='o3_'+((whichString=='caption')? 'cap':whichString)+'color';return(hasDims&&!olNs4)?(isClose?'':'
'):'';}}

function quoteMultiNameFonts(theFont){var v,pM=theFont.split(',');for(var i=0;i).replace(/\s+$/,);if(/\s/.test(v)&&!/['"]/.test(v)){v="\'"+v+"\'";pM[i]=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[j];left=right=ary[++j];break;case 3:

top=ary[j];left=right=ary[++j];bottom=ary[++j];break;case 4:

top=ary[j];right=ary[++j];bottom=ary[++j];left=ary[++j];break;}

Str+=((ary.length==1)?ary[0]+'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

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

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

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

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

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[id]=new Layer(window.innerWidth,frm);objRef=divContainer;}else{var body=(olIe4?frm.document.all.tags('BODY')[0]:frm.document.getElementsByTagName("BODY")[0]);if(olIe4&&!document.getElementById){body.insertAdjacentHTML("beforeEnd",'

');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[id]:(document.all?o3_frame.document.all[id]:o3_frame.document.getElementById(id)));}

function isFunction(fnRef){var rtn=true;

if(typeof fnRef=='object'){for(var i=0;i

}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

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[newPt.length++]=fnRef;}

for(i=0;i

if(!match)newPt[newPt.length++]=hookPt[i];}

newPt[newPt.length++]=order;

}else if(typeof order=='object'){if(typeof fnRef=='object'){newPt=newPt.concat(fnRef);}else{newPt[newPt.length++]=fnRef;}

for(j=0;j

if(!match)newPt[newPt.length++]=hookPt[j];}

for(i=0;i

for(j=0;j

if(!match)newPt[newPt.length++]=hookPt[j];}

newPt=newPt.concat(order);}

hookPt=newPt;

return hookPt;}

function setRunTimeVariables(){if(typeof runTime!='undefined'&&runTime.length){for(var k=0;k

function parseCmdLine(pf,i,args){if(typeof cmdLine!='undefined'&&cmdLine.length){for(var k=0;k-1){i=j;break;}}}

return i;}

function postParseChecks(pf,args){if(typeof postParse!='undefined'&&postParse.length){for(var k=0;k

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[i].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[fnHookTo]=='undefined')hookPts[fnHookTo]=new FunctionReference();

hookPt=hookPts[fnHookTo];

if(hookType!=null){if(hookType==FREPLACE){hookPt.ovload=fnRef;if(fnHookTo.indexOf('ol_content_')>-1)hookPt.alt[pms[CSSOFF-1-pmStart]]=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[hookPt.length++]=fnRef;}

if(optPm)hookPt=reOrder(hookPt,fnRef,optPm);

}else if(hookType==FALTERNATE){if(last=='number')hookPt.alt[pms[optPm-1-pmStart]]=fnRef;}else if(hookType==FCHAIN){hookPt=hookPt.chain;if(typeof fnRef=='object')hookPt=hookPt.concat(fnRef);else hookPt[hookPt.length++]=fnRef;}

return;}}

function registerRunTimeFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){runTime=runTime.concat(fn);}else{runTime[runTime.length++]=fn;}}}

function registerCmdLineFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){cmdLine=cmdLine.concat(fn);}else{cmdLine[cmdLine.length++]=fn;}}}

function registerPostParseFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){postParse=postParse.concat(fn);}else{postParse[postParse.length++]=fn;}}}

function runHook(fnHookTo,hookType){var l=hookPts[fnHookTo],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

}else if(hookType==FALTERNATE){optPm=ar[2];arS=argToString(ar,3);

if(typeof l=='undefined'||(l=l.alt[pms[optPm-1-pmStart]])=='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[k-1]('+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;}