  <?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.alsa-project.org/main/index.php?action=history&amp;feed=atom&amp;title=User%3ASdaau%2Finstaview.js</id>
	<title>User:Sdaau/instaview.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.alsa-project.org/main/index.php?action=history&amp;feed=atom&amp;title=User%3ASdaau%2Finstaview.js"/>
	<link rel="alternate" type="text/html" href="https://www.alsa-project.org/main/index.php?title=User:Sdaau/instaview.js&amp;action=history"/>
	<updated>2026-04-14T00:30:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>https://www.alsa-project.org/main/index.php?title=User:Sdaau/instaview.js&amp;diff=2237&amp;oldid=prev</id>
		<title>Sdaau: added instaview.js</title>
		<link rel="alternate" type="text/html" href="https://www.alsa-project.org/main/index.php?title=User:Sdaau/instaview.js&amp;diff=2237&amp;oldid=prev"/>
		<updated>2010-11-05T02:07:24Z</updated>

		<summary type="html">&lt;p&gt;added instaview.js&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// Last update: Cacycle 22:26, 22 November 2008 (UTC)&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Script to embed InstaView in MediaWiki's edit page&lt;br /&gt;
addOnloadHook(function(){&lt;br /&gt;
  if (document.getElementById('editpage-copywarn')) {&lt;br /&gt;
    var oldPreview = document.getElementById('wpPreview');&lt;br /&gt;
    var newPreview = document.createElement('input');&lt;br /&gt;
    newPreview.setAttribute('type', 'button');&lt;br /&gt;
    newPreview.setAttribute('style', 'font-style: italic');&lt;br /&gt;
    newPreview.setAttribute('value', 'InstaView');&lt;br /&gt;
    newPreview.setAttribute('id', 'InstaView');&lt;br /&gt;
    newPreview.setAttribute('name', 'InstaView');&lt;br /&gt;
    newPreview.setAttribute('onclick', &amp;quot;InstaView.dump('wpTextbox1', 'InstaViewDump')&amp;quot;);&lt;br /&gt;
    oldPreview.parentNode.insertBefore(newPreview, oldPreview);&lt;br /&gt;
    oldPreview.parentNode.innerHTML += '&amp;lt;div style=&amp;quot;margin: 5px 0 5px 0; padding: 5px; border: 2px solid orange;&amp;quot; id=&amp;quot;InstaViewDump&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;';&lt;br /&gt;
    oldPreview.value = 'Classic Preview';&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * InstaView - a Mediawiki to HTML converter in JavaScript&lt;br /&gt;
 * Version 0.6.1&lt;br /&gt;
 * Copyright (C) Pedro Fayolle 2005-2006&lt;br /&gt;
 * http://en.wikipedia.org/wiki/User:Pilaf&lt;br /&gt;
 * Distributed under the BSD license&lt;br /&gt;
 *&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 *&lt;br /&gt;
 * 0.6.1&lt;br /&gt;
 * - Fixed problem caused by \r characters&lt;br /&gt;
 * - Improved inline formatting parser&lt;br /&gt;
 *&lt;br /&gt;
 * 0.6&lt;br /&gt;
 * - Changed name to InstaView&lt;br /&gt;
 * - Some major code reorganizations and factored out some common functions&lt;br /&gt;
 * - Handled conversion of relative links (i.e. [[/foo]])&lt;br /&gt;
 * - Fixed misrendering of adjacent definition list items&lt;br /&gt;
 * - Fixed bug in table headings handling&lt;br /&gt;
 * - Changed date format in signatures to reflect Mediawiki's&lt;br /&gt;
 * - Fixed handling of [[:Image:...]]&lt;br /&gt;
 * - Updated MD5 function (hopefully it will work with UTF-8)&lt;br /&gt;
 * - Fixed bug in handling of links inside images&lt;br /&gt;
 *&lt;br /&gt;
 * To do:&lt;br /&gt;
 * - Better support for &amp;lt;math&amp;gt;&lt;br /&gt;
 * - Full support for &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 * - Parser-based (as opposed to RegExp-based) inline wikicode handling (make it one-pass and bullet-proof)&lt;br /&gt;
 * - Support for templates (through AJAX)&lt;br /&gt;
 * - Support for coloured links (AJAX)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var InstaView = {}&lt;br /&gt;
&lt;br /&gt;
// options&lt;br /&gt;
InstaView.conf =&lt;br /&gt;
{&lt;br /&gt;
	user: {},&lt;br /&gt;
	&lt;br /&gt;
	wiki: {&lt;br /&gt;
		lang: 'en',&lt;br /&gt;
		interwiki: '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',&lt;br /&gt;
		default_thumb_width: 180&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	paths: {&lt;br /&gt;
		articles: '/wiki/',&lt;br /&gt;
		math: '/math/',&lt;br /&gt;
		images: '',&lt;br /&gt;
		images_fallback: 'http://upload.wikimedia.org/wikipedia/commons/',&lt;br /&gt;
		magnify_icon: 'skins/common/images/magnify-clip.png'&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	locale: {&lt;br /&gt;
		user: 'User',&lt;br /&gt;
		image: 'Image',&lt;br /&gt;
		category: 'Category',&lt;br /&gt;
		months: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// options with default values or backreferences&lt;br /&gt;
with (InstaView.conf) {&lt;br /&gt;
	user.name = user.name || 'Wikipedian'&lt;br /&gt;
	user.signature = '[['+locale.user+':'+user.name+'|'+user.name+']]'&lt;br /&gt;
	paths.images = 'http://upload.wikimedia.org/wikipedia/' + wiki.lang + '/'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// define constants&lt;br /&gt;
InstaView.BLOCK_IMAGE = new RegExp('^\\[\\['+InstaView.conf.locale.image+':.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)', 'i');&lt;br /&gt;
&lt;br /&gt;
InstaView.dump = function(from, to)&lt;br /&gt;
{&lt;br /&gt;
	if (typeof from == 'string') from = document.getElementById(from)&lt;br /&gt;
	if (typeof to == 'string') to = document.getElementById(to)&lt;br /&gt;
	to.innerHTML = this.convert(from.value)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
InstaView.convert = function(wiki)&lt;br /&gt;
{&lt;br /&gt;
	var 	ll = (typeof wiki == 'string')? wiki.replace(/\r/g,'').split(/\n/): wiki, // lines of wikicode&lt;br /&gt;
		o='',	// output&lt;br /&gt;
		p=0,	// para flag&lt;br /&gt;
		$r	// result of passing a regexp to $()&lt;br /&gt;
	&lt;br /&gt;
	// some shorthands&lt;br /&gt;
	function remain() { return ll.length }&lt;br /&gt;
	function sh() { return ll.shift() } // shift&lt;br /&gt;
	function ps(s) { o+=s } // push&lt;br /&gt;
	&lt;br /&gt;
	function f() // similar to C's printf, uses ? as placeholders, ?? to escape question marks&lt;br /&gt;
	{&lt;br /&gt;
		var i=1,a=arguments,f=a[0],o='',c,p&lt;br /&gt;
		for (;i&amp;lt;a.length; i++) if ((p=f.indexOf('?'))+1) {&lt;br /&gt;
			// allow character escaping&lt;br /&gt;
			i -= c=f.charAt(p+1)=='?'?1:0&lt;br /&gt;
			o += f.substring(0,p)+(c?'?':a[i])&lt;br /&gt;
			f=f.substr(p+1+c)&lt;br /&gt;
		} else break;&lt;br /&gt;
		return o+f&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function html_entities(s) { return s.replace(/&amp;amp;/g,&amp;quot;&amp;amp;amp;&amp;quot;).replace(/&amp;lt;/g,&amp;quot;&amp;amp;lt;&amp;quot;).replace(/&amp;gt;/g,&amp;quot;&amp;amp;gt;&amp;quot;) }&lt;br /&gt;
	&lt;br /&gt;
	function max(a,b) { return (a&amp;gt;b)?a:b }&lt;br /&gt;
	function min(a,b) { return (a&amp;lt;b)?a:b }&lt;br /&gt;
	&lt;br /&gt;
	// return the first non matching character position between two strings&lt;br /&gt;
	function str_imatch(a, b)&lt;br /&gt;
	{&lt;br /&gt;
		for (var i=0, l=min(a.length, b.length); i&amp;lt;l; i++) if (a.charAt(i)!=b.charAt(i)) break&lt;br /&gt;
		return i&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// compare current line against a string or regexp&lt;br /&gt;
	// if passed a string it will compare only the first string.length characters&lt;br /&gt;
	// if passed a regexp the result is stored in $r&lt;br /&gt;
	function $(c) { return (typeof c == 'string') ? (ll[0].substr(0,c.length)==c) : ($r = ll[0].match(c)) }&lt;br /&gt;
	&lt;br /&gt;
	function $$(c) { return ll[0]==c } // compare current line against a string&lt;br /&gt;
	function _(p) { return ll[0].charAt(p) } // return char at pos p&lt;br /&gt;
	&lt;br /&gt;
	function endl(s) { ps(s); sh() }&lt;br /&gt;
	&lt;br /&gt;
	function parse_list()&lt;br /&gt;
	{&lt;br /&gt;
		var prev='';&lt;br /&gt;
		&lt;br /&gt;
		while (remain() &amp;amp;&amp;amp; $(/^([*#:;]+)(.*)$/)) {&lt;br /&gt;
			&lt;br /&gt;
			var l_match = $r&lt;br /&gt;
			&lt;br /&gt;
			sh()&lt;br /&gt;
			&lt;br /&gt;
			var ipos = str_imatch(prev, l_match[1])&lt;br /&gt;
			&lt;br /&gt;
			// close uncontinued lists&lt;br /&gt;
			for (var i=prev.length-1; i &amp;gt;= ipos; i--) {&lt;br /&gt;
				&lt;br /&gt;
				var pi = prev.charAt(i)&lt;br /&gt;
				&lt;br /&gt;
				if (pi=='*') ps('&amp;lt;/ul&amp;gt;')&lt;br /&gt;
				else if (pi=='#') ps('&amp;lt;/ol&amp;gt;')&lt;br /&gt;
				// close a dl only if the new item is not a dl item (:, ; or empty)&lt;br /&gt;
				else switch (l_match[1].charAt(i)) { case'':case'*':case'#': ps('&amp;lt;/dl&amp;gt;') }&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			// open new lists&lt;br /&gt;
			for (var i=ipos; i&amp;lt;l_match[1].length; i++) {&lt;br /&gt;
				&lt;br /&gt;
				var li = l_match[1].charAt(i)&lt;br /&gt;
				&lt;br /&gt;
				if (li=='*') ps('&amp;lt;ul&amp;gt;')&lt;br /&gt;
				else if (li=='#') ps('&amp;lt;ol&amp;gt;')&lt;br /&gt;
				// open a new dl only if the prev item is not a dl item (:, ; or empty)&lt;br /&gt;
				else switch(prev.charAt(i)) { case'':case'*':case'#': ps('&amp;lt;dl&amp;gt;') }&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			switch (l_match[1].charAt(l_match[1].length-1)) {&lt;br /&gt;
			&lt;br /&gt;
				case '*': case '#':&lt;br /&gt;
					ps('&amp;lt;li&amp;gt;' + parse_inline_nowiki(l_match[2])); break&lt;br /&gt;
					&lt;br /&gt;
				case ';':&lt;br /&gt;
					ps('&amp;lt;dt&amp;gt;')&lt;br /&gt;
					&lt;br /&gt;
					var dt_match&lt;br /&gt;
					&lt;br /&gt;
					// handle ;dt :dd format&lt;br /&gt;
					if (dt_match = l_match[2].match(/(.*?) (:.*?)$/)) {&lt;br /&gt;
						&lt;br /&gt;
						ps(parse_inline_nowiki(dt_match[1]))&lt;br /&gt;
						ll.unshift(dt_match[2])&lt;br /&gt;
						&lt;br /&gt;
					} else ps(parse_inline_nowiki(l_match[2]))&lt;br /&gt;
					&lt;br /&gt;
					break&lt;br /&gt;
					&lt;br /&gt;
				case ':':&lt;br /&gt;
					ps('&amp;lt;dd&amp;gt;' + parse_inline_nowiki(l_match[2]))&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			prev=l_match[1]&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// close remaining lists&lt;br /&gt;
		for (var i=prev.length-1; i&amp;gt;=0; i--)&lt;br /&gt;
			ps(f('&amp;lt;/?&amp;gt;', (prev.charAt(i)=='*')? 'ul': ((prev.charAt(i)=='#')? 'ol': 'dl')))&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function parse_table()&lt;br /&gt;
	{&lt;br /&gt;
		endl(f('&amp;lt;table?&amp;gt;', $(/^\{\|( .*)$/)? $r[1]: ''))&lt;br /&gt;
		&lt;br /&gt;
		for (;remain();) if ($('|')) switch (_(1)) {&lt;br /&gt;
			case '}': endl('&amp;lt;/table&amp;gt;'); return&lt;br /&gt;
			case '-': endl(f('&amp;lt;tr ?&amp;gt;', $(/\|-*(.*)/)[1])); break&lt;br /&gt;
			default: parse_table_data()&lt;br /&gt;
		}&lt;br /&gt;
		else if ($('!')) parse_table_data()&lt;br /&gt;
		else sh()&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function parse_table_data()&lt;br /&gt;
	{&lt;br /&gt;
		var td_line, match_i&lt;br /&gt;
		&lt;br /&gt;
		// 1: &amp;quot;|+&amp;quot;, '|' or '+'&lt;br /&gt;
		// 2: ??&lt;br /&gt;
		// 3: attributes ??&lt;br /&gt;
		// TODO: finish commenting this regexp&lt;br /&gt;
		var td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/)&lt;br /&gt;
		&lt;br /&gt;
		if (td_match[1] == '|+') ps('&amp;lt;caption');&lt;br /&gt;
		else ps('&amp;lt;t' + ((td_match[1]=='|')?'d':'h'))&lt;br /&gt;
		&lt;br /&gt;
		if (typeof td_match[3] != 'undefined') {&lt;br /&gt;
			&lt;br /&gt;
			ps(' ' + td_match[3])&lt;br /&gt;
			match_i = 4&lt;br /&gt;
			&lt;br /&gt;
		} else match_i = 2&lt;br /&gt;
		&lt;br /&gt;
		ps('&amp;gt;')&lt;br /&gt;
		&lt;br /&gt;
		if (td_match[1] != '|+') {&lt;br /&gt;
			&lt;br /&gt;
			// use || or !! as a cell separator depending on context&lt;br /&gt;
			// NOTE: when split() is passed a regexp make sure to use non-capturing brackets&lt;br /&gt;
			td_line = td_match[match_i].split((td_match[1] == '|')? '||': /(?:\|\||!!)/)&lt;br /&gt;
			&lt;br /&gt;
			ps(parse_inline_nowiki(td_line.shift()))&lt;br /&gt;
			&lt;br /&gt;
			while (td_line.length) ll.unshift(td_match[1] + td_line.pop())&lt;br /&gt;
			&lt;br /&gt;
		} else ps(td_match[match_i])&lt;br /&gt;
		&lt;br /&gt;
		var tc = 0, td = []&lt;br /&gt;
		&lt;br /&gt;
		for (;remain(); td.push(sh()))&lt;br /&gt;
		if ($('|')) {&lt;br /&gt;
			if (!tc) break // we're at the outer-most level (no nested tables), skip to td parse&lt;br /&gt;
			else if (_(1)=='}') tc--&lt;br /&gt;
		}&lt;br /&gt;
		else if (!tc &amp;amp;&amp;amp; $('!')) break&lt;br /&gt;
		else if ($('{|')) tc++&lt;br /&gt;
		&lt;br /&gt;
		if (td.length) ps(InstaView.convert(td))&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function parse_pre()&lt;br /&gt;
	{&lt;br /&gt;
		ps('&amp;lt;pre&amp;gt;')&lt;br /&gt;
		do endl(parse_inline_nowiki(ll[0].substring(1)) + &amp;quot;\n&amp;quot;); while (remain() &amp;amp;&amp;amp; $(' '))&lt;br /&gt;
		ps('&amp;lt;/pre&amp;gt;')&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function parse_block_image()&lt;br /&gt;
	{&lt;br /&gt;
		ps(parse_image(sh()))&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_image(str)&lt;br /&gt;
	{&lt;br /&gt;
		// get what's in between &amp;quot;[[Image:&amp;quot; and &amp;quot;]]&amp;quot;&lt;br /&gt;
		var tag = str.substring(InstaView.conf.locale.image.length + 3, str.length - 2);&lt;br /&gt;
		&lt;br /&gt;
		var width;&lt;br /&gt;
		var attr = [], filename, caption = '';&lt;br /&gt;
		var thumb=0, frame=0, center=0;&lt;br /&gt;
		var align='';&lt;br /&gt;
		&lt;br /&gt;
		if (tag.match(/\|/)) {&lt;br /&gt;
			// manage nested links&lt;br /&gt;
			var nesting = 0;&lt;br /&gt;
			var last_attr;&lt;br /&gt;
			for (var i = tag.length-1; i &amp;gt; 0; i--) {&lt;br /&gt;
				if (tag.charAt(i) == '|' &amp;amp;&amp;amp; !nesting) {&lt;br /&gt;
					last_attr = tag.substr(i+1);&lt;br /&gt;
					tag = tag.substring(0, i);&lt;br /&gt;
					break;&lt;br /&gt;
				} else switch (tag.substr(i-1, 2)) {&lt;br /&gt;
					case ']]':&lt;br /&gt;
						nesting++;&lt;br /&gt;
						i--;&lt;br /&gt;
						break;&lt;br /&gt;
					case '[[':&lt;br /&gt;
						nesting--;&lt;br /&gt;
						i--;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			attr = tag.split(/\s*\|\s*/);&lt;br /&gt;
			attr.push(last_attr);&lt;br /&gt;
			filename = attr.shift();&lt;br /&gt;
			&lt;br /&gt;
			var w_match;&lt;br /&gt;
			&lt;br /&gt;
			for (;attr.length; attr.shift())&lt;br /&gt;
			if (w_match = attr[0].match(/^(\d*)px$/)) width = w_match[1]&lt;br /&gt;
			else switch(attr[0]) {&lt;br /&gt;
				case 'thumb':&lt;br /&gt;
				case 'thumbnail':&lt;br /&gt;
					thumb=true;&lt;br /&gt;
				case 'frame':&lt;br /&gt;
					frame=true;&lt;br /&gt;
					break;&lt;br /&gt;
				case 'none':&lt;br /&gt;
				case 'right':&lt;br /&gt;
				case 'left':&lt;br /&gt;
					center=false;&lt;br /&gt;
					align=attr[0];&lt;br /&gt;
					break;&lt;br /&gt;
				case 'center':&lt;br /&gt;
					center=true;&lt;br /&gt;
					align='none';&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					if (attr.length == 1) caption = attr[0];&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		} else filename = tag;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		var o='';&lt;br /&gt;
		&lt;br /&gt;
		if (frame) {&lt;br /&gt;
		&lt;br /&gt;
			if (align=='') align = 'right';&lt;br /&gt;
			&lt;br /&gt;
			o += f(&amp;quot;&amp;lt;div class='thumb t?'&amp;gt;&amp;quot;, align);&lt;br /&gt;
			&lt;br /&gt;
			if (thumb) {&lt;br /&gt;
				if (!width) width = InstaView.conf.wiki.default_thumb_width;&lt;br /&gt;
				&lt;br /&gt;
				o += f(&amp;quot;&amp;lt;div style='width:?px;'&amp;gt;?&amp;quot;, 2+width*1, make_image(filename, caption, width)) +&lt;br /&gt;
					f(&amp;quot;&amp;lt;div class='thumbcaption'&amp;gt;&amp;lt;div class='magnify' style='float:right'&amp;gt;&amp;lt;a href='?' class='internal' title='Enlarge'&amp;gt;&amp;lt;img src='?'&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
						InstaView.conf.paths.articles + InstaView.conf.locale.image + ':' + filename,&lt;br /&gt;
						InstaView.conf.paths.magnify_icon,&lt;br /&gt;
						parse_inline_nowiki(caption)&lt;br /&gt;
					)&lt;br /&gt;
			} else {&lt;br /&gt;
				o += '&amp;lt;div&amp;gt;' + make_image(filename, caption) + f(&amp;quot;&amp;lt;div class='thumbcaption'&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;, parse_inline_nowiki(caption))&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			o += '&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';&lt;br /&gt;
			&lt;br /&gt;
		} else if (align != '') {&lt;br /&gt;
			o += f(&amp;quot;&amp;lt;div class='float?'&amp;gt;&amp;lt;span&amp;gt;?&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;, align, make_image(filename, caption, width));&lt;br /&gt;
		} else {&lt;br /&gt;
			return make_image(filename, caption, width);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return center? f(&amp;quot;&amp;lt;div class='center'&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;, o): o;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function parse_inline_nowiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		var start, lastend=0&lt;br /&gt;
		var substart=0, nestlev=0, open, close, subloop;&lt;br /&gt;
		var html='';&lt;br /&gt;
		&lt;br /&gt;
		while (-1 != (start = str.indexOf('&amp;lt;nowiki&amp;gt;', substart))) {&lt;br /&gt;
			html += parse_inline_wiki(str.substring(lastend, start));&lt;br /&gt;
			start += 8;&lt;br /&gt;
			substart = start;&lt;br /&gt;
			subloop = true;&lt;br /&gt;
			do {&lt;br /&gt;
				open = str.indexOf('&amp;lt;nowiki&amp;gt;', substart);&lt;br /&gt;
				close = str.indexOf('&amp;lt;/nowiki&amp;gt;', substart);&lt;br /&gt;
				if (close&amp;lt;=open || open==-1) {&lt;br /&gt;
					if (close==-1) {&lt;br /&gt;
						return html + html_entities(str.substr(start));&lt;br /&gt;
					}&lt;br /&gt;
					substart = close+9;&lt;br /&gt;
					if (nestlev) {&lt;br /&gt;
						nestlev--;&lt;br /&gt;
					} else {&lt;br /&gt;
						lastend = substart;&lt;br /&gt;
						html += html_entities(str.substring(start, lastend-9));&lt;br /&gt;
						subloop = false;&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					substart = open+8;&lt;br /&gt;
					nestlev++;&lt;br /&gt;
				}&lt;br /&gt;
			} while (subloop)&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return html + parse_inline_wiki(str.substr(lastend));&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function make_image(filename, caption, width)&lt;br /&gt;
	{&lt;br /&gt;
		// uppercase first letter in file name&lt;br /&gt;
		filename = filename.charAt(0).toUpperCase() + filename.substr(1);&lt;br /&gt;
		// replace spaces with underscores&lt;br /&gt;
		filename = filename.replace(/ /g, '_');&lt;br /&gt;
		&lt;br /&gt;
		caption = strip_inline_wiki(caption);&lt;br /&gt;
		&lt;br /&gt;
		var md5 = hex_md5(filename);&lt;br /&gt;
		&lt;br /&gt;
		var source = md5.charAt(0) + '/' + md5.substr(0,2) + '/' + filename;&lt;br /&gt;
		&lt;br /&gt;
		if (width) width = &amp;quot;width='&amp;quot; + width + &amp;quot;px'&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		var img = f(&amp;quot;&amp;lt;img onerror=\&amp;quot;this.onerror=null;this.src='?'\&amp;quot; src='?' ? ?&amp;gt;&amp;quot;, InstaView.conf.paths.images_fallback + source, InstaView.conf.paths.images + source, (caption!='')? &amp;quot;alt='&amp;quot; + caption + &amp;quot;'&amp;quot; : '', width);&lt;br /&gt;
		&lt;br /&gt;
		return f(&amp;quot;&amp;lt;a class='image' ? href='?'&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, (caption!='')? &amp;quot;title='&amp;quot; + caption + &amp;quot;'&amp;quot; : '', InstaView.conf.paths.articles + InstaView.conf.locale.image + ':' + filename, img);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function parse_inline_images(str)&lt;br /&gt;
	{&lt;br /&gt;
		var start, substart=0, nestlev=0;&lt;br /&gt;
		var loop, close, open, wiki, html;&lt;br /&gt;
		&lt;br /&gt;
		while (-1 != (start=str.indexOf('[[', substart))) {&lt;br /&gt;
			if(str.substr(start+2).match(RegExp('^' + InstaView.conf.locale.image + ':','i'))) {&lt;br /&gt;
				loop=true;&lt;br /&gt;
				substart=start;&lt;br /&gt;
				do {&lt;br /&gt;
					substart+=2;&lt;br /&gt;
					close=str.indexOf(']]',substart);&lt;br /&gt;
					open=str.indexOf('[[',substart);&lt;br /&gt;
					if (close&amp;lt;=open||open==-1) {&lt;br /&gt;
						if (close==-1) return str;&lt;br /&gt;
						substart=close;&lt;br /&gt;
						if (nestlev) {&lt;br /&gt;
							nestlev--;&lt;br /&gt;
						} else {&lt;br /&gt;
							wiki=str.substring(start,close+2);&lt;br /&gt;
							html=parse_image(wiki);&lt;br /&gt;
							str=str.replace(wiki,html);&lt;br /&gt;
							substart=start+html.length;&lt;br /&gt;
							loop=false;&lt;br /&gt;
						}&lt;br /&gt;
					} else {&lt;br /&gt;
						substart=open;&lt;br /&gt;
						nestlev++;&lt;br /&gt;
					}&lt;br /&gt;
				} while (loop)&lt;br /&gt;
				&lt;br /&gt;
			} else break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return str;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// the output of this function doesn't respect the FILO structure of HTML&lt;br /&gt;
	// but since most browsers can handle it I'll save myself the hassle&lt;br /&gt;
	function parse_inline_formatting(str)&lt;br /&gt;
	{&lt;br /&gt;
		var em,st,i,li,o='';&lt;br /&gt;
		while ((i=str.indexOf(&amp;quot;''&amp;quot;,li))+1) {&lt;br /&gt;
			o += str.substring(li,i);&lt;br /&gt;
			li=i+2;&lt;br /&gt;
			if (str.charAt(i+2)==&amp;quot;'&amp;quot;) {&lt;br /&gt;
				li++;&lt;br /&gt;
				st=!st;&lt;br /&gt;
				o+=st?'&amp;lt;strong&amp;gt;':'&amp;lt;/strong&amp;gt;';&lt;br /&gt;
			} else {&lt;br /&gt;
				em=!em;&lt;br /&gt;
				o+=em?'&amp;lt;em&amp;gt;':'&amp;lt;/em&amp;gt;';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return o+str.substr(li);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function parse_inline_wiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		var aux_match;&lt;br /&gt;
		&lt;br /&gt;
		str = parse_inline_images(str);&lt;br /&gt;
		str = parse_inline_formatting(str);&lt;br /&gt;
		&lt;br /&gt;
		// math&lt;br /&gt;
		while (aux_match = str.match(/&amp;lt;(?:)math&amp;gt;(.*?)&amp;lt;\/math&amp;gt;/i)) {&lt;br /&gt;
			var math_md5 = hex_md5(aux_match[1]);&lt;br /&gt;
			str = str.replace(aux_match[0], f(&amp;quot;&amp;lt;img src='?.png'&amp;gt;&amp;quot;, InstaView.conf.paths.math+math_md5));&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// Build a Mediawiki-formatted date string&lt;br /&gt;
		var date = new Date;&lt;br /&gt;
		var minutes = date.getUTCMinutes();&lt;br /&gt;
		if (minutes &amp;lt; 10) minutes = '0' + minutes;&lt;br /&gt;
		var date = f(&amp;quot;?:?, ? ? ? (UTC)&amp;quot;, date.getUTCHours(), minutes, date.getUTCDate(), InstaView.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear());&lt;br /&gt;
		&lt;br /&gt;
		// text formatting&lt;br /&gt;
		return str.&lt;br /&gt;
			// signatures&lt;br /&gt;
			replace(/~{5}(?!~)/g, date).&lt;br /&gt;
			replace(/~{4}(?!~)/g, InstaView.conf.user.name+' '+date).&lt;br /&gt;
			replace(/~{3}(?!~)/g, InstaView.conf.user.name).&lt;br /&gt;
			&lt;br /&gt;
			// [[:Category:...]], [[:Image:...]], etc...&lt;br /&gt;
			replace(RegExp('\\[\\[:((?:'+InstaView.conf.locale.category+'|'+InstaView.conf.locale.image+'|'+InstaView.conf.wiki.interwiki+'):.*?)\\]\\]','gi'), &amp;quot;&amp;lt;a href='&amp;quot;+InstaView.conf.paths.articles+&amp;quot;$1'&amp;gt;$1&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			replace(RegExp('\\[\\[(?:'+InstaView.conf.locale.category+'|'+InstaView.conf.wiki.interwiki+'):.*?\\]\\]','gi'),'').&lt;br /&gt;
			&lt;br /&gt;
			// [[/Relative links]]&lt;br /&gt;
			replace(/\[\[(\/[^|]*?)\]\]/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$1&amp;lt;/a&amp;gt;&amp;quot;, location)).&lt;br /&gt;
			&lt;br /&gt;
			// [[/Replaced|Relative links]]&lt;br /&gt;
			replace(/\[\[(\/.*?)\|(.+?)\]\]/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$2&amp;lt;/a&amp;gt;&amp;quot;, location)).&lt;br /&gt;
			&lt;br /&gt;
			// [[Common links]]&lt;br /&gt;
			replace(/\[\[([^|]*?)\]\](\w*)/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$1$2&amp;lt;/a&amp;gt;&amp;quot;, InstaView.conf.paths.articles)).&lt;br /&gt;
			&lt;br /&gt;
			// [[Replaced|Links]]&lt;br /&gt;
			replace(/\[\[(.*?)\|([^\]]+?)\]\](\w*)/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$2$3&amp;lt;/a&amp;gt;&amp;quot;, InstaView.conf.paths.articles)).&lt;br /&gt;
			&lt;br /&gt;
			// [[Stripped:Namespace|Namespace]]&lt;br /&gt;
			replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g, f(&amp;quot;&amp;lt;a href='?$1$2$3'&amp;gt;$2&amp;lt;/a&amp;gt;&amp;quot;, InstaView.conf.paths.articles)).&lt;br /&gt;
			&lt;br /&gt;
			// External links&lt;br /&gt;
			replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g, &amp;quot;&amp;lt;a href='$1:$2$3'&amp;gt;$4&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			replace(/\[http:\/\/(.*?)\]/g, &amp;quot;&amp;lt;a href='http://$1'&amp;gt;[#]&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g, &amp;quot;&amp;lt;a href='$1:$2$3'&amp;gt;$1:$2$3&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*)/g, &amp;quot;$1&amp;lt;a href='$2:$3$4'&amp;gt;$2:$3$4&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			&lt;br /&gt;
			replace('__NOTOC__','').&lt;br /&gt;
			replace('__NOEDITSECTION__','');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function strip_inline_wiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		return str&lt;br /&gt;
			.replace(/\[\[[^\]]*\|(.*?)\]\]/g,'$1')&lt;br /&gt;
			.replace(/\[\[(.*?)\]\]/g,'$1')&lt;br /&gt;
			.replace(/''(.*?)''/g,'$1');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// begin parsing&lt;br /&gt;
	for (;remain();) if ($(/^(={1,6})(.*)\1(.*)$/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		endl(f('&amp;lt;h?&amp;gt;?&amp;lt;/h?&amp;gt;?', $r[1].length, parse_inline_nowiki($r[2]), $r[1].length, $r[3]))&lt;br /&gt;
		&lt;br /&gt;
	} else if ($(/^[*#:;]/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_list()&lt;br /&gt;
		&lt;br /&gt;
	} else if ($(' ')) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_pre()&lt;br /&gt;
		&lt;br /&gt;
	} else if ($('{|')) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_table()&lt;br /&gt;
		&lt;br /&gt;
	} else if ($(/^----+$/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		endl('&amp;lt;hr&amp;gt;')&lt;br /&gt;
		&lt;br /&gt;
	} else if ($(InstaView.BLOCK_IMAGE)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_block_image()&lt;br /&gt;
		&lt;br /&gt;
	} else {&lt;br /&gt;
		&lt;br /&gt;
		// handle paragraphs&lt;br /&gt;
		if ($$('')) {&lt;br /&gt;
			if (p = (remain()&amp;gt;1 &amp;amp;&amp;amp; ll[1]==(''))) endl('&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;')&lt;br /&gt;
		} else {&lt;br /&gt;
			if(!p) {&lt;br /&gt;
				ps('&amp;lt;p&amp;gt;')&lt;br /&gt;
				p=1&lt;br /&gt;
			}&lt;br /&gt;
			ps(parse_inline_nowiki(ll[0]) + ' ')&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		sh();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return o&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message&lt;br /&gt;
 * Digest Algorithm, as defined in RFC 1321.&lt;br /&gt;
 * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005&lt;br /&gt;
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet&lt;br /&gt;
 * Distributed under the BSD License&lt;br /&gt;
 * See http://pajhome.org.uk/crypt/md5 for more info.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Configurable variables. You may need to tweak these to be compatible with&lt;br /&gt;
 * the server-side, but the defaults work in most cases.&lt;br /&gt;
 */&lt;br /&gt;
var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */&lt;br /&gt;
var b64pad  = &amp;quot;&amp;quot;; /* base-64 pad character. &amp;quot;=&amp;quot; for strict RFC compliance   */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * These are the functions you'll usually want to call&lt;br /&gt;
 * They take string arguments and return either hex or base-64 encoded strings&lt;br /&gt;
 */&lt;br /&gt;
function hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }&lt;br /&gt;
function b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }&lt;br /&gt;
function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }&lt;br /&gt;
function hex_hmac_md5(k, d)&lt;br /&gt;
  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }&lt;br /&gt;
function b64_hmac_md5(k, d)&lt;br /&gt;
  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }&lt;br /&gt;
function any_hmac_md5(k, d, e)&lt;br /&gt;
  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the MD5 of a raw string&lt;br /&gt;
 */&lt;br /&gt;
function rstr_md5(s)&lt;br /&gt;
{&lt;br /&gt;
  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the HMAC-MD5, of a key and some data (raw strings)&lt;br /&gt;
 */&lt;br /&gt;
function rstr_hmac_md5(key, data)&lt;br /&gt;
{&lt;br /&gt;
  var bkey = rstr2binl(key);&lt;br /&gt;
  if(bkey.length &amp;gt; 16) bkey = binl_md5(bkey, key.length * 8);&lt;br /&gt;
&lt;br /&gt;
  var ipad = Array(16), opad = Array(16);&lt;br /&gt;
  for(var i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ipad[i] = bkey[i] ^ 0x36363636;&lt;br /&gt;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);&lt;br /&gt;
  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to a hex string&lt;br /&gt;
 */&lt;br /&gt;
function rstr2hex(input)&lt;br /&gt;
{&lt;br /&gt;
  var hex_tab = hexcase ? &amp;quot;0123456789ABCDEF&amp;quot; : &amp;quot;0123456789abcdef&amp;quot;;&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var x;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
  {&lt;br /&gt;
    x = input.charCodeAt(i);&lt;br /&gt;
    output += hex_tab.charAt((x &amp;gt;&amp;gt;&amp;gt; 4) &amp;amp; 0x0F)&lt;br /&gt;
           +  hex_tab.charAt( x        &amp;amp; 0x0F);&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to a base-64 string&lt;br /&gt;
 */&lt;br /&gt;
function rstr2b64(input)&lt;br /&gt;
{&lt;br /&gt;
  var tab = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&amp;quot;;&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var len = input.length;&lt;br /&gt;
  for(var i = 0; i &amp;lt; len; i += 3)&lt;br /&gt;
  {&lt;br /&gt;
    var triplet = (input.charCodeAt(i) &amp;lt;&amp;lt; 16)&lt;br /&gt;
                | (i + 1 &amp;lt; len ? input.charCodeAt(i+1) &amp;lt;&amp;lt; 8 : 0)&lt;br /&gt;
                | (i + 2 &amp;lt; len ? input.charCodeAt(i+2)      : 0);&lt;br /&gt;
    for(var j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if(i * 8 + j * 6 &amp;gt; input.length * 8) output += b64pad;&lt;br /&gt;
      else output += tab.charAt((triplet &amp;gt;&amp;gt;&amp;gt; 6*(3-j)) &amp;amp; 0x3F);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to an arbitrary string encoding&lt;br /&gt;
 */&lt;br /&gt;
function rstr2any(input, encoding)&lt;br /&gt;
{&lt;br /&gt;
  var divisor = encoding.length;&lt;br /&gt;
  var remainders = Array();&lt;br /&gt;
  var i, q, x, quotient;&lt;br /&gt;
&lt;br /&gt;
  /* Convert to an array of 16-bit big-endian values, forming the dividend */&lt;br /&gt;
  var dividend = Array(input.length / 2);&lt;br /&gt;
  for(i = 0; i &amp;lt; dividend.length; i++)&lt;br /&gt;
  {&lt;br /&gt;
    dividend[i] = (input.charCodeAt(i * 2) &amp;lt;&amp;lt; 8) | input.charCodeAt(i * 2 + 1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /*&lt;br /&gt;
   * Repeatedly perform a long division. The binary array forms the dividend,&lt;br /&gt;
   * the length of the encoding is the divisor. Once computed, the quotient&lt;br /&gt;
   * forms the dividend for the next step. We stop when the dividend is zero.&lt;br /&gt;
   * All remainders are stored for later use.&lt;br /&gt;
   */&lt;br /&gt;
  while(dividend.length &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    quotient = Array();&lt;br /&gt;
    x = 0;&lt;br /&gt;
    for(i = 0; i &amp;lt; dividend.length; i++)&lt;br /&gt;
    {&lt;br /&gt;
      x = (x &amp;lt;&amp;lt; 16) + dividend[i];&lt;br /&gt;
      q = Math.floor(x / divisor);&lt;br /&gt;
      x -= q * divisor;&lt;br /&gt;
      if(quotient.length &amp;gt; 0 || q &amp;gt; 0)&lt;br /&gt;
        quotient[quotient.length] = q;&lt;br /&gt;
    }&lt;br /&gt;
    remainders[remainders.length] = x;&lt;br /&gt;
    dividend = quotient;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* Convert the remainders to the output string */&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(i = remainders.length - 1; i &amp;gt;= 0; i--)&lt;br /&gt;
    output += encoding.charAt(remainders[i]);&lt;br /&gt;
&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Encode a string as utf-8.&lt;br /&gt;
 * For efficiency, this assumes the input is valid utf-16.&lt;br /&gt;
 */&lt;br /&gt;
function str2rstr_utf8(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var i = -1;&lt;br /&gt;
  var x, y;&lt;br /&gt;
&lt;br /&gt;
  while(++i &amp;lt; input.length)&lt;br /&gt;
  {&lt;br /&gt;
    /* Decode utf-16 surrogate pairs */&lt;br /&gt;
    x = input.charCodeAt(i);&lt;br /&gt;
    y = i + 1 &amp;lt; input.length ? input.charCodeAt(i + 1) : 0;&lt;br /&gt;
    if(0xD800 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt;= 0xDBFF &amp;amp;&amp;amp; 0xDC00 &amp;lt;= y &amp;amp;&amp;amp; y &amp;lt;= 0xDFFF)&lt;br /&gt;
    {&lt;br /&gt;
      x = 0x10000 + ((x &amp;amp; 0x03FF) &amp;lt;&amp;lt; 10) + (y &amp;amp; 0x03FF);&lt;br /&gt;
      i++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Encode output as utf-8 */&lt;br /&gt;
    if(x &amp;lt;= 0x7F)&lt;br /&gt;
      output += String.fromCharCode(x);&lt;br /&gt;
    else if(x &amp;lt;= 0x7FF)&lt;br /&gt;
      output += String.fromCharCode(0xC0 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x1F),&lt;br /&gt;
                                    0x80 | ( x         &amp;amp; 0x3F));&lt;br /&gt;
    else if(x &amp;lt;= 0xFFFF)&lt;br /&gt;
      output += String.fromCharCode(0xE0 | ((x &amp;gt;&amp;gt;&amp;gt; 12) &amp;amp; 0x0F),&lt;br /&gt;
                                    0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x3F),&lt;br /&gt;
                                    0x80 | ( x         &amp;amp; 0x3F));&lt;br /&gt;
    else if(x &amp;lt;= 0x1FFFFF)&lt;br /&gt;
      output += String.fromCharCode(0xF0 | ((x &amp;gt;&amp;gt;&amp;gt; 18) &amp;amp; 0x07),&lt;br /&gt;
                                    0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 12) &amp;amp; 0x3F),&lt;br /&gt;
                                    0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x3F),&lt;br /&gt;
                                    0x80 | ( x         &amp;amp; 0x3F));&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Encode a string as utf-16&lt;br /&gt;
 */&lt;br /&gt;
function str2rstr_utf16le(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
    output += String.fromCharCode( input.charCodeAt(i)        &amp;amp; 0xFF,&lt;br /&gt;
                                  (input.charCodeAt(i) &amp;gt;&amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function str2rstr_utf16be(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
    output += String.fromCharCode((input.charCodeAt(i) &amp;gt;&amp;gt;&amp;gt; 8) &amp;amp; 0xFF,&lt;br /&gt;
                                   input.charCodeAt(i)        &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to an array of little-endian words&lt;br /&gt;
 * Characters &amp;gt;255 have their high-byte silently ignored.&lt;br /&gt;
 */&lt;br /&gt;
function rstr2binl(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = Array(input.length &amp;gt;&amp;gt; 2);&lt;br /&gt;
  for(var i = 0; i &amp;lt; output.length; i++)&lt;br /&gt;
    output[i] = 0;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length * 8; i += 8)&lt;br /&gt;
    output[i&amp;gt;&amp;gt;5] |= (input.charCodeAt(i / 8) &amp;amp; 0xFF) &amp;lt;&amp;lt; (i%32);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert an array of little-endian words to a string&lt;br /&gt;
 */&lt;br /&gt;
function binl2rstr(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length * 32; i += 8)&lt;br /&gt;
    output += String.fromCharCode((input[i&amp;gt;&amp;gt;5] &amp;gt;&amp;gt;&amp;gt; (i % 32)) &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the MD5 of an array of little-endian words, and a bit length.&lt;br /&gt;
 */&lt;br /&gt;
function binl_md5(x, len)&lt;br /&gt;
{&lt;br /&gt;
  /* append padding */&lt;br /&gt;
  x[len &amp;gt;&amp;gt; 5] |= 0x80 &amp;lt;&amp;lt; ((len) % 32);&lt;br /&gt;
  x[(((len + 64) &amp;gt;&amp;gt;&amp;gt; 9) &amp;lt;&amp;lt; 4) + 14] = len;&lt;br /&gt;
&lt;br /&gt;
  var a =  1732584193;&lt;br /&gt;
  var b = -271733879;&lt;br /&gt;
  var c = -1732584194;&lt;br /&gt;
  var d =  271733878;&lt;br /&gt;
&lt;br /&gt;
  for(var i = 0; i &amp;lt; x.length; i += 16)&lt;br /&gt;
  {&lt;br /&gt;
    var olda = a;&lt;br /&gt;
    var oldb = b;&lt;br /&gt;
    var oldc = c;&lt;br /&gt;
    var oldd = d;&lt;br /&gt;
&lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);&lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);&lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);&lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);&lt;br /&gt;
&lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);&lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);&lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);&lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);&lt;br /&gt;
&lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);&lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);&lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);&lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);&lt;br /&gt;
&lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);&lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);&lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);&lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);&lt;br /&gt;
&lt;br /&gt;
    a = safe_add(a, olda);&lt;br /&gt;
    b = safe_add(b, oldb);&lt;br /&gt;
    c = safe_add(c, oldc);&lt;br /&gt;
    d = safe_add(d, oldd);&lt;br /&gt;
  }&lt;br /&gt;
  return Array(a, b, c, d);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * These functions implement the four basic operations the algorithm uses.&lt;br /&gt;
 */&lt;br /&gt;
function md5_cmn(q, a, b, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);&lt;br /&gt;
}&lt;br /&gt;
function md5_ff(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn((b &amp;amp; c) | ((~b) &amp;amp; d), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_gg(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn((b &amp;amp; d) | (c &amp;amp; (~d)), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_hh(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_ii(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally&lt;br /&gt;
 * to work around bugs in some JS interpreters.&lt;br /&gt;
 */&lt;br /&gt;
function safe_add(x, y)&lt;br /&gt;
{&lt;br /&gt;
  var lsw = (x &amp;amp; 0xFFFF) + (y &amp;amp; 0xFFFF);&lt;br /&gt;
  var msw = (x &amp;gt;&amp;gt; 16) + (y &amp;gt;&amp;gt; 16) + (lsw &amp;gt;&amp;gt; 16);&lt;br /&gt;
  return (msw &amp;lt;&amp;lt; 16) | (lsw &amp;amp; 0xFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Bitwise rotate a 32-bit number to the left.&lt;br /&gt;
 */&lt;br /&gt;
function bit_rol(num, cnt)&lt;br /&gt;
{&lt;br /&gt;
  return (num &amp;lt;&amp;lt; cnt) | (num &amp;gt;&amp;gt;&amp;gt; (32 - cnt));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sdaau</name></author>
	</entry>
</feed>