var ts_webkit = 0;
if (navigator.userAgent.indexOf(' AppleWebKit') != -1) { ts_webkit = 1; }

function topscroll_init(id, path)
{
	// Initialize various attributes in the anchor tag
	//
	var div = document.getElementById(id);
	var width = div.getAttribute('width');
	var height = div.getAttribute('height');
	div.style.position = 'relative';
	div.style.backgroundColor = 'black';
	div.style.overflow = 'hidden';
	div.style.clip = 'rect(0px,0px,' + width + 'px,' + height + 'px)';
		
	scroller = new Object;
	scroller.container = div;
	scroller.images = 0;
	scroller.currentImage = 0;
	scroller.webkit = 0;
	scroller.loadedImages = 0;
	scroller.transitionTime = 400;
	scroller.displayTime = 6000;
	scroller.rolling = 0;
	scroller.timeout;
	scroller.timeoutLockout;
	scroller.width = width;
	scroller.height = height;

	/* Don't advance to the next frame when pause is true. */
	scroller.pause = 0;
	
	/*	Nav controls won't work when this is set to 1, so we won't start navigating away 
		mid-transition. */
	scroller.lockout = 0;
	if (navigator.userAgent.indexOf(' AppleWebKit') != -1) { scroller.webkit = 1; }

	if (div.hasChildNodes())
	{
		var child = div.firstChild;
		if (child.nodeType == 8) // Comment node type
		{
			if  (child.data.substr(0,10) == ' SCROLLER ')
			{
				if (window.DOMParser)
				{
					var parser = new DOMParser();
					var xml = parser.parseFromString(child.data.substr(10), 'text/xml');
					ts_xcatch(scroller,xml);
					return;
				}
				else
				{
					// MSIE
					var parser = new ActiveXObject("Microsoft.XMLDOM");
					parser.async='false';
					parser.loadXML(child.data.substr(10));
					ts_xcatch(scroller,parser);
					return;
				}
			}
		}
	}
	
	// If we don't have the data embedded in a comment, use the XHTTP request..
	ts_xget(path, scroller);
}

function ts_xget(path)
{
	var s_event_request;
	// branch for native XMLHttpRequest object
	if(window.XMLHttpRequest && !(window.ActiveXObject)) {
		try {
			ts_event_request = new XMLHttpRequest();
		} catch(e) {
			ts_event_request = false;
		}	
	// branch for IE/Windows ActiveX version
	} else if(window.ActiveXObject) {
		try {
			ts_event_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				ts_event_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				ts_event_request = false;
			}
		}
	}
	if (ts_event_request)
	{
		ts_event_request.onreadystatechange = function() { if (ts_event_request.readyState == 4)
		{
			var xml = ts_event_request.responseXML;
			ts_xcatch(scroller, xml); }
		};
		ts_event_request.open('GET', path, true);
		ts_event_request.send('');
	}
}

function ts_xcatch(scroller, xml)
{
		var mother = scroller.container;
		var mid = mother.getAttribute('id');
		
		mother.onmouseover = function() { scroller.pause = 1; }
		mother.onmouseout = function() { scroller.pause = 0; }
		
		
		var displaytime = xml.documentElement.getAttribute('displaytime');
		scroller.displayTime = displaytime;
		
		var images = xml.getElementsByTagName('frame');
		for (var i = 0; i < images.length; i++)
		{
			var frame = new Object;
			frame.number = i;
			frame.image = images[i].getAttribute('background');
			frame.href = images[i].getAttribute('href');
			frame.displaytime = images[i].getAttribute('displaytime');
			var divElt = ts_div(frame, scroller);
			
			/* Append canvases */
			ca = images[i].getElementsByTagName('canvas');
			for (var ci = 0; ci < ca.length; ci++)
			{
				canvas = new Object;
				cattr = ca[ci].attributes;
				for (var ai = 0; ai < cattr.length; ai++)
				{
					eval('canvas.' + cattr[ai].name + ' = "' + cattr[ai].value + '";');
				}
				
				divElt.appendChild(spit_canvas(canvas, scroller));
			}
			
			
			
			/* Append textblocks */
			tb = images[i].getElementsByTagName('textblock');
			for (var ti = 0; ti < tb.length; ti++)
			{
				var tbElt = tb[ti];
				textblock = new Object;
				textblock.height = tbElt.getAttribute('height');
				textblock.width = tbElt.getAttribute('width');
				textblock.x = tbElt.getAttribute('x');
				textblock.y = tbElt.getAttribute('y');
				textblock.text = tbElt.textContent;
				if (textblock.text == undefined) { textblock.text = tbElt.firstChild.data; } // IE workaround
				textblock.textcolor = tbElt.getAttribute('color');
				textblock.shadow = tbElt.getAttribute('shadow-color');
				textblock.background = tbElt.getAttribute('background');
				
				divElt.appendChild(spit_textblock(textblock, scroller));
			}
		}
		
		
		var navigation = document.createElement("div");
		navigation.setAttribute('id', 'topscroller-nav');
		var ns = navigation.style;
		ns.zIndex = 150;
		ns.position = 'absolute',
		ns.left = "15px";
		ns.bottom = "10px";
		ns.height = "20px";
		ns.width = "100px";
		
		for(i = 0; i < images.length; i++)
		{
			var clicker = document.createElement("div");
			cs = clicker.style;
			cs.width = "10px";
			cs.margin = "5px";
			cs.height = "10px";
			cs.position = 'absolute';
			cs.left = (i * 20) + "px";
			
			clicker.setAttribute('id', 'topbanner-nav-' + i);
			clicker.setAttribute('class', 'topscroller-nav');
			clicker.setAttribute('nav-frame', i);
			clicker.onclick = function() { ts_nav_to(this, scroller); }
			/*
				We use these to make the div contents unselectable. Unsure if
				this is a problem in IE or Mozilla, but Safari 4 will happily
				start selecting half the page if you - god forbid - select
				the empty div, which is easy to do by mistake / moving the mouse.
				
				I don't think it'll break anything, at least.
			*/
			clicker.onmousedown = function() { return false; }
			clicker.onselectstart = function() { return false; }
			
			navigation.appendChild(clicker);
		}
		
		
		
		mother.appendChild(navigation);
		
		
		scroller.images = images.length - 1; 
		
		/*
			We might want to show the first slide early, even if the BG image didn't load yet
			Then again, if we do this, the text will probably show up before the image.		
			Whichever is prettier, I leave to you to decide
			
			Either way, we always want to show it if it's the only frame in the slide.
		*/			
		if (scroller.images == 0)
		{
			ts_slide_show('topbanner-0');
		}
		loading_check(scroller);
}

function loading_check(scroller)
{
	var first = document.getElementById('topbanner-0');
	//if (first == null) { return; }
	
	if ( (first.getAttribute('loaded') == 1) && (scroller.rolling == 0) )
	{
		scroller.rolling = 1;
		ts_slider(scroller);
	}
	load_new_frame(scroller);
}

function load_new_frame(scroller)
{
	if (scroller.loadedImages > scroller.images) { return; }
		
	var frameElt = document.getElementById('topbanner-' + scroller.loadedImages);
	var source = frameElt.getAttribute('deferred-background-image');
	
	var img = new Image;
	img.src = source;
	/* Cache hit */
	if (img.width > 0)
	{ 
		if (frameElt.getAttribute('loaded') == 0)
		{
			frameElt.setAttribute('loaded', 1);
			setTimeout("loading_check(scroller);", 1);
		}
	}
	else
	{
		img.onload = function() { frameElt.setAttribute('loaded', 1); loading_check(scroller); }
		img.onerror = function() { frameElt.setAttribute('loaded', 1); loading_check(scroller); }
		img.src = source;
	}
	
	frameElt.style.backgroundImage = 'url(' + img.src + ')';
	scroller.loadedImages = scroller.loadedImages + 1;
}

/*
function load_new_frame()
{
	if (scroller.loadedImages > ts_images) { return; }

	var mother = document.getElementById('topbanner');	
	var frameElt = document.getElementById('topbanner-' + scroller.loadedImages);
	var source = frameElt.getAttribute('deferred-background-image');
	var skip = 0;
	
	var divs = mother.getElementsByTagName('div');
	for (i=0; i < divs.length; i++) 
	{
		if (divs[i].getAttribute('id') == 'topbanner-' + scroller.loadedImages) { continue; }
		var cmpSource = divs[i].getAttribute('deferred-background-image');
		if (cmpSource == null) { continue; }
		if (cmpSource != source) { continue; }
		
		if (divs[i].getAttribute('loaded') == 0) { divs[i].setAttribute('loaded', 2); }
		else { skip = 1; }
	}
	
	if (skip == 0)
	{
		var img = new Image;
		img.onload = function() { frameElt.setAttribute('loaded', "1"); loading_check(); }
		img.onerror = function() { frameElt.setAttribute('loaded', "1"); loading_check(); }
		
		img.src = source;
		frameElt.style.backgroundImage = 'url(' + img.src + ')';
	}
	else
	{
		frameElt.style.backgroundImage = 'url(' + source + ')';	
		frameElt.setAttribute('loaded', "1");
		setTimeout("loading_check();",1);
	}
	
	scroller.loadedImages = scroller.loadedImages + 1;
}
*/

function ts_div(frame, scroller)
{
	var mother = document.getElementById('topbanner');
	var nav = document.getElementById('topbanner-nav');
	
	var frameElt = document.createElement("div");
	frameElt.setAttribute('class', 'topscroller_frame');
	frameElt.setAttribute('id', 'topbanner-' + frame.number);
	frameElt.setAttribute('loaded', 0);
	if (frame.displaytime > 0) { frameElt.setAttribute('displaytime', frame.displaytime); }
	
		
	// Sort out our basic frame
	var s = frameElt.style;
	s.width = scroller.width;
	s.height = scroller.height;
	s.position = 'absolute';
	s.top = '0px';
	s.bottom = '0px';
	s.left = '0px';
	s.right = '0px';
	s.display = 'none';
	s.visibility = 'hidden';
	s.opacity = 0;
	s.filter = "alpha(opacity=0))";
	s.zIndex = 1;
	s.width =  scroller.width + 'px';
	s.height = scroller.height + 'px';	
	
	/* Got link? */
	if (frame.href != null)
	{
		frameElt.onclick=function(){ ts_link(frame.href); }
		frameElt.setAttribute('class', 'topscroller_frame topscroller_link');
	}
	
	mother.appendChild(frameElt);
	
	
	
	/*
		Slight hack so that we know when the BG image finished loading...
		If one image didn't load correctly, we still want the slide to run.
	*/
	frameElt.setAttribute('deferred-background-image', frame.image);	
	load_new_frame;
	
	return frameElt;
}

function spit_canvas(canvas, scroller)
{
	var canElt = document.createElement("canvas");
	
	// http://groups.google.com/group/google-excanvas/msg/86078ae7de7c10d9
	if (typeof G_vmlCanvasManager != 'undefined') { 
		// you must reassign the element to the return of this method. 
		canElt = G_vmlCanvasManager.initElement(canElt); 
	} 
	
	canElt.setAttribute('width', scroller.width);
	canElt.setAttribute('height', scroller.height);
	canElt.style.width = scroller.width;
	canElt.style.height = scroller.height;
	canElt.style.position='absolute';
	canElt.style.top='0px';
	canElt.style.left='0px';
	//canElt.setAttribute('id', 'topbanner-canvas-' + frame.number);
	
	eval( canvas.draw + '(canElt, canvas);' );
	
	return canElt;
}

function ts_link(url)
{
	window.location.href=url;
}

function spit_textblock(tb, scroller)
{
	var textBlockElt = document.createElement("div");
	textBlockElt.setAttribute('class', 'topscroller_textblock');
	var s = textBlockElt.style;
	
	s.position = 'absolute';
	s.width = tb.width + 'px';
	if (tb.height != null) { s.height = tb.height + 'px'; }
	s.top = tb.y + 'px';
	s.left = tb.x + 'px';
	
	if (tb.textcolor != null) { s.color = tb.textcolor; }
	else { if (tb.textcolor != null) { s.color = tb.textcolor; } }
	
	if (tb.shadow != '') {
		s.textShadow = "1px 1px 1px" + tb.shadow;
		s.filter = 'Shadow(Color=' + tb.shadow + ', Direction=135, Strength=1)';
	}
	
	if (tb.background != null) {
		s.background = tb.background;
		s.padding = "10px";
		s.opacity = 0.7;
		s.MozOpacity = 0.7; 
		s.KhtmlOpacity = 0.7; 
		s.filter = "alpha(opacity=30)"; 
	}
	
	textBlockElt.textContent = tb.text;
	textBlockElt.innerHTML = tb.text; // IE workaround
	return textBlockElt;
}


function ts_slider(scroller)
{
	/* Figure out what the current + next images in the loop are */
	scroller.nextImage = scroller.currentImage + 1;
	if (scroller.nextImage > scroller.images) { scroller.nextImage = 0; }
	var currentFrame = 'topbanner-' + scroller.currentImage;
	var nextFrame = 'topbanner-' + scroller.nextImage;
	
	/* Only one frame? Don't scroll it. */
	if (scroller.nextImage == scroller.currentImage) { return 0; }
	

	/* Check whether the upcoming frame is loaded. If not, defer until it is. */
	var nextElt = document.getElementById(nextFrame);
	if (nextElt == null) { scroller.rolling = 0; return 0; }
	if (nextElt.getAttribute('loaded') == 0) {
		scroller.rolling = 0;
		return 0;
	}
	
	ts_slide_show(currentFrame);
	ts_nav_set(scroller.currentImage);
	
	
	var curElt = document.getElementById(currentFrame);
	var dtime = curElt.getAttribute('displaytime') || scroller.displayTime;
	
	scroller.timeout = setTimeout("ts_slider_slide(0, scroller)", (dtime - scroller.transitionTime));
}

function ts_slide_show(frame)
{
	displayShow(frame);
	changeOpac(1, frame);
	setZ(frame, 90);
}

function ts_slider_slide(active, scroller)
{
	/*
		If the slider is paused, try again in 1.5 seconds.. 
		Won't apply if we forced a slide change using the nav controls.
	*/
	if (scroller.pause == 1 && active == 0) { scroller.timeoutLockout = setTimeout("ts_slider_slide(0, scroller)", 1500); return; }
	clearTimeout(scroller.timeoutLockout);
	
	var nextFrame = 'topbanner-' + scroller.nextImage;
	displayShow(nextFrame);
	changeOpac(1, nextFrame);
	setZ(nextFrame, 1);
	
	var currentFrame = 'topbanner-' + scroller.currentImage;
	//slideout( currentFrame, nextFrame, 'left', scroller.transitionTime);
	//slideout( currentFrame, 'left', scroller.transitionTime);
	//slip( currentFrame, 'left', scroller.transitionTime);
	opacity( scroller, currentFrame, 100, 0, scroller.transitionTime);
	//shrink( currentFrame, 'left', scroller.transitionTime);

	setTimeout("ts_slider_cleanup(scroller)", scroller.transitionTime + 100);
	
	scroller.lockout = 1;
	ts_nav_unset(scroller.currentImage);
	ts_nav_set(scroller.nextImage);
}

function ts_slider_cleanup(scroller)
{
	var currentFrame = 'topbanner-' + scroller.currentImage;
	setZ(currentFrame, 0);
	var curElt = document.getElementById(currentFrame);
	/*
	curElt.style.left = '0px';
	curElt.style.top = '0px';
	curElt.style.clip = 'rect(0px, 1000px, 260px, 0px)';
	curElt.style.webkitBackgroundSize = '1000px 260px';
	*/
	
	scroller.lockout = 0;
	scroller.currentImage = scroller.nextImage;
	
	ts_slider(scroller);
}

function ts_nav_to(elt, scroller)
{
	if (scroller.lockout == 1) { var timeout_fn = function() { ts_nav_to(elt, scroller); }; scroller.timeoutLockout = setTimeout(timeout_fn, 100); return; }
	clearTimeout(scroller.timeoutLockout);
	clearTimeout(scroller.timeout);
	
	var frame = elt.getAttribute('nav-frame');
	if (frame == scroller.currentImage) { return; }
	
	scroller.nextImage = parseInt(frame);
	ts_slider_slide(1, scroller);
}

function ts_nav_set(current)
{
	var c = document.getElementById('topbanner-nav-' + current);
	c.setAttribute('class', 'topscroller-nav-current');
}

function ts_nav_unset(current)
{
	var c = document.getElementById('topbanner-nav-' + current);
	c.setAttribute('class', 'topscroller-nav');
}


function setZ(id, z)
{
	document.getElementById(id).style.zIndex = z;
}

function displayShow(id)
{
	document.getElementById(id).style.display = 'block'; 
	document.getElementById(id).style.visibility = 'visible'; 
}

function displayHide(id)
{
	document.getElementById(id).style.display = 'none'; 
}

/*
function shrink(id, direction, millisec)
{
	var distance = 260;
	var speed = Math.round((distance / millisec) * 15); 
	var timer = 0; 
	
	for(i = 0; (i * speed) < distance + 15; i = i + 1)
	{
		setTimeout("changeSize('" + id + "', 1000, " + (260 - (i * speed)) + ")", i * 15);
	}
}

function changeSize(id, w, h)
{
	var object = document.getElementById(id).style;
	object.webkitBackgroundSize = w + 'px ' + h + 'px';
	object.backgroundRepeat = 'no-repeat';
}

function slip(id, direction, millisec)
{
	var distance = 260;
	var speed = Math.round((distance / millisec) * 15); 
	var timer = 0; 
	
	for(i = 0; (i * speed) < distance + 15; i = i + 1)
	{
		setTimeout("changeClip('" + id + "', 0, 1000, " + (260 - i * speed) + ", 0)", i * 15);
	}
}

function changeClip(id, x, y, x2, y2)
{
	var object = document.getElementById(id).style; 
	object.clip = 'rect(' + x + 'px, ' + y + 'px, ' + x2 + 'px, ' + y2 + 'px)';
}


function slideover(id, direction, millisec)
{
	var distance = 260;
	var speed = Math.round((distance / millisec) * 15); 
	var timer = 0; 
	
	for(i = 0; (i * speed) < distance + 15; i = i + 1)
	{
		setTimeout("changePos(0,-" + (i * speed) + ",'" + id + "')", i * 15);
		timer++;
	}
}

function changePos(x, y, id)
{
	var object = document.getElementById(id).style; 
	object.top = parseInt(y) + "px";
}

function slideout(id, id2, direction, millisec)
{
	var distance = 260;
	var speed = Math.round((distance / millisec) * 15); 
	var timer = 0; 
	
	for(i = 0; (i * speed) < distance + 15; i = i + 1)
	{
		setTimeout("change2Pos(0," + (i * speed) + ",'" + id + "', '" + id2 + "')", i * 15);
		timer++;
	}
}

function change2Pos(x, y, id, id2)
{
	var object = document.getElementById(id).style; 
	object.top = parseInt(y) + "px";

	var object2 = document.getElementById(id2).style; 
	object2.top = (parseInt(y) - 260) + "px";
}
*/

// The following is adapted rom http://brainerror.net/scripts/javascript/blendtrans/ 
function opacity(scroller, id, opacStart, opacEnd, millisec) { 
	var object = document.getElementById(id).style; 

	/*
		If we got Webkit, use CSS transitions rather than timers.
		object.webkitTransition returns undefined in all but Safari.
	*/	
	if (scroller.webkit == 1)
	{
		object.webkitTransition = "opacity " + millisec +"ms cubic-bezier(0.25, 0.1, 0.25, 1.0)";
		object.opacity = opacEnd;
		return;
	}
	
	//speed for each frame 
	var speed = Math.round(millisec / 100); 
	var timer = 0; 
	
	//determine the direction for the blending, if start and end are the same nothing happens 
	if(opacStart > opacEnd) { 
		for(i = opacStart; i >= opacEnd; i--) { 
			var CBi = CubicBezierAtTime( (100 - i) / 100, 0.25, 0.1, 0.25, 1.0, 100);
			setTimeout("changeOpac(" + (1 - CBi) + ",'" + id + "')",(timer * speed)); 
			timer++; 
		} 
	}
} 

//change the opacity for different browsers 
function changeOpac(opacity, id) { 
	var object = document.getElementById(id).style; 
	
	if (ts_webkit)
	{
		if (opacity == 1) { object.webkitTransition = null; }
	}
	
	object.opacity = opacity;
	object.MozOpacity = opacity; 
	object.KhtmlOpacity = opacity;
	object.filter = "alpha(opacity=" + Math.round(opacity) * 100 + ")"; 
}

// From http://www.netzgesta.de/dev/cubic-bezier-timing-function.html

function CubicBezierAtTime(t,p1x,p1y,p2x,p2y,duration) {
		var ax=0,bx=0,cx=0,ay=0,by=0,cy=0;
		// `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
        function sampleCurveX(t) {return ((ax*t+bx)*t+cx)*t;};
        function sampleCurveY(t) {return ((ay*t+by)*t+cy)*t;};
        function sampleCurveDerivativeX(t) {return (3.0*ax*t+2.0*bx)*t+cx;};
		// The epsilon value to pass given that the animation is going to run over |dur| seconds. The longer the
		// animation, the more precision is needed in the timing function result to avoid ugly discontinuities.
		function solveEpsilon(duration) {return 1.0/(200.0*duration);};
        function solve(x,epsilon) {return sampleCurveY(solveCurveX(x,epsilon));};
		// Given an x value, find a parametric value it came from.
        function solveCurveX(x,epsilon) {var t0,t1,t2,x2,d2,i;
			function fabs(n) {if(n>=0) {return n;}else {return 0-n;}}; 
            // First try a few iterations of Newton's method -- normally very fast.
            for(t2=x, i=0; i<8; i++) {x2=sampleCurveX(t2)-x; if(fabs(x2)<epsilon) {return t2;} d2=sampleCurveDerivativeX(t2); if(fabs(d2)<1e-6) {break;} t2=t2-x2/d2;}
            // Fall back to the bisection method for reliability.
            t0=0.0; t1=1.0; t2=x; if(t2<t0) {return t0;} if(t2>t1) {return t1;}
            while(t0<t1) {x2=sampleCurveX(t2); if(fabs(x2-x)<epsilon) {return t2;} if(x>x2) {t0=t2;}else {t1=t2;} t2=(t1-t0)*.5+t0;}
            return t2; // Failure.
        };
		// Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
		cx=3.0*p1x; bx=3.0*(p2x-p1x)-cx; ax=1.0-cx-bx; cy=3.0*p1y; by=3.0*(p2y-p1y)-cy; ay=1.0-cy-by;
		// Convert from input time to parametric value in curve, then from that to output time.
    	return solve(t, solveEpsilon(duration));
	};
	
	
	
function sverokinramning(e, args)
{
	//var e = document.getElementById(id);
	var ctx = e.getContext('2d');
	
	var color = args.color;
	if (color == null) { color = 'blue'; }
	
	var gradient;
	if (color == 'green')
	{
		gradient = ctx.createLinearGradient(0,0,0,260);
		gradient.addColorStop(0, '#228f6b');
		gradient.addColorStop(0.3, '#2ab887');
		gradient.addColorStop(0.38, '#2ab887');
		gradient.addColorStop(1, '#104732');
	}

	if (color == 'blue')
	{
		gradient = ctx.createLinearGradient(0,0,0,260);
		gradient.addColorStop(0, '#224e8f');
		gradient.addColorStop(0.3, '#2a67b8');
		gradient.addColorStop(0.38, '#2a67b8');
		gradient.addColorStop(1, '#122c4f');
	}
	
	
	/* Gšr highlighten pŒ bilden */
	ctx.strokeStyle = "rgba(255,255,255,0.18)"
	ctx.beginPath();
	ctx.moveTo(551,1);
	ctx.lineTo(551,89);
	ctx.lineTo(571,116);
	ctx.lineTo(551,143);
	ctx.lineTo(551,259);
	ctx.lineTo(999,259);
	ctx.lineTo(999,1);
	ctx.lineTo(551,1);
	ctx.stroke();
	ctx.closePath();

	/* Gšr skivan */
	ctx.strokeStyle = 'rgba(0,0,0,1)';	
	ctx.fillStyle = gradient;
	ctx.beginPath();
	ctx.moveTo(0,0);
	ctx.lineTo(550,0);
	ctx.lineTo(550,89);
	ctx.lineTo(570,116);
	ctx.lineTo(550,143);
	ctx.lineTo(550,260);
	ctx.lineTo(0,260);
	ctx.lineTo(0,0);
	ctx.clip();
	ctx.fill();
	ctx.closePath;

	/* Skuggning till vŠnster */
	ctx.beginPath();
	ctx.moveTo(0,0);
	ctx.lineTo(0,260);
	ctx.shadowOffsetX = -0;
	ctx.shadowBlur = 6;
	ctx.stroke();
	ctx.closePath();

	/* Skuggning lŠngs wedge'n */
	ctx.beginPath();
	ctx.moveTo(550,0);
	ctx.lineTo(550,89);
	ctx.lineTo(570,116);
	ctx.lineTo(550,143);
	ctx.lineTo(550,260);
	ctx.shadowOffsetX = 0;
	ctx.shadowBlur = 6;
	ctx.stroke();
	ctx.closePath();

	/* ...och skivans highlight... */
	ctx.save();
	var highlightGradient = ctx.createLinearGradient(0,0,0,260);
	highlightGradient.addColorStop(0, 'rgba(255,255,255,0.74)');	
	highlightGradient.addColorStop(0.75, 'black');
	ctx.lineWidth = 2;
	ctx.strokeStyle = highlightGradient;
	ctx.beginPath();
	ctx.moveTo(0,260);
	ctx.lineTo(0,0);
	ctx.stroke();
	ctx.closePath();
	ctx.restore();

	/* Skuggning upptill */
	ctx.beginPath();
	ctx.moveTo(0,0);
	ctx.lineTo(550,0);
	ctx.shadowOffsetX = -0;
	ctx.shadowBlur = 3;
	ctx.stroke();
	ctx.closePath();

	/* Skuggning nertill */
	ctx.beginPath();
	ctx.moveTo(0,260);
	ctx.lineTo(550,260);
	ctx.shadowOffsetX = -0;
	ctx.shadowBlur = 3;
	ctx.stroke();
	ctx.closePath();	
}