// Handling G-cache
if(location.href.indexOf("q=cache")>=0){
	var l=location.href
	l=l.split(":www")
	if(l.length>1){
		l="http://www"+l[1]
		l=l.split("+")
		if(l.length>1){location.replace(l[0])}
	}
}

// Redir on no .html
/*if(location.href.split(".").length<4){
	var l=location.href
	if(l!="http://www.thomasfrank.se/" && l.indexOf("thomasfrank.se")>0){
		location.replace(l+".html")
	}
}*/



/*
--------------------- Nifty corners --------------------------
*/

function NiftyCheck(){
if(!document.getElementById || !document.createElement)
    return(false);
isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
if(Array.prototype.push==null){Array.prototype.push=function(){
      this[this.length]=arguments[0]; return(this.length);}}
return(true);
}

function Rounded(selector,wich,bk,color,opt){
var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;

if(color=="transparent"){
    cn=cn+"x";
    ecolor=bk;
    bk="transparent";
    }
else if(opt && opt.indexOf("border")>=0){
    var optar=opt.split(" ");
    for(i=0;i<optar.length;i++)
        if(optar[i].indexOf("#")>=0) ecolor=optar[i];
    if(ecolor=="") ecolor="#666";
    cn+="e";
    edges=true;
    }
else if(opt && opt.indexOf("smooth")>=0){
    cn+="a";
    ecolor=Mix(bk,color);
    }
if(opt && opt.indexOf("small")>=0) cn+="s";
prefixt=cn;
prefixb=cn;
if(wich.indexOf("all")>=0){t=true;b=true}
else if(wich.indexOf("top")>=0) t="true";
else if(wich.indexOf("tl")>=0){
    t="true";
    if(wich.indexOf("tr")<0) prefixt+="l";
    }
else if(wich.indexOf("tr")>=0){
    t="true";
    prefixt+="r";
    }
if(wich.indexOf("bottom")>=0) b=true;
else if(wich.indexOf("bl")>=0){
    b="true";
    if(wich.indexOf("br")<0) prefixb+="l";
    }
else if(wich.indexOf("br")>=0){
    b="true";
    prefixb+="r";
    }
var v=getElementsBySelector(selector);
var l=v.length;
for(i=0;i<l;i++){
    if(edges) AddBorder(v[i],ecolor);
    if(t) AddTop(v[i],bk,color,ecolor,prefixt);
    if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
    }
}

function AddBorder(el,bc){
var i;
if(!el.passed){
    if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
        var t=el.firstChild.nodeValue;
        el.removeChild(el.lastChild);
        var d=CreateEl("span");
        d.style.display="block";
        d.appendChild(document.createTextNode(t));
        el.appendChild(d);
        }
    for(i=0;i<el.childNodes.length;i++){
        if(el.childNodes[i].nodeType==1){
            el.childNodes[i].style.borderLeft="1px solid "+bc;
            el.childNodes[i].style.borderRight="1px solid "+bc;
            }
        }
    }
el.passed=true;
}
    
function AddTop(el,bk,color,bc,cn){
var i,lim=4,d=CreateEl("b");

if(cn.indexOf("s")>=0) lim=2;
if(bc) d.className="artop";
else d.className="rtop";
d.style.backgroundColor=bk;
for(i=1;i<=lim;i++){
    var x=CreateEl("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    if(bc) x.style.borderColor=bc;
    d.appendChild(x);
    }
el.style.paddingTop=0;
el.insertBefore(d,el.firstChild);
}

function AddBottom(el,bk,color,bc,cn){
var i,lim=4,d=CreateEl("b");

if(cn.indexOf("s")>=0) lim=2;
if(bc) d.className="artop";
else d.className="rtop";
d.style.backgroundColor=bk;
for(i=lim;i>0;i--){
    var x=CreateEl("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    if(bc) x.style.borderColor=bc;
    d.appendChild(x);
    }
el.style.paddingBottom=0;
el.appendChild(d);
}

function CreateEl(x){
if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
else return(document.createElement(x));
}

function getElementsBySelector(selector){
var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];

if(selector.indexOf(" ")>0){  //descendant selector like "tag#id tag"
    s=selector.split(" ");
    var fs=s[0].split("#");
    if(fs.length==1) return(objlist);
    f=document.getElementById(fs[1]);
    if(f) return(f.getElementsByTagName(s[1]));
    return(objlist);
    }
if(selector.indexOf("#")>0){ //id selector like "tag#id"
    s=selector.split("#");
    tag=s[0];
    selid=s[1];
    }
if(selid!=""){
    f=document.getElementById(selid);
    if(f) objlist.push(f);
    return(objlist);
    }
if(selector.indexOf(".")>0){  //class selector like "tag.class"
    s=selector.split(".");
    tag=s[0];
    selclass=s[1];
    }
var v=document.getElementsByTagName(tag);  // tag selector like "tag"
if(selclass=="")
    return(v);
for(i=0;i<v.length;i++){
    if(v[i].className.indexOf(selclass)>=0){
        objlist.push(v[i]);
        }
    }
return(objlist);
}

function Mix(c1,c2){
var i,step1,step2,x,y,r=new Array(3);
if(c1.length==4)step1=1;
else step1=2;
if(c2.length==4) step2=1;
else step2=2;
for(i=0;i<3;i++){
    x=parseInt(c1.substr(1+step1*i,step1),16);
    if(step1==1) x=16*x+x;
    y=parseInt(c2.substr(1+step2*i,step2),16);
    if(step2==1) y=16*y+y;
    r[i]=Math.floor((x*50+y*50)/100);
    }
return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
}

/*
--------------------- Gradient calc --------------------------
*/

gradient={
	h2d:function(x){return parseInt("0x"+x,16)},
	d2h:function(x){
		var y="0123456789abcdef";
		var z=y.substr(x&15,1);
		while(x>15) {x>>=4;z=y.substr(x&15,1)+z};
		while(z.length<2){z="0"+z};
		return z
	},
	create:function(startColor,endColor,steps){
		var s=startColor.split(""); var e=endColor.split("");
		var r1=this.h2d(s[0]+s[1]);
		var g1=this.h2d(s[2]+s[3]);
		var b1=this.h2d(s[4]+s[5]);
		var r2=this.h2d(e[0]+e[1]);
		var g2=this.h2d(e[2]+e[3]);
		var b2=this.h2d(e[4]+e[5]);
		var r=r1; var g=g1; var b=b1;
		steps--;
		var rs=(r2-r1)/steps;
		var gs=(g2-g1)/steps;
		var bs=(b2-b1)/steps;
		var a=[];
		for(var i=0;i<steps;i++){
			a.push(this.d2h(r)+this.d2h(g)+this.d2h(b));
			r+=rs; g+=gs; b+=bs;
		};
		a.push(e.join(''));
		return a
	},
	applyOnText:function(text,startColor,endColor){
		var t=text.split("&ndash;").join("$").split("&amp;").join("£").split("");
		var r=0; var intag=false;
		for(var i=0;i<t.length;i++){
			if(t[i]=="<"){intag++};
			if(!intag){r++};
			if(t[i]==">"){intag--}
		}
		var x="";
		var c=this.create(startColor,endColor,r);
		var r=0; var intag=false;
		for(var i=0;i<t.length;i++){
			if(t[i]=="<"){intag++};
			if(!intag){x+='<span style="color:#'+c[r]+'">'+t[i]+'</span>';r++} else {x+=t[i]};
			if(t[i]==">"){intag--}
		}
		return x.split("$").join("&ndash;").split("£").join("&amp;")
	}
}


/*
--------------------- Code Highlighter --------------------------
*/

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
	})
	
}

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;
		}
	}
	
	for (var i in this.styleSets){highlightCode(this.styleSets[i])}
}

CodeHighlighter.addStyle("javascript",{
	comment : {
		exp  : /(\/\/[^\n]*\n)|(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)/
	},
	brackets : {
		exp  : /\(|\)/
	},
	string : {
		exp  : /'[^']*'|"[^"]*"/
	},
	keywords : {
		exp  : /\b(arguments|break|case|continue|default|delete|do|else|false|for|function|if|in|instanceof|new|null|return|switch|this|true|typeof|var|void|while|with)\b/
	},
	global : {
		exp  : /\b(toString|valueOf|window|element|prototype|constructor|document|escape|unescape|parseInt|parseFloat|setTimeout|clearTimeout|setInterval|clearInterval|NaN|isNaN|Infinity)\b/
	}
});

CodeHighlighter.addStyle("css", {
	comment : {
		exp  : /\/\*[^*]*\*+([^\/][^*]*\*+)*\//
	},
	keywords : {
		exp  : /@\w[\w\s]*/
	},
	selectors : {
		exp  : "([\\w-:\\[.#][^{};>]*)(?={)"
	},
	properties : {
		exp  : "([\\w-]+)(?=\\s*:)"
	},
	units : {
		exp  : /([0-9])(em|en|px|%|pt)\b/,
		replacement : "$1<span class=\"$0\">$2</span>"
	},
	urls : {
		exp  : /url\([^\)]*\)/
	}
 });

CodeHighlighter.addStyle("html", {
	comment : {
		exp: /&lt;!\s*(--([^-]|[\r\n]|-[^-])*--\s*)&gt;/
	},
	tag : {
		exp: /(&lt;\/?)([a-zA-Z]+\s?)/, 
		replacement: "$1<span class=\"$0\">$2</span>"
	},
	string : {
		exp  : /'[^']*'|"[^"]*"/
	},
	attribute : {
		exp: /\b([a-zA-Z-:]+)(=)/, 
		replacement: "<span class=\"$0\">$1</span>$2"
	},
	doctype : {
		exp: /&lt;!DOCTYPE([^&]|&[^g]|&g[^t])*&gt;/
	}
});


/*
--------------------- Div Handler ------------------------
*/

div={}

div.get=function(x){
	var y=null
	if (document.getElementById){y=document.getElementById(x)}
	else if (document.all){y=eval('document.all.' + x)}
	else if (document.layers){var y=document.layers[x]}
	return y
}

div.add=function(name){
	if(!this.get(name)){
		var x=document.body.innerHTML
		x+='<DIV ID="'+name+'"></DIV>'
		document.body.innerHTML=x
	}
	return this.get(name)
}

/*
--------------------- Cookie Handler --------------------------
*/

cookieHandler={

set:function( name, value, expires, path, domain, secure ) 
{
// set time, it's in milliseconds
var today = new Date();
today.setTime( today.getTime() );

/*
if the expires variable is set, make the correct 
expires time, the current script below will set 
it for x number of days, to make it for hours, 
delete * 24, for minutes, delete * 60 * 24
*/
if ( expires )
{
expires = expires * 1000 * 60 * 60 * 24;
}
var expires_date = new Date( today.getTime() + (expires) );

document.cookie = name + "=" +escape( value ) +
( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + 
( ( path ) ? ";path=" + path : "" ) + 
( ( domain ) ? ";domain=" + domain : "" ) +
( ( secure ) ? ";secure" : "" );
},

get:function(name) {
	
var start = document.cookie.indexOf( name + "=" );
var len = start + name.length + 1;
if ( ( !start ) &&
( name != document.cookie.substring( 0, name.length ) ) )
{
return null;
}
if ( start == -1 ) return null;
var end = document.cookie.indexOf( ";", len );
if ( end == -1 ) end = document.cookie.length;
return unescape( document.cookie.substring( len, end ) );
},

deleter: function( name, path, domain ) {
if ( Get_Cookie( name ) ) document.cookie = name + "=" +
( ( path ) ? ";path=" + path : "") +
( ( domain ) ? ";domain=" + domain : "" ) +
";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

}

/*
--------------------- Main --------------------------
*/

function start(wdiv,conts){
	var ipath="jsLibrary/images/general/"
	var b=document.body
	var mainpage=true
	if(typeof wdiv=="string"){b=div.get(wdiv);mainpage=false}
	var menu='<div><img src="'+ipath+'transpx.gif" width=220 height=1></div>'
	if(mainpage && frames.length>0){
		if(!Saf.started){
			menu=theMenu.initMenu()
		}
		else {
			menu=Saf.menu
		}
		if(menu===undefined){location.replace(locatio.href)}
	}
	var x="" 
	var o=""
	var psbr='<IMG SRC="'+ipath+'transpx.gif" WIDTH=1 HEIGHT=6 BORDER=0>'

	// get original html
	if(!conts){x=b.innerHTML} else {x=conts}

	// remove menu-iframe-div
	if(mainpage){
		x=x.split('<div').join('<DIV').split('</div>').join('</DIV>')
		x=x.split('<DIV')
		for (var i=1;i<x.length;i++){
			var y=x[i].split('</DIV>')
			var z=y[0].toLowerCase().split('"').join('')
			if(z.indexOf('class=menu')>=0){x[i]=y[1]} else {x[i]='<DIV'+x[i]}
		}
		x=x.join('')
	}
	
	// change pre title to pre alt
	x=x.split('<PRE ').join('<pre ').split('<pre TITLE').join('<pre title')
	x=x.split('<pre title').join('<pre alt')
	

	// extra space after pictures
	x=x.split('<img').join('<IMG').replace(/<IMG([^>]*)>/g,'<IMG$1>')

	x=x.split("[mailaddress]").join('<a href="mailto:thomas@clientsmile.se">thomas@clientsmile.se</a>')

	// fix headlines
	x=x.split('<br').join('<BR').split('<BR/').join('<BR')
	x=x.split("<BR>").join(psbr)
	x=x.split("<h").join("<H").split("</h").join("</H")
	var logoimg='tf_logo.jpg'; var site="thomasfrank.se"; var csty=""
	if(x.indexOf('<H1>Clientsmile</H1>')>=0){
		site="Clientsmile";logoimg='clientsmile_logo.gif'
		csty=' style="color:#3F558F"'
		x=x.split('<A').join('<a').split('<a').join('<a style="color:#3F558F" ')
	}
	x=x.split('<H1>thomasfrank.se</H1>').join("")
	x=x.split('<H1>Clientsmile</H1>').join("")
	x=x.split("<H1>").join('<BR><BR><SPAN CLASS="H1"'+csty+'>')
	x=x.split("<H2>").join('<BR><BR><SPAN CLASS="H2"'+csty+'>')
	x=x.split("<H3>").join('<BR><BR><SPAN CLASS="H3"'+csty+'>')
	x=x.split("</H1>").join('</SPAN>')
	x=x.split("</H2>").join('</SPAN>')
	x=x.split("</H3>").join('</SPAN>')
	x=x.split('alt=').join('ALT=')
	x=x.replace(/ALT="([^"]*)"([^>]*)>/g,'ALT="$1"$2><SPAN CLASS="imgtext">$1</SPAN>')

	// fix some tables
	var tableProto=''+
	'<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>'+
	'<TR><TD>cellContent</TD></TR></TABLE>'

	var graphicTable=''+  
	'<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>'+
	'<TR><TD BACKGROUND="'+ipath+'upper.gif">'+
	'<IMG SRC="'+ipath+'transpx.gif" WIDTH=1 HEIGHT=20></TD></TR>'+
	'<TR VALIGN="top" ID="maintd" STYLE="height:1px">'+
	'<TD BACKGROUND="'+ipath+'/middle.gif" ALIGN="left">'+
	'cellContent</TD></TR>'+
	'<TR><TD BACKGROUND="'+ipath+'lower.gif">'+
	'<IMG SRC="'+ipath+'transpx.gif" WIDTH=1 HEIGHT=20></TD></TR>'+
	'</TABLE>'

	// Take away breaks at beginning
	x=x.replace(/<BR>/,"").replace(/<BR>/,"")

	// Main area width
	var mwidth=547-25
	var liwidth=mwidth-25

	// Add image to maintain width at end
	x+='<BR><IMG SRC="'+ipath+'transpx.gif" WIDTH='+mwidth+' HEIGHT=1>'

	// fix some more tables
	var contentTable=tableProto.split("PADDING=0").
	join("PADDING=0").split("cellContent").join('[mcs]'+x+'[mce]').
	split('<TD>').join('theSiteLogo<TD CLASS="leftpad" VALIGN="top" WIDTH='+mwidth+'>').
	split('</TD>').join('</TD><TD ALIGN="right" VALIGN="top" WIDTH=1>'+menu+'</TD>')
	
	// Logo
	var logo='<TR><TD STYLE="padding:0px;padding-top:8px;padding-left:22px;padding-bottom:40px"'+
	' COLSPAN=2><a href="/"><IMG SRC="'+ipath+logoimg+'" ALT="'+site+'" border="0"></a></TD></TR>'
	contentTable=contentTable.split("theSiteLogo").join(logo)

	// fix some more tables
	o=tableProto.split("<TABLE").join("<TABLE WIDTH=100%")
	o=o.split("<TD").join('<TD ALIGN="center"')
	o=o.split("cellContent").join(graphicTable)
	o=o.split("cellContent").join(contentTable)
	
	// pre-subtexts
	o=o.split('<pre').join('<PRE').split('</pre').join('</PRE')
	o=o.split("<PRE")
	for (var i=1;i<o.length;i++){
		var s='<SPAN CLASS="imgtext">'
		var pos=o[i].indexOf(s)
		if (pos>-1){
			var pos2=o[i].indexOf('</SPAN>')+7
			var s=o[i].substring(pos,pos2)
			o[i]=o[i].replace(new RegExp(s,"g"),"")
			o[i]=o[i].replace(/<\/PRE>/g,'</PRE>'+s)
		}
	}
	o=o.join("<PRE")

	// pre - visible tags
	o=o.split("<PRE")
	for (var i=1;i<o.length;i++){
		var pos=o[i].indexOf(">")+1
		var pos2=o[i].indexOf("</PRE>")
		var t=o[i].substring(pos,pos2)
		var newt=t.split("<").join("&lt;").split(">").join("&gt;")
		o[i]=o[i].split(t).join(newt)
	}
	o=o.join("<PRE")

	// target _blank on external links - off
	o=o.split('href="').join('HREF="')
	//o=o.split('HREF="http://').join('ONFOCUS="this.blur()" TARGET="_blank" HREF="http://')

	// fix lists <OL>, <UL>, <LI>
	o=o.split('ol>').join('OL>').split('ul>').join('UL>').split('li>').join('LI>')
	o=o.split('</LI>').join("")
	o=o.split('<UL>')
	for (var i=1;i<o.length;i++){
		var s=o[i].split('</UL>')
		var t=s[0].split("<LI>")

		t=t.join('</TD></TR><TR VALIGN="top"><TD WIDTH=20 STYLE="font-size:18px" CLASS="numberlist">&#8226;&nbsp;</TD><TD WIDTH='+liwidth+'>')
		s[0]=t;o[i]=s.join('</td></tr></table>')
	}	
	o=o.join(psbr+'<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD>removeThisLine')
	o=o.replace(/<TR><TD>removeThisLine[^<]*<\/TD><\/TR>/g,"")
	o=o.split('<OL>')
	for (var i=1;i<o.length;i++){
		var s=o[i].split('</OL>')
		var t=s[0].split("<LI>")
		for (var j=1;j<t.length;j++){
			t[j]='</TD></TR><TR VALIGN="top"><TD WIDTH=20 CLASS="numberlist">'+j+'&nbsp;</TD><TD WIDTH='+liwidth+'>'+t[j]
		}
		t=t.join('')
		s[0]=t;o[i]=s.join('</td></tr></table>')
	}	
	o=o.join(psbr+'<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD>removeThisLine')
	o=o.replace(/<TR><TD>removeThisLine[^<]*<\/TD><\/TR>/g,"")
	
	// Maked "naked-to-dressed" link "dressed-to-naked"
	o=o.split('<a').join('<A').split('</a>').join('</A>')
	o=o.replace(/\?naked=false">See this page dressed.<\/A>/g,'?naked=true">See this page naked.</A>')

	o=o.replace(/<\/table>\s{1,10}<BR><BR><SPAN CLASS="H/g,'</table><BR><SPAN CLASS="H')
	
	// extra space after pre if not a headline after pre
	o=o.replace(/(<\/PRE>[^<]*<SPAN[^<]*<\/SPAN>[^<]*<IMG[^6]*)=6>/g,'$1=18>')
	o=o.replace(/(<\/PRE>[^<]*<SPAN[^<]*<\/SPAN>[^<]*)<BR><BR>/g,"$1"+psbr.split("6").join("26"))
	o=o.replace(/(<IMG[^<]*>[^<]*<SPAN[^<]*<\/SPAN>[^<]*)<BR><BR>/g,"$1"+psbr.split("6").join("26"))

	// Add a code class to pre
	o=o.replace(/(<PRE[^>]*>)/g,'$1<CODE CLASS="javascript">')
	o=o.replace(/<\/PRE>/g,'</CODE></PRE>')

	// Embed pre in div
	o=o.replace(/<PRE/g,'<DIV CLASS="pre"><PRE')
	o=o.replace(/<\/PRE>/g,'</PRE></DIV>')

	// Insert space in blank (for codeHighliter/Opera bug)
	o=o.split("\r").join("").split("\n\n").join("\n \n")

	// Long -
	if(mainpage){
		o=o.replace(/--/g,'<span STYLE="font-family:Verdana">&ndash;</span>')
   		 o=o.replace(/- -/g,'--')
	}

	// Only write back main content if not mainpage
	if(!mainpage){o=o.split("[mcs]")[1].split("[mce]")[0].split('522').join('1')}
	else {o=o.split("[mcs]").join("").split("[mce]").join("")}

	if(mainpage){
		o+='<DIV ID="commentiframe" STYLE="display:none"></DIV>'
	}

	o=o.replace(/(<SPAN CLASS="H[^"]*"><A)/g,'$1 STYLE="text-decoration:none"')

	// Replace all tabs with 5 &nbsp; primarily since Safari has so wide tab stops
	o=o.replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;").split("[[[").join("&lt;").split("]]]").join("&gt;")


	// Write back modified HTML
	if(!b){return}
	b.style.topMargin="0px"
	b.style.leftMargin="0px"
	if(navigator.userAgent.indexOf("Netscape/7")>=0){o=o.split("float: left").join("")}
	if(mainpage){
		// apply gradient
		for(var j=1;j<2;j++){
			o=o.split('<SPAN CLASS="H'+j+'">')
			for(var i=1;i<o.length;i++){
				o[i]=o[i].split("</SPAN>")
				o[i][0]=gradient.applyOnText(o[i][0],"BA643F","e38d68")
				o[i]=o[i].join("</SPAN>")
			}
			o=o.join('<SPAN CLASS="H'+j+'">')
		}
	}
	b.innerHTML=o

	if(mainpage){
		CodeHighlighter.init()
		setNifty()
		niftyArrows.init()
		makeBodyVisible()
		setInterval("adjustForHeight()",200)
		lastPageHeight=pageSize()[1]
		getComments()
		if(Saf.started){setComments(Saf.comments)}
		if(window["extraOnload"]){extraOnload()}
		// run code examples
		var x=document.getElementsByTagName('span')
		for(var i=0;i<x.length;i++){
			var c=x[i].className
			if(c.indexOf("runnableCode")>=0){
				c=c.split("_")
				if(c.length>1){
					c=c[1]
					x[i].innerHTML='<div align="middle"style="border-color:#000;width:80px;border-width:1px;border-style:solid;padding:2px;background:#ffffcc;position:relative;top:60px;left:400px"><a class="imgtext" style="font-style:normal;text-decoration:none;color:#000" href="javascript:'+c+'()">Run this code</a></div>'
				}
			}
		}
	}
	
	if(window["afterAllOnLoad"]){afterAllOnLoad()}
	return o
}

function adjustForHeight(){
	div.get("maintd").style.height=pageSize()[1]-80
}


function makeBodyVisible(){
	/* wait until all images has loaded then make body visible
	var all_visible=true
	var di=document.images
	for(var i=0;i<di.length;i++){
		all_visible=all_visible && di[i].complete
	}
	if(!all_visible){setTimeout("makeBodyVisible()",200);return}*/
	document.body.style.visibility="visible"
	// fix firefox css-bug
	//setTimeout("window.resizeBy(1,0);window.resizeBy(-1,0)",50)
}

function setNifty(){
	if(!NiftyCheck()){return}
	Rounded("div.pre","all", "#FFF", "#FFF", "border #333333")
	Rounded("div.menuholder","tl bl", "#FFF", "#A9B7F6", "smooth")
	Rounded("div.comments","all", "#FFF", "#CCC", "smooth")
}

function tagsSmall(x){
	x=x.split('<')
	for(var i=1;i<x.length;i++){
		var y=x[i].split(">")
		y[0]=y[0].toLowerCase()
		x[i]=y.join(">")
	}
	x=x.join('<')
	return x
}

function pageSize(){
	var x,y;
	if (self.innerHeight) // all except Explorer
	{
		x = self.innerWidth;
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight)
		// Explorer 6 Strict Mode
	{
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}
	return [x,y]
}

function getComments(onlyLoc){
	if(location.href.indexOf("http://")<0){return}
	var l=location.href
	l=l.split("?jsas").join("")
	var p=l.indexOf("public_html")
	/*if (p>=0){l=l.substring(p+12)}
	else {
		l=l.replace(/\.se/g,".com")
		l=l.split(".com")[1]
	}*/
	// GLESYS
	l=l.substring(l.lastIndexOf("/"))
	
	l=l.split("#").join("?").split("?")[0];
	l=escape(l)
	theCommentLocation=l
	if(onlyLoc){return l}
	var d=div.get("comments")
	if(d){
		if(!div.get("showhidecomments")){
					var p='10';if(navigator.userAgent.indexOf("Netscape/7")>=0){p='0'}
					var rc='<DIV ID="realcomments" STYLE="display:inline;margin-top:10px;padding:'+p+'px"></DIV>'
					var ifr='<IFRAME NAME="owncomment" HEIGHT=370 WIDTH=500'+
					'SRC="/jsLibrary/leaveComment.html" FRAMEBORDER=0 BORDER=0>'+
					'</IFRAME>'
					if(Saf.started){ifr=""}
					var divs='<DIV ID="commentheadline" class="H2" STYLE="background:'+
					'#cccccc;padding-bottom:0px;padding:10px;">'+
					'</DIV>'+rc+
					'<DIV ID="owncomment" STYLE="padding-left:10px;display:none">'+
					ifr+
					'</DIV>'+
					'<DIV ID="commentheadline2" class="H2" STYLE="background:'+
					'#cccccc;padding:10px;padding-bottom:0px"></DIV>'
					var ih=d.innerHTML
					ih=ih.split("[comments]").join(divs)
					d.innerHTML=ih
		}
		if(!Saf.started){
			d=div.get("commentiframe")
			d.innerHTML='<IFRAME NAME="comments" SRC="/comments/commentHandler.php?func=select&pageurl='+l+'"></IFRAME>'
			if(frames.length>=2){
				frames["comments"].location.replace("/comments/commentHandler.php?func=select&pageurl="+l)
				frames["owncomment"].location.replace("/jsLibrary/leaveComment.html")
			}
		}
	}
}

function setComments(x){
	leaveComment("none")
	commentToIDmap=[]
	if (!Saf.started){
		frames["owncomment"].location.replace("/jsLibrary/leaveComment.html")
	}
	clangd=x.length-1
	var y="<ol>"
	for (var i=0;i<clangd;i++){
		    var c=unescape(x[i].comment).split("")
			var intag=false
			var sincespace=0
			for(var j=0;j<c.length;j++){
				if(c[j]=="<" || c[j]==">"){intag=!intag}
				if(!intag && c[j]!=" "){sincespace++} else {sincespace=0}
				if(!intag && sincespace>55){c[j]+="<br>";sincespace=0}
			}
			c=c.join("")
			var name=unescape(x[i].name)
			var site=unescape(x[i].email)
			if(site.length>7){name='<a class="H3" style="color:#000000" href="'+site+'">'+name+'</a>'}
			else {name='<b><h3>'+name+'</h3></b>'}
			y+='<li><a name="comment'+(i+1)+'"></a>'+name+'<br>'
			y+=nicetime(x[i].time)+'<br>'
			y+=c+'<br><br>'
			commentToIDmap[i+1]=x[i].id
	}
	y+='</ol>'
	var c=start("realcomments",y);
	if(!c){return}
	c=c.split('</tr>').join('</TR>')
	//reverse
	var re=true
	if(re){
		var restr=c.substring(c.indexOf("<TR"),c.lastIndexOf('</TR>')+5)
		var restr2=restr
		restr2=restr2.split("<TR")
		//restr2=restr2.reverse()
		restr2=(restr2.join('<TR'))
		restr2=restr2.substring(0,restr2.length-3)
		c=c.split(restr).join(restr2)
		c=c.replace(/<BR><BR><SPAN/g,"<SPAN")
		c=c.replace(/"numberlist"/g,'"H3"')
		c=c.replace(/CLASS="H3"/g,'CLASS="H3" STYLE="color:#000000"')
		if(c.indexOf('</table>')>=0){
			c=c.substring(0,c.lastIndexOf('</table>'))+'tr></table>'
		}
		c=c.split("flashpaper/2 ").join("flashpaper/2<br>")
		div.get("realcomments").innerHTML=c
		var ts=div.get("realcomments").getElementsByTagName('td')
		for(var i=0;i<ts.length;i++){
			if(ts[i].width==497){ts[i].innerHTML='<div style="overflow:hidden">'+ts[i].innerHTML+'</div>'}	
		}
	}
	showComments(clangd)
	nrOfComments=clangd
	div.get("comments").style.display="block"
	endParseLinks()
}

function endParseLinks(){
	var d=document.links
	for(var i=0;i<d.length;i++){
		/*if(Explorer && Windows && d[i].href.indexOf("ecmanaut.blogspot.com")>=0){
			d[i].href="javascript:ecmanautWarn()"
		}*/
	}
}


function showComments(x){
	if(!x){leaveComment("none")}
	var disp="block"; var inner='<a style="font-size:11px" href="javascript:showComments()">Hide comments</a>'
	if(!x){disp="none"; inner='<a style="font-size:11px" href="javascript:showComments(true)">Show comments</a>'}
	if(!clangd){inner=""}
	var cword=" comments"; if(clangd==1){cword=" comment"}
	if(x || !clangd){inner='<a style="font-size:11px" '+
	' href="javascript:leaveComment()" onfocus="this.blur()">Leave your own comment</a>&nbsp;&nbsp;'+inner}
	inner='<div style="position:absolute">'+clangd+cword+'</div><div align="right">'+inner+'</div>'
	div.get("commentheadline").innerHTML=inner
	var c=div.get("commentheadline2")
	if(c){
		c.innerHTML=inner
		c.style.display=x?"block":"none"
	}
	div.get("realcomments").style.display=disp
}

function leaveComment(x){
	var s=div.get("owncomment")
	if(!s){return}
	s=s.style
	var n="block"
	if(s.display=="block"){n="none"}
	if(x=="none"){n="none"}
	if(n=="block"){
		if(!Saf.started){
			frames["owncomment"].location.replace("/jsLibrary/leaveComment.html")
		}
		else {
			s.padding="10px"
			div.get("owncomment").innerHTML=Saf.leave	
		}
	}
	s.display=n
	if(n!="none"){scrollTo(0,50000)}
}

function nicetime(x){
	//x=x.substring(0,12).split("")
	//x=x[0]+x[1]+x[2]+x[3]+"-"+x[4]+x[5]+"-"+x[6]+x[7]+" "+x[8]+x[9]+":"+x[10]+x[11]
	x=x.split(':')
	x.pop()
	x=x.join(':')
	x='<span style="font-size:11px;font-family:Verdana,Arial,Helvetica">'+x+'</span>'
	return x
}

orgContent=false
lastPageHeight=false


/*
--------------------- Menu --------------------------
*/

theMenu={
	mouseOverColor:"#dddddd",
	markedColor:"#dddddd",
	arrowColor:"#2940A4",
	arrowMouseOverColor:"#5F7BF4",
	initMenu:function(){
		if(frames.length<1){return}
		this.menuItems=[]
		var m=this.menuItems
		var x=""
		var x=frames[0].document.body.innerHTML
		var orgix=x
		x=tagsSmall(x)
		x=x.split('<pre>').join('')
		x=x.split('</pre>').join('')
		x=x.replace(/\r/g,"")
		x=x.split("\n")
		// create menu objects
		var root={mname:"ROOT",children:[],mparent:false,siblings:[],ancestors:[]}
		for(var i=0;i<x.length;i++){
			if(x[i]){
				var level=x[i].split("\t").length
				if(x[i].split('href="').length<2){continue}
				var url=x[i].split('href="')[1].split('"')[0]
				url=url.replace(/\/jslibrary/g,"")
				var ipos=url.indexOf("thomasfrank.se/")
				if(ipos>=0){
					url=url.substring(ipos+14)
				}
				var mname=x[i].split('>')[1].split("<")[0]
				var mparent=root
				var co=m.length-1
				while(co>=0 && mparent.mname=="ROOT"){
					if(m[co].level<level){mparent=m[co]}
					co--
				}
				m.push({level:level,url:url,mname:mname,mparent:mparent,marked:false,
				children:[],ancestors:[],siblings:[],visible:false,autovisible:false})			
			}
		}
		// add previous visible state set by user
		var s=cookieHandler.get('menustate')
		if(s){
			s=s.split("")
			for(var i=0;i<m.length;i++){
				m[i].visible=(s[i]=="1")
			}
		}
		// add children
		for(var i=0;i<m.length;i++){
			m[i].number=i
			if(m[i].mparent){
				m[i].mparent.children.push(m[i])
			}	
		}
		// add siblings
		for(var i=0;i<m.length;i++){
			var p=m[i].mparent
			m[i].siblings=p.children
		}
		// add ancestors
		for (var i=0;i<m.length;i++){
			var obj=m[i].mparent
			while(obj!=false){
				m[i].ancestors.push(obj)
				// include ancestors siblings too
				if(obj.siblings){
					for(var j=0;j<obj.siblings.length;j++){
						m[i].ancestors.push(obj.siblings[j])
					}
				}
				obj=obj.mparent
			}
		}
		// join children, siblings and ancestors in the relatives array
		for (var i=0;i<m.length;i++){
			var r=[]
			for(var j=0;j<m[i].ancestors.length;j++){r.push(m[i].ancestors[j])}
			for(var j=0;j<m[i].siblings.length;j++){r.push(m[i].siblings[j])}
			for(var j=0;j<m[i].children.length;j++){r.push(m[i].children[j])}
			m[i].relatives=r
		}
		// set marked depending on url
		var loc=location.href
		if(loc=="http://www.thomasfrank.se/"){loc+="indexa.html"}
		for (var i=0;i<m.length;i++){
			var part=""
			var pos=loc.indexOf(m[i].url)
			if(pos>=0){
				part=loc.substring(pos)	
			}
			if(part==m[i].url){
				m[i].marked=true
				// set autovisible for relatives
				for (var j=0;j<m[i].relatives.length;j++){
					m[i].relatives[j].autovisible=true
				}
			}
		}
		// set autovisible for all level 1
		for (var i=0;i<m.length;i++){if(m[i].level==1){m[i].autovisible=true}}
		
		// build divs
		var o='<DIV CLASS="menuholder">'
		for (var i=0;i<m.length;i++){

			var leveloffset=20*(m[i].level-1)

			var transpx='<IMG SRC="jsLibrary/images/general/transpx.gif" WIDTH="1" HEIGHT="1" BORDER="0">'

			var x='<DIV ID="menuitem'+i+'" STYLE="_st_">'+


			'<DIV STYLE="position:absolute;top:inherit;left:inherit;padding-left:'+(30+leveloffset)+'px"'+
			' CLASS="tdmenulevel'+m[i].level+'">'+m[i].mname+'</DIV>'+

			'<DIV ID="menuarrow'+i+'" STYLE="position:absolute;top:inherit;left:inherit;padding-top:7px;padding-left:'+
			(15+leveloffset)+'px" '+
			'TITLE="niftyArrow{point:\'_adir_\',color:\''+this.arrowColor+'\',size:8}"></DIV>'+

			'<DIV STYLE="position:absolute;top:inherit;left:inherit;padding-left:15px">'+
			transpx.replace(/H="1/g,'H="160').replace(/T="1/g,'T="20').replace(/>/g,' USEMAP="#mitemmap'+i+'">')+'</DIV>'+

			transpx.replace(/H="1/g,'H="160').replace(/T="1/g,'T="22')+'</DIV>'

			// arrow dir
			if(m[i].children.length<1){
				x=x.replace(/size\:8/g,"size:0")
			}
			else {
				if (m[i].children[0].visible || m[i].children[0].autovisible){x=x.replace(/_adir_/g,"down")}
				else {x=x.replace(/_adir_/g,"right")}
			}
			
			// visibility
			if(m[i].visible || m[i].autovisible){
				x=x.replace(/_st_/g,"_st_display:block")
			}
			else {
				x=x.replace(/_st_/g,"_st_display:none;")
			}

			// mark
			if(m[i].marked){
				x=x.replace(/_st_/g,"_st_background:"+this.markedColor+";")
			}

			// imagemap
			x+='<MAP NAME="mitemmap'+i+'">'
			if(m[i].children.length<1){
				x+='<AREA HREF="'+m[i].url+'" ONMOUSEOVER="theMenu.moOver('+i+')"'+
				' ONMOUSEOUT="theMenu.moOut('+i+')" '+
				'COORDS="0,0,160,20">'

			} else {
				x+='<AREA HREF="'+m[i].url+'" ONMOUSEOVER="theMenu.moOver('+i+')"'+
				' ONMOUSEOUT="theMenu.moOut('+i+')" '+
				'COORDS="0,0,'+(leveloffset)+',20">'+

				'<AREA HREF="javascript:theMenu.fold('+i+')" ONMOUSEOVER="theMenu.arrowMoOver('+i+')"'+
				' ONMOUSEOUT="theMenu.arrowMoOut('+i+')" '+
				'COORDS="'+(leveloffset)+',0,'+(15+leveloffset)+',20">'+

				'<AREA HREF="'+m[i].url+'" ONMOUSEOVER="theMenu.moOver('+i+')"'+
				' ONMOUSEOUT="theMenu.moOut('+i+')" '+
				'COORDS="'+(15+leveloffset)+',0,160,20">'
			}
			x+='</MAP>'

			x=x.replace(/_st_/g,"")
			o+=x
		}
		o+=searchField()
		o+='<DIV STYLE="height:5px">'+transpx+'</DIV></DIV>'
		
		// Netscape 7 fix for menu - use a simpler menu
		if(navigator.userAgent.indexOf("Netscape/7")>=0){
			var y=orgix
			var loc=loc.substring(loc.lastIndexOf("/")+1)
			y=y.substring(y,y.lastIndexOf("</a>")+5)
			y=y.split('<pre>')[1].split('</pre>').join("").split("\n").join('<br>\t')
			y=y.split('<a').join('<a style="text-decoration:none;font-family:Trebuchet MS,Arial;color:#000000" ')
			y=y.split(loc)
			if(y.length>1){
				y[0]=y[0].substring(0,y[0].lastIndexOf("color:#000000"))+'" href="'
			}
			y=y.join("loc")
			o='<div class="nsmenuholder" style="background:#A9B7F6;text-align:left;'+
			'margin-right:8px;margin-left:25px">\t'+
			y+'<br><img id="ns7spacer" src="jsLibrary/images/general/transpx.gif"'+
			' width=180 height=1 border=0>'+searchField()+'</div>'
		}
		return o
	},
	moOver: function(x){
		div.get("menuitem"+x).style.background=this.mouseOverColor
	},
	moOut: function(x){
		if(!this.menuItems[x].marked){
			div.get("menuitem"+x).style.background="none"
		}
	},
	moOutAll: function(){
		var x=0
		var d=true
		while(d){
			d=div.get("menuitem"+x)
			if(d){this.moOut(x)}
			x++
		}
	},
	arrowMoOver: function(x){
		niftyArrows.color("menuarrow"+x,this.arrowMouseOverColor)
		var y="Show subitems of "
		if(this.menuItems[x].children[0].visible || this.menuItems[x].children[0].autovisible){
			y=y.replace(/Show/g,"Hide")
		}
	},
	arrowMoOut: function(x){
		niftyArrows.color("menuarrow"+x,this.arrowColor)
	},
	choice: function(x){
		if(!this.folding){location.href=this.menuItems[x].url}
		this.folding=false
	},
	fold: function(x,forcehide){
		this.folding=true
		var c=this.menuItems[x].children
		var a=this.menuItems[x].ancestors
		var s=this.menuItems[x].siblings
		if(c.length>0){
			if(!c[0].autovisible && !c[0].visible && !forcehide){
				// show
				niftyArrows.rotate("menuarrow"+x,"down")
				for (var i=0;i<c.length;i++){div.get('menuitem'+c[i].number).style.display="block";c[i].visible=true}
				c=a;for (var i=0;i<c.length;i++){if(c[i].mname!="ROOT"){div.get('menuitem'+c[i].number).style.display="block";c[i].visible=true}}
				c=s;for (var i=0;i<c.length;i++){div.get('menuitem'+c[i].number).style.display="block";c[i].visible=true}		
			}
			else {
				//hide
				niftyArrows.rotate("menuarrow"+x,"right")
				for (var i=0;i<c.length;i++){	
					div.get('menuitem'+c[i].number).style.display="none"
					c[i].visible=false;c[i].autovisible=false
					this.fold(c[i].number,true)
				}
				// fix firefox css-bug
				//setTimeout("window.resizeBy(1,0);window.resizeBy(-1,0)",10)
			}
		}
		if(!forcehide){this.remember()}
	},
	remember: function(){
		var m=this.menuItems
		var s=""
		for (var i=0;i<m.length;i++){
			if(m[i].visible){s+="1"} else {s+='0'}
		}
		cookieHandler.set('menustate',s,'','/','','') 
	}
}


/*
--------------------- Nifty Arrows --------------------------
*/

niftyArrows=new function(){
	this.init=function(){
		var x=document.getElementsByTagName('div')
		for(var i=0;i<x.length;i++){
			if(x[i].title.indexOf("niftyArrow")==0){
				eval('arrows.push('+x[i].title.substring(10)+')')
				x[i].title=""
				arrows[arrows.length-1].obj=x[i]		
			}
		}
		for(var i=0;i<arrows.length;i++){
			buildArrow(arrows[i])
			arrowsById[arrows[i].obj.id]=arrows[i]
		}
	}
	this.rotate=function(theID,steps){
		if(steps==steps/1){
			var d=['up','rightUp','right','rightDown','down','leftDown','left','leftUp']
			var point=arrowsById[theID].point
			var pos=0
			for (var i=0;i<d.length;i++){if(d[i]==point){pos=i}}
			var newpos=pos+steps
			while(newpos>7){newpos-=8}
			while(newpos<0){newpos+=8}
			arrowsById[theID].point=d[newpos]
		}
		else {arrowsById[theID].point=steps}
		buildArrow(arrowsById[theID])
	}
	this.color=function(theID,color){
		arrowsById[theID].color=color
		buildArrow(arrowsById[theID])
	}
	var arrows=[]
	var arrowsById=[]
	var buildArrow=function(x){
		var valign="middle"
		var point=x.point
		if(point=="rightDown"){point="left";valign="bottom"}
		if(point=="rightUp"){point="left";valign="top"}
		if(point=="leftDown"){point="right";valign="bottom"}
		if(point=="leftUp"){point="right";valign="top"}
		var d=	'<td align="center"><div style="overflow:hidden;background:_c_;'+
			'width:_w_px;height:_h_px">&nbsp;</div></td>'
		var o=	'<table cellspacing=0 cellpadding=0 border=0><tr valign="middle">'
		var oEnd='</table>'
		var trS='<tr valign="'+valign+'">'
		if(point=="up" || point=="down"){
			d=trS+d+'</tr>'
			d=d.replace(/_h_/g,"1").replace(/_w_/g,"_h_")
		}
		else {
			d=d.replace(/_w_/g,"1")
			o+=trS
			oEnd='</tr>'+oEnd
		}
		d=d.replace(/_c_/g,x.color)
		var s=x.size; var e=0; var p=-1
		if(point=="left" || point=="up"){s=0;e=x.size;p=1}
		for (var i=s;i!==e;i+=p){o+=d.replace(/_h_/g,i)}
		o+=oEnd
		x.obj.innerHTML=o
	}
}

// Form handling... (leave comment)

function submitform(){
	var winbase=window
	if(!Saf.started){var winbase=frames["owncomment"]}	
	var f1=winbase.document.forms["leaveform1"].elements
	var f2=winbase.document.forms["leaveform2"].elements
	var f3=winbase.document.forms["leaveform2"]
	for(var i=0;i<f1.length;i++){window[f1[i].name]=clean(f1[i].value)}
	f2.name.value=escape(name)
	if(website.indexOf("http://")<0 && name!="delete"){website="http://"+website}
	if(name=="delete"){website=parent.commentToIDmap[website]}
	f2.email.value=escape(website)
	comment=comment.split("www.").join("http://wwwa.")
	while (comment.indexOf("http://http://")>0){comment=comment.split("http://http://").join("http://")}
	comment=comment.replace(/(http\:\/\/[^\s]*)/g,'<a href="$1">$1</a>')
	comment=comment.replace(/\r\n/g,"\n").replace(/\r/g,"\n").replace(/\n/g,"<br/>")
	comment=comment.replace(/(\W)\">/g,'">')
	comment=comment.replace(/(\W)<\/a>/g,'</a>$1')
	comment=comment.split('<a href="http://wwwa.').join('<a href="http://www.')
	comment=comment.split('http://wwwa.').join('www.')
	f2.comment.value=escape(comment)
	f2.pageurl.value=parent.theCommentLocation
	var allOK=true
	for(var i=0;i<f2.length;i++){
		if(f2[i].value.length<3){allOK=false}
	}
	if (allOK || name=="delete"){
		f3.submit()
	}
	return false
}

function clean(x){
	x=x.substring(0,5000)
	x=x.split("<").join("&lt;")
	x=x.split(">").join("&gt;")
	x=x.split("[comments]").join("[comments ]")
	return x
}

// A little browser sniffing
Opera=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1)
Safari=(navigator.userAgent.toLowerCase().indexOf("safari")!=-1)
Explorer=!!(document.all && (!(Opera || Safari)))
Explorer7=!!(Explorer && (navigator.userAgent.indexOf("MSIE 7.0")>=0))
Netscape4=!!(document.layers && (!(Opera || Safari)))
Mozilla=(document.getElementById && (!Explorer) && (!(Opera || Safari)))
Netscape_Mozilla=(Mozilla && navigator.userAgent.toLowerCase().indexOf("netscape")!=-1)
Firefox=(Mozilla && navigator.userAgent.toLowerCase().indexOf("firefox")!=-1)
Windows=(navigator.appVersion.indexOf("Win")!=-1)
MacOS=(navigator.appVersion.indexOf("Mac")!=-1)
Linux=(navigator.appVersion.indexOf("X11") != -1)


// Safari-fix... (executed on Firefox/Mozilla as well to fix back button problems...)

Saf={}


function SafariStart(){
	Saf.menu=theMenu.initMenu()
	var cloc=getComments(true)
	realSetComments=setComments
	if(cloc){
		setComments=SafariStart2
		if(frames.length>0){frames[0].location.replace('/comments/commentHandler.php?func=select&pageurl='+cloc)}
		else {start()}
	}
}

function SafariStart2(x){
	Saf.comments=x
	if(frames[0]){
		frames[0].location.replace("/jsLibrary/leaveComment.html")
	}
}

function SafariStart3(){
	Saf.leave=frames[0].document.body.innerHTML
	frames[0].location.replace("/jsLibrary/menu.html?"+Math.random())
	if(navigator.userAgent.indexOf("Netscape/7")<0){
		if(window["realSetComments"]){setComments=realSetComments}
		start()
	}
	else {setTimeout("nsStart()",10)}
}

function nsStart(){setComments=realSetComments;start()}

if(location.href.indexOf("http://")<0 || (!Safari && !Mozilla && !Firefox && !Linux)){
	leaveLoad=function(){}
	realSetComments=function(){};
	window.onload=start
}
else {
	Saf.started=true
	leaveLoad=SafariStart3
	window.onload=SafariStart
}

// Search field
function searchField(){
	var h=21;if(Explorer){h=16};
	return location.href.indexOf("search.php")>=0?'':
	'<div style="padding-left:25px;padding-top:10px">'+
	'<form name="searchForm" style="display:inline" method="get" action="search.php">'+
	'<input name="q" type="text" size=20 style="font-size:11px;width:80px;height:'+h+'px" >'+
	'<input type="hidden" name="c" value="1">&nbsp;&nbsp;'+
	'<input valign="middle" class="tdmenulevel3" type="submit" name="s" value="Search">'+
	'</form></div>'
}

// Goto comment
function gotoComment(){
	if(!window["nrOfComments"]){return}
	if(window["lastLocHash"]==location.hash){return}
	var toGo=location.hash.split("comment")
	if(toGo.length>1){
		toGo=toGo[1];
		if(toGo/1!=toGo || toGo/1<1){toGo=1}
		if(toGo/1>nrOfComments){toGo=nrOfComments}
		location.hash="#comment"+toGo
		lastLocHash=location.hash
	}
}
setInterval("gotoComment()",500)





// Fix for onload not retriggering in Opera, Safari etc...
pageLived={
	lastTime: new Date().getTime(),
	onceASec: function(){
		newTime=new Date().getTime()
		diff=newTime-this.lastTime
		if(diff>2000){theMenu.moOutAll()}
		this.lastTime=newTime
	}
}
setInterval("pageLived.onceASec()",500)


// Include RSS feed && hide contents while rebuilding
if(location.href.indexOf("thomasfrank.se")>=0 || 1==1){
	document.write('<link rel="shortcut icon" href="/favico.ico" type="image/x-icon"><link rel="shortcut" href="/favico.ico" type="image/x-icon"><link rel="alternate" type="application/rss+xml" title="RSS" href="http://feeds.feedburner.com/thomasfrank_se" /><link rel="alternate" type="application/rdf+xml" title="RSS" href="http://feeds.feedburner.com/thomasfrank_se" /><link rel="service.feed" type="application/atom+xml" title="Atom" href="http://feeds.feedburner.com/thomasfrank_se" /><style>body {visibility:visible}</style>'.split('visible').join('hidden'))
}
else {
	document.write('<link rel="shortcut icon" href="/favico_cs.ico" type="image/x-icon"><link rel="shortcut" href="/favico_cs.ico" type="image/x-icon"><style>body {visibility:visible}</style>'.split('visible').join('hidden'))
}
