// 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 fontMultiClasses = false;
var fontImagePath = "images/index.html";
var fontsUpImgActive = "fontsup.gif";
var fontsUpImgDisabled = "fontsup_d.gif";
var fontsUpImgO;
var fontsUp_disabled = false;
var fontsLoImgActive = "fontslo.gif";
var fontsLoImgDisabled = "fontslo_d.gif";
var fontsLoImgO;
var fontsLo_disabled = false;
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-1];
			} else
				sizes = fontClasses.shift ();
			fontMultiClasses = true;
			if (debugging)
				for (i=0; i<fontClasses.length; i++)
					if (!fontClasses [i].length)
						alert ("You have defined multiple classes for fonts. Arrays needed.");
		}
	}

	return sizes;
}

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;
	}

	var theTableO = document.getElementById (tableName);
	if (!theTableO) {
		if (debugging)
			alert (tableName+" object not found.");
		return;
	}

	var rowI;
	var cellI;
	var tmpI;
	var cells = 0;
	var changedCells = 0;

	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;
			for (tmpI=0; tmpI < fontSizes; tmpI++)
				if (fontMultiClasses) {
					for (tmpI2=0; tmpI2 < fontClasses.length; tmpI2++)
						if (cellObj.className && cellObj.className == fontClasses [tmpI2][tmpI] && cellObj.className != fontClasses [tmpI2][newSize - 1]) {
							cellObj.className = fontClasses [tmpI2][newSize - 1];
							if (cellObj.id && cellObj.id.substring (0, 2) == "Ce")
								ChangeClasses ("Ta"+cellObj.id.substring (2), newSize);
							changedCells += 1;
						}
				} else
					if (cellObj.className && cellObj.className == fontClasses [tmpI] && cellObj.className != fontClasses [newSize - 1]) {
						cellObj.className = fontClasses [newSize - 1];
						if (cellObj.id && cellObj.id.substring (0, 2) == "Ce")
							ChangeClasses ("Ta"+cellObj.id.substring (2), newSize);
						changedCells += 1;
					}
		}
	}
	if (debugging)
		alert ("Did a total of "+changedCells+" class changes into font size "+newSize+" in "+cells+" cells in table "+tableName);

	UpdateFontButtons ();
}

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 LargerFonts (tableName)
{
	fontSize += 1;
	if (fontSize < 1 || fontSize > fontSizes)
		fontSize = fontSizes;
	SaveCookie ("DisplayFontSize", fontSize);

	ChangeClasses (tableName, fontSize);
}

function UpdateFonts (tableName)
{
	ChangeClasses (tableName, fontSize);
}

function SmallerFonts (tableName)
{
	fontSize -= 1;
	if (fontSize < 1 || fontSize > fontSizes)
		fontSize = 1;
	SaveCookie ("DisplayFontSize", fontSize);

	ChangeClasses (tableName, 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;
		}
	}
}

// Start by detecting the User Agent being used.
detectBrowser ();

// Calculate the first base point
winSize = GetWindowSize ();
xBase = winSize [0] / 2;
yBase = winSize [1] / 2;

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 ();
}
