// Logo animation
var yBase = 0;
var xBase = 0;
var delay = 50;
var yAmpl = 10;
var yMax = 40;
var step = .2;
var ystep = .5;
var currStep = 0;
var tAmpl=1;
var Xpos = 50;
var Ypos = 50;
var b = 0;

var debugging = false;	// true / false
var winSize;
var euroLayer;
var verticalCrossHairLayerO = 0;
var horizontalCrossHairLayerO = 0;
var displayRulers = LoadBoolCookie ("DisplayRulers", true);
var fontSize = LoadIntCookie ("DisplayFontSize", 1);
var euroConverter = LoadBoolCookie ("DisplayEuroConverter", false);
var lastUpdate = (new Date ()).getTime ();
var fontClasses;	// Define these to make fontsystem work
var fontSizes;
var resizableFontClasses;
var fontMultiClasses = false;
var fontImagePath = "/annualreport2006/images/";
var fontsUpImgActive = "fontsup.gif";
var fontsUpImgDisabled = "fontsup_d.gif";
var fontsUpImgO;
var fontsUp_disabled = false;
var fontsUp_text = "Bigger fonts";
var fontsLoImgActive = "fontslo.gif";
var fontsLoImgDisabled = "fontslo_d.gif";
var fontsLoImgO;
var fontsLo_disabled = false;
var fontsLo_text = "Smaller fonts";
var rulersImgOn = "rulers.gif";
var rulersImgOn_over = "rulers2.gif";
var rulersImgOff = "rulers_d.gif";
var rulersImgOff_over = "rulers_d2.gif";
var rulersImg_active;
var rulersImgOver_active;
var rulerImgO;

if (displayRulers) {
	rulersImg_active = fontImagePath + rulersImgOn;
	rulersImgOver_active = fontImagePath + rulersImgOn_over;
} else {
	rulersImg_active = fontImagePath + rulersImgOff;
	rulersImgOver_active = fontImagePath + rulersImgOff_over;
}

function MouseMoveHandler(evnt)
{
	if (!evnt && !window.event)
		return;

	if (navigator.family == 'nn4') {
		// Netscape 4.x
		Xpos = evnt.pageX;
		Ypos = evnt.pageY;
	} else if (navigator.family == 'ie4') {
		evnt = window.event;
		// MSIE 4.x+
		Xpos = evnt.clientX;
		Ypos = evnt.clientY + document.body.scrollTop;
	} else if (navigator.DOMCORE2) {
		// Netscape 6.x
		Xpos = evnt.pageX;
		Ypos = evnt.pageY;
	}

	if (!GetLayerVisibility (verticalCrossHairLayerO))
		return;

	var now = (new Date ()).getTime ();
	if (now < lastUpdate + delay)
		return;

	currentWinSize = GetWindowSize ();
	if (currentWinSize [0] != winSize [0] ||
		currentWinSize [1] != winSize [1]) {
		winSize = currentWinSize;
		RefreshCrossharLayers ();
	}
	yBase = winSize [0] / 4;
	xBase = winSize [1] / 4;

	winOffset = GetWindowOffset ();
	Xoffset = winOffset [0];
	Yoffset = winOffset [1];

	var top = Ypos + Math.cos((20*Math.sin(currStep/(20+b)))+b*70)*yBase*(Math.sin(10+currStep/10)+0.2)*Math.cos((currStep + b*25)/10);
	var left = Xpos + Math.sin((20*Math.sin(currStep/20))+b*70)*xBase*(Math.sin(10+currStep/(10+b))+0.2)*Math.cos((currStep + b*25)/10);

	if (verticalCrossHairLayerO && horizontalCrossHairLayerO) {
// These are for hangover mode
//		SetLayerPosition (verticalCrossHairLayerO, Yoffset, left);
//		SetLayerPosition (horizontalCrossHairLayerO, top, 0);
// These are for regular mode
		SetLayerPosition (verticalCrossHairLayerO, Yoffset, parseInt (Xpos + 3));
		SetLayerPosition (horizontalCrossHairLayerO, Ypos + 3, 0);
		currStep += step;
	}

	var lastUpdate = (new Date ()).getTime ();
}

function MouseOverHandler ()
{
	if (!displayRulers)
		return;

	SetLayerVisibility (verticalCrossHairLayerO, true);
	SetLayerVisibility (horizontalCrossHairLayerO, true);
}

function MouseOutHandler ()
{
	SetLayerVisibility (verticalCrossHairLayerO, false);
	SetLayerVisibility (horizontalCrossHairLayerO, false);
}

function CreateCrossharLayers ()
{
	// Create a new layers with the image
	imgWidth = winSize [0];
	imgHeight = winSize [1];

	layerHTML = '<img width="1" height="'+imgHeight+'" src="/images/ruler_pixel.gif" style="container:positioned;position:absolute;Top=0;left=0">';
	CreateNewLayer ("VerticalCrossHairLayer", layerHTML, null, null, false);
	verticalCrossHairLayerO = GetLayerObject ("VerticalCrossHairLayer");

	layerHTML = '<img width="'+imgWidth+'" height="1" src="/images/ruler_pixel.gif" style="container:positioned;position:absolute;Top=0;left=0">';
	CreateNewLayer ("HorizontalCrossHairLayer", layerHTML, null, null, false);
	horizontalCrossHairLayerO = GetLayerObject ("HorizontalCrossHairLayer");
}

function RefreshCrossharLayers ()
{
	// Create a new layers with the image
	imgWidth = winSize [0];
	imgHeight = winSize [1];

	layerHTML = '<img width="1" height="'+imgHeight+'" src="/images/ruler_pixel.gif" style="container:positioned;position:absolute;Top=0;left=0">';
	ReplaceLayerHTML (verticalCrossHairLayerO, layerHTML);
	verticalCrossHairLayerO = GetLayerObject ("VerticalCrossHairLayer");

	layerHTML = '<img width="'+imgWidth+'" height="1" src="/images/ruler_pixel.gif" style="container:positioned;position:absolute;Top=0;left=0">';
	ReplaceLayerHTML (horizontalCrossHairLayerO, layerHTML);
}

function DetermineNumberOfSizes ()
{
	var sizes;
	var i;
	if (fontClasses && fontClasses.length) {
		sizes = parseInt (fontClasses [0]);
		if (isNaN (sizes)) {
			sizes = fontClasses.length;
			fontMultiClasses = false;
		} else {
			if (!fontClasses.shift) {
				sizes = fontClasses [0];
				for (i=1; i<fontClasses.length; i++)
					fontClasses [i-1] = fontClasses [i];
			} else
				sizes = fontClasses.shift ();
			fontMultiClasses = true;
			if (debugging)
				for (i=0; i<sizes; i++)
					if (!fontClasses [i].length)
						alert ("You have defined multiple classes for fonts. Arrays needed.");
		}
	}

	return sizes;
}

function DoChangeClasses (htmlObj, newSize)
{
	var tmpI;
	var tmpI2;
	var changedCells = 0;

	for (tmpI=0; tmpI < fontSizes; tmpI++)
		if (fontMultiClasses) {
			for (tmpI2=0; tmpI2 < fontClasses.length; tmpI2++)
				if (htmlObj.className && htmlObj.className == fontClasses [tmpI2][tmpI] && htmlObj.className != fontClasses [tmpI2][newSize - 1]) {
					htmlObj.className = fontClasses [tmpI2][newSize - 1];
					if (htmlObj.id && htmlObj.id.substring (0, 2) == "Ce")
						ChangeClasses ("Ta"+htmlObj.id.substring (2), newSize);
					changedCells += 1;
				}
		} else
			if (htmlObj.className && htmlObj.className == fontClasses [tmpI] && htmlObj.className != fontClasses [newSize - 1]) {
				htmlObj.className = fontClasses [newSize - 1];
				if (htmlObj.id && htmlObj.id.substring (0, 2) == "Ce")
					ChangeClasses ("Ta"+htmlObj.id.substring (2), newSize);
				changedCells += 1;
			}

	return changedCells;
}

function ChangeClasses (tableName, newSize)
{
	if (!fontSizes)
		fontSizes = DetermineNumberOfSizes ();

	if (!newSize || isNaN (parseInt (newSize)) || newSize < 1 || newSize > fontSizes) {
		alert ("Bad font size: "+newSize);
		return;
	}

	if (debugging && !fontClasses) {
		alert ("No fontClasses defined");
		return;
	}

	if (debugging && (!fontSizes || fontSizes == 0)) {
		alert ("No items in fontClasses");
		return;
	}

	if (!document.getElementById) {
		if (debugging)
			alert ("Browser does not support document.getElementById. Cannot continue.");
		return;
	}

	// See if the table name was an array
	if (tableName && tableName.reverse) {
		var i;
		for (i=0; i<tableName.length; ++i)
			ChangeClasses (tableName [i], newSize)
		return;
	}
	var theTableO = document.getElementById (tableName);
	if (!theTableO) {
		if (debugging)
			alert (tableName+" object not found.");
		return;
	}

	var rowI;
	var cellI;
	var cells = 0;
	var changedCells = 0;

	if (!theTableO.rows) {
		cells += 1;
		changedCells += DoChangeClasses (theTableO, newSize);
	} else {
		for (rowI=0; ; rowI++) {
			if (!theTableO.rows)
				break;
			var rowObj = theTableO.rows.item (rowI);
			if (!rowObj)
				break;

			for (cellI=0; ; cellI++) {
				var cellObj = rowObj.cells.item (cellI);
				if (!cellObj)
					break;

				cells += 1;
				changedCells += DoChangeClasses (cellObj, newSize);
			}
		}
	}
	if (debugging)
		alert ("Did a total of "+changedCells+" class changes into font size "+newSize+" in "+cells+" cells in table "+tableName);

	UpdateFontButtons ();
}

function ModifyCSS (css_class, attribute, value)
{
	if (!document.styleSheets) {
		// Opera
//		alert ("ModifyCSS: no style sheets on this browser!");
		return;
	}

	var theRules = new Array();
	// Match the class as a single rule or at the end of the rule list.
	var classSingleRe = new RegExp ("\."+css_class+"$");
	// Match the class at the start or middle of the rule list.
	var classMultiRe = new RegExp ("\."+css_class+"[ ,]+");

	var sheet,rule,styleAttr;
	for (sheet=0; sheet<document.styleSheets.length; ++sheet) {
		if (document.styleSheets [sheet].cssRules)
			theRules = document.styleSheets [sheet].cssRules
		else if (document.styleSheets [sheet].rules)
			theRules = document.styleSheets [sheet].rules
		else
			continue;

		for (rule=0; rule<theRules.length; ++rule) {
			if (theRules [rule].selectorText.match (classSingleRe) ||
				theRules [rule].selectorText.match (classMultiRe)) {
				// Found the rule.
				if (navigator.family == 'ie4') {
					// MSIE 4.x+
					theRules [rule].style.setAttribute (attribute, value);
				} else if (navigator.DOMCORE2) {
					// Netscape 6.x
					theRules [rule].style.setProperty (attribute, value, null);
				} else
					alert ("ModifyCSS: Don't know what to do!");
			}
		}
	}
//	theRules [theRules.length-1].style.backgroundColor = 'transparent';
}

function UpdateFontButtons ()
{
	if (!fontSizes)
		fontSizes = DetermineNumberOfSizes ();

	if (!fontsUpImgO)
		fontsUpImgO = GetImageObject ("fontsup");
	if (!fontsLoImgO)
		fontsLoImgO = GetImageObject ("fontslo");

	if (!fontsLoImgO || !fontsUpImgO || !fontSize || !fontClasses || !fontSizes)
		return;

// Smaller icon
	if (fontSize <= 1) {
		if (fontsLoImgO.src != fontImagePath + fontsLoImgDisabled)
			fontsLoImgO.src = fontImagePath + fontsLoImgDisabled;
		fontsLo_disabled = true;
	} else {
		if (fontsLoImgO.src != fontImagePath + fontsLoImgActive)
			fontsLoImgO.src = fontImagePath + fontsLoImgActive;
		fontsLo_disabled = false;
	}

// Larger icon
	if (fontSize >= fontSizes) {
		if (fontsUpImgO.src != fontImagePath + fontsUpImgDisabled)
			fontsUpImgO.src = fontImagePath + fontsUpImgDisabled;
		fontsUp_disabled = true;
	} else {
		if (fontsUpImgO.src != fontImagePath + fontsUpImgActive)
			fontsUpImgO.src = fontImagePath + fontsUpImgActive;
		fontsUp_disabled = false;
	}
}

function ToggleRulers ()
{
	if (!rulerImgO)
		rulerImgO = GetImageObject ("rulers");

	displayRulers = !displayRulers;
	SaveCookie ("DisplayRulers", displayRulers);

	if (displayRulers)
		MouseOverHandler ();
	else
		MouseOutHandler ();

	if (displayRulers) {
		rulersImg_active = fontImagePath + rulersImgOn;
		rulersImgOver_active = fontImagePath + rulersImgOn_over;
	} else {
		rulersImg_active = fontImagePath + rulersImgOff;
		rulersImgOver_active = fontImagePath + rulersImgOff_over;
	}
	if (rulerImgO) {
		rulerImgO.src = rulersImgOver_active;
		if (rulerImgO.oSrc)
			rulerImgO.oSrc = rulersImg_active;
	}
}

function UpdateFonts (tableName)
{
	ChangeClasses (tableName, fontSize);
}

function LargerFonts (tableName)
{
	fontSize += 1;
	if (fontSize < 1 || fontSize > fontSizes)
		fontSize = fontSizes;
	SaveCookie ("DisplayFontSize", fontSize);

	ChangeClasses (tableName, fontSize);
}

function SmallerFonts (tableName)
{
	fontSize -= 1;
	if (fontSize < 1 || fontSize > fontSizes)
		fontSize = 1;
	SaveCookie ("DisplayFontSize", fontSize);

	ChangeClasses (tableName, fontSize);
}

function UpdateFontButtonsCSS ()
{
	if (!fontSizes)
		fontSizes = DetermineNumberOfSizesCSS ();

	if (!fontsUpImgO)
		fontsUpImgO = GetImageObject ("fontsup");
	if (!fontsLoImgO)
		fontsLoImgO = GetImageObject ("fontslo");

	if (!fontsLoImgO || !fontsUpImgO || !fontSize || !resizableFontClasses)
		return;

// Smaller icon
	if (fontSize <= 1) {
		if (fontsLoImgO.src != fontImagePath + fontsLoImgDisabled)
			fontsLoImgO.src = fontImagePath + fontsLoImgDisabled;
		fontsLo_disabled = true;
	} else {
		if (fontsLoImgO.src != fontImagePath + fontsLoImgActive)
			fontsLoImgO.src = fontImagePath + fontsLoImgActive;
		fontsLo_disabled = false;
	}

// Larger icon
	if (fontSize >= fontSizes) {
		if (fontsUpImgO.src != fontImagePath + fontsUpImgDisabled)
			fontsUpImgO.src = fontImagePath + fontsUpImgDisabled;
		fontsUp_disabled = true;
	} else {
		if (fontsUpImgO.src != fontImagePath + fontsUpImgActive)
			fontsUpImgO.src = fontImagePath + fontsUpImgActive;
		fontsUp_disabled = false;
	}
}

function DetermineNumberOfSizesCSS ()
{
	var sizes;
	var i;
	if (resizableFontClasses && resizableFontClasses.length) {
		sizes = parseInt (resizableFontClasses [0]);
		if (isNaN (sizes)) {
			alert ("DetermineNumberOfSizesCSS: Internal error, bad resizableFontClasses");
			return
		}

		if (!resizableFontClasses.shift) {
			sizes = resizableFontClasses [0];
			for (i=1; i<resizableFontClasses.length; i++)
				resizableFontClasses [i-1] = resizableFontClasses [i];
		} else
			sizes = resizableFontClasses.shift ();
		if (debugging)
			for (i=0; i<sizes; i++)
				if (!resizableFontClasses [i].length)
					alert ("You have defined multiple classes for fonts. Arrays needed.");
	}

	return sizes;
}

function ChangeClassesCSS (newSize)
{
	if (debugging && !resizableFontClasses) {
		alert ("ChangeClassesCSS: No fontClasses defined");
		return;
	}

	if (!fontSizes)
		fontSizes = DetermineNumberOfSizesCSS ();

	if (!newSize || isNaN (parseInt (newSize)) || newSize < 1 || newSize > fontSizes) {
		alert ("ChangeClassesCSS: Bad font size: "+newSize);
		return;
	}

	if (debugging && (!fontSizes || fontSizes == 0)) {
		alert ("ChangeClassesCSS: No items in fontClasses");
		return;
	}

	if (!document.getElementById) {
		if (debugging)
			alert ("ChangeClassesCSS: Browser does not support document.getElementById. Cannot continue.");
		return;
	}
	var i;
	for (i=0; i<resizableFontClasses.length; ++i) {
		var fontClasses = resizableFontClasses [i];
		if (navigator.family == 'ie4')
			ModifyCSS (fontClasses [0], "fontSize", fontClasses [newSize]);
		else if (navigator.DOMCORE2)
			ModifyCSS (fontClasses [0], "font-size", fontClasses [newSize]);
		else
			alert ("ChangeClassesCSS: Don't know what to do!");
	}

	UpdateFontButtonsCSS ();
}

function UpdateFontsCSS ()
{
	ChangeClassesCSS (fontSize);
}

function LargerFontsCSS ()
{
	fontSize += 1;
	if (fontSize < 1 || fontSize > fontSizes)
		fontSize = fontSizes;
	SaveCookie ("DisplayFontSize", fontSize);

	ChangeClassesCSS (fontSize);
}

function SmallerFontsCSS ()
{
	fontSize -= 1;
	if (fontSize < 1 || fontSize > fontSizes)
		fontSize = 1;
	SaveCookie ("DisplayFontSize", fontSize);

	ChangeClassesCSS (fontSize);
}

function ToggleEuroConverter (checkBoxO)
{
	euroConverter = checkBoxO.checked;
	SaveCookie ("DisplayEuroConverter", euroConverter);

	if (euroLayer)
		if (euroConverter)
			SetLayerVisibility (euroLayer, true);
		else
			SetLayerVisibility (euroLayer, false);
}

function UpdateCheckBox ()
{
	if (!document.getElementById)
		return;

	var checkBoxO = document.getElementById ('LargeFontCheckBox');
	if (!checkBoxO)
		return;

	checkBoxO.checked = largeFonts;
}

function SaveCookie (name, value)
{
	document.cookie = name + "=" + value + "; path=/;";
}

function LoadBoolCookie (name, defaultVal)
{
	var testRe = new RegExp (name + "=")
	var pos = document.cookie.search (testRe);
	if (pos == -1)
		return defaultVal;

	if (document.cookie.substr (pos + name.length + 1, 4) == "true")
		return true;

	return false;
}

function LoadIntCookie (name, defaultVal)
{
	var testRe = new RegExp (name + "=")
	var pos = document.cookie.search (testRe);
	var val;
	if (pos == -1) {
		if (debugging)
			alert ("LoadIntCookie: cookie not found, using default: "+defaultVal);
		return defaultVal;
	}

	val = parseInt (document.cookie.substr (pos + name.length + 1));
	if (isNaN (val)) {
		if (debugging)
			alert ("LoadIntCookie: cookie value bad, using default: "+defaultVal);
		return defaultVal;
	}

	if (debugging)
		alert ("LoadIntCookie: got from cookie: "+val);
	return val;
}

function StartRulers (visible)
{
	var rulerTables = new Array ("FiguresTable");
	var i;

	if (visible && visible.length) {
		rulerTables = new Array ();
		for (i=0; i<visible.length; i++)
			rulerTables [i] = visible [i];
		visible = false;
	}

	// Don't do anything if visibility is not wanted
	if (visible)
		return;

	for (i=0; i<rulerTables.length; i++) {
		if (navigator.family == 'nn4')
			figureTableO = document;
		else if (navigator.family == 'ie4')
			figureTableO = document.all [rulerTables [i]];
		else if (navigator.family == 'gecko')
			figureTableO = document.getElementById (rulerTables [i]);

		if (figureTableO) {
			figureTableO.onmousemove = MouseMoveHandler;
			figureTableO.onmouseover = MouseOverHandler;
			figureTableO.onmouseout = MouseOutHandler;
		}
	}
}

var rowBgColors = Array ();

function OnRowBgChange (rowObj, newColor, store)
{
	var cellI;
	var cells = 0;
	var changedCells = 0;
	
	if (store)
		rowBgColors [rowObj.rowIndex] = Array ();

	for (cellI=0; ; cellI++) {
		var cellObj = rowObj.cells.item (cellI);
		if (!cellObj)
			break;

		cells += 1;
		if (store) {
			if (navigator.DOMCORE2) {
				rowBgColors [rowObj.rowIndex][cellI] = cellObj.style.background;
				cellObj.style.background = newColor;
			} else {
				rowBgColors [rowObj.rowIndex][cellI] = cellObj.bgColor;
				cellObj.bgColor = newColor;
			}
		} else {
			if (navigator.DOMCORE2)
				cellObj.style.background = rowBgColors [rowObj.rowIndex][cellI];
			else
				cellObj.bgColor = rowBgColors [rowObj.rowIndex][cellI];
		}
		changedCells += 1;
	}

	if (!store)
		rowBgColors [rowObj.rowIndex] = null;

	return true;
}

// Start by detecting the User Agent being used.
detectBrowser ();

// Calculate the first base point
winSize = GetWindowSize ();
xBase = winSize [0] / 2;
yBase = winSize [1] / 2;

// XXX No crosshairlayers
// CreateCrossharLayers ();

// Start the animation process
// animateLogo()
// SetLayerVisibility (verticalCrossHairLayerO, true);
// SetLayerVisibility (horizontalCrossHairLayerO, true);

// Set a move handler
if (navigator.family == 'nn4') {
	document.captureEvents (Event.MOUSEOVER | Event.MOUSEMOVE);	//  | Event.MOUSEOUT
	MouseOverHandler ();
}
