

var MainClass = function(localization) {

	this.isHandheld = false;
	this.local = localization;
	
	// EXTERNAL LINKS IMAGE
	this.externalLinksImage = "resources/images/external.png";
	// EMAIL IMAGE
	this.emailImage = "resources/images/email.png";
	
	// SLIDESHOW INTERVAL
	this.slideShowRefresh = 1000;
	
	// SLIDESHOW
	this.slideShowSpeed = 3;
	this.slideShowPlaying = false;
	this.slideShowPlayLink = null;
	this.slideShowCounter = 0;
	this.slideCurrent = null;

};


MainClass.prototype = {


	// INIT
	init: function() {

		if (document.getElementById("bypass").offsetLeft > 0) {
			this.isHandheld = true;
		} else {
			this.setMinHeight();
			this.prepareCollapsing();
			this.splashInit();
			this.prepareSplash();
		}
		this.externalLinks();
		this.spamProtection();
		this.prepareSnowboardForms();
		if (typeof document.body.style.maxHeight == "undefined") {
			this.ie6();
		}
		
	},


	// IE6
	ie6: function() {
		
		var toc = document.getElementById("toc");
		toc.onmouseover = function() {
			this.className = "hover";
		}
		toc.onmouseout = function() {
			this.className = "";
		}
		
	},


	// SET MIN-HEIGHT
	setMinHeight: function() {

		var leftBar  = document.getElementById("side-bar-left");
		var rightBar = document.getElementById("side-bar-right");
		leftBar.style.minHeight = "1px";
		leftBar.style.height = "auto";
		if (rightBar) {
			rightBar.style.minHeight = "1px";
			rightBar.style.height = "auto";
		}
		if (rightBar) {
			var minHeight = Math.max(leftBar.clientHeight, rightBar.clientHeight);
			if (typeof document.body.style.maxHeight == "undefined") {
				leftBar.style.height = rightBar.style.height = minHeight + "px";
			} else {
				leftBar.style.minHeight = rightBar.style.minHeight = minHeight + "px";
			}
		}

	},


	// PREPARE COLLAPSING
	prepareCollapsing: function() {

		var navigation = document.getElementById("page-navigation");
		var spans = navigation.getElementsByTagName("SPAN");
		for (var i = 0, n = spans.length; i < n; i++) {
			if (spans[i].className == "Toggle") {
				spans[i].onclick = function() {
					toggleClass(this.parentNode, "expanded", "collapsed");
					return false;
				}
			}
		}
		this.setMinHeight();

	},


	// SIDE BARS
	toggleBar: function(bar) {

		var timeInc = 100;
		var cnt = 7;
		var cShow = bar;
		var cHide = bar + "Hidden";
		var isShow = hasClass(document.body, cShow);
		var isHide = hasClass(document.body, cHide);
		window.status = "isShow=" + isShow + ";isHide=" + isHide;
		var cOld = "";
		if (isShow) cOld = cShow;
		else if (isHide) cOld = cHide;
		else return;
		for (var i = 1; i <= cnt; i++) {
			var cNew = bar + "Anime " + bar + "Hidden" + (isShow ? i : (cnt-i));
			if (i == cnt) {
				if (isShow) cNew = bar + "Hidden";
				else cNew = bar;
			}
			var cmd = "toggleClass(document.body, '" + cOld + "', '" + cNew + "');";
			cmd += " window.status='" + cOld + "-" + cNew + "';";
			setTimeout(cmd, i * timeInc);
			cOld = cNew;
		}
		setTimeout("myMainClass.setMinHeight()", (cnt + 1) * timeInc);

	},


	// EXTERNAL LINKS
	externalLinks: function() {

		var myAnchors = document.getElementsByTagName("A");
		for (var i = 0, n = myAnchors.length; i < n; i++) {
			var urlhref = myAnchors[i].href;
			var urlexternal = (
				(!urlhref.indexOf("http://") || !urlhref.indexOf("https://"))
				&& urlhref.indexOf("http://" + document.location.host)
				&& urlhref.indexOf("https://" + document.location.host)
			);
			if (urlhref && urlexternal) {
				myAnchors[i].className = "External " + myAnchors[i].className;
				myAnchors[i].target = "_blank";
				var currclass = " " + myAnchors[i].className + " ";
				if (currclass.indexOf(" NoExternalImage ") < 0) {
					var myImg = document.createElement("IMG");
					myImg.src = this.externalLinksImage;
					myAnchors[i].appendChild(document.createTextNode("\u00a0"));
					myAnchors[i].appendChild(myImg);
				}
			}
		}

	},


	// SPAM PROTECTION
	spamProtection: function() {

		var collection = document.getElementsByTagName("SPAN");
		for (var ccnt = 0; ccnt < collection.length; ccnt++) {
			var myElem = collection[ccnt];
			if (myElem.className != "Protection") continue;
			var mailImg = myElem.firstChild;
			var mySrc = mailImg.src;
			var myExp = /e=(.*)&n=(.*)&d=(.*)&c=(.*)$/;
			var myMatch = mySrc.match(myExp);
			if (!myMatch) { alert("spam protection error"); continue; }
			var to = myMatch[1] + "." + myMatch[3] + "@" + myMatch[2];
			to = to.rot13().reverse();
			var myLink = document.createElement("A");
			myLink.href = "mailto:" + to;
			var myImg = document.createElement("IMG");
			myImg.src = this.emailImage;
			myLink.appendChild(document.createTextNode(to + "\u00a0"));
			myLink.appendChild(myImg);
			myElem.replaceChild(myLink, mailImg);
		}
		
	},


	// BUILD SPLASH CONTROL
	buildSplashControl: function(aText, aClass, aTitle, aParent) {
		
		var myLink;
		myLink = document.createElement("A");
		myLink.href = "#nogo";
		myLink.className = aClass;
		myLink.title = aTitle;
		myLink.appendChild(document.createTextNode(aText));
		aParent.appendChild(myLink);
		return myLink;
		
	},


	// SPLASH INIT
	splashInit: function() {
		
		var myLink;
		
		// CONTAINER
		var myContainer = document.createElement("DIV");
		myContainer.id = "SplashContainer";
		myContainer.style.display = "none";
		
		// CONTAINER -> CURTAIN
		var myCurtain = document.createElement("DIV");
		myCurtain.id = "SplashCurtain";
		myContainer.appendChild(myCurtain);
		
		// CONTAINER -> NAVIGATION
		var myNavigation = document.createElement("DIV");
		myNavigation.id = "SplashNav";
		myContainer.appendChild(myNavigation);
		
		// NAVIGATION -> CONTROLS
		var controls = document.createElement("SPAN");
		myNavigation.appendChild(controls);
		
		var sepNode = document.createElement("SPAN");
		sepNode.className = "Separator";
		sepNode.appendChild(document.createTextNode("|"));
		
		myLink = this.buildSplashControl("\u00a0", "Prev", this.local.slideshowPrev, controls);
		myLink.onclick = function() { myMainClass.slidePrev();  return false; };
		
		myLink = this.buildSplashControl("\u00a0", "Next", this.local.slideshowNext, controls);
		myLink.onclick = function() { myMainClass.slideNext(this);  return false; };
		
		controls.appendChild(sepNode.cloneNode(true));
		
		myLink = this.buildSplashControl("\u00a0", "Play", this.local.slideshowPlay, controls);
		myLink.onclick = function() { myMainClass.slidePlay(this);  return false; };
		
		var mySpeeds = document.createElement("SPAN");
		mySpeeds.id = "SlideSpeeds";
		controls.appendChild(mySpeeds);
		
		myLink = this.buildSplashControl("1", "SlideSpeed1", this.local.slideshowSpeed1, mySpeeds);
		myLink.onclick = function() { myMainClass.slideSpeed(this, 1);  return false; };
		
		myLink = this.buildSplashControl("2", "SlideSpeed2", this.local.slideshowSpeed2, mySpeeds);
		myLink.onclick = function() { myMainClass.slideSpeed(this, 2);  return false; };
		
		myLink = this.buildSplashControl("3", "SlideSpeed3 Active", this.local.slideshowSpeed3, mySpeeds);
		myLink.onclick = function() { myMainClass.slideSpeed(this, 3);  return false; };
		
		myLink = this.buildSplashControl("4", "SlideSpeed4", this.local.slideshowSpeed4, mySpeeds);
		myLink.onclick = function() { myMainClass.slideSpeed(this, 4);  return false; };
		
		myLink = this.buildSplashControl("5", "SlideSpeed5", this.local.slideshowSpeed5, mySpeeds);
		myLink.onclick = function() { myMainClass.slideSpeed(this, 5);  return false; };
		
		controls.appendChild(sepNode.cloneNode(true));
		
		myLink = this.buildSplashControl("x", "Close", this.local.slideshowClose, controls);
		myLink.onclick = function() { myMainClass.splashClose();  return false; };
		
		// CONTAINER -> CONTENT
		var myContent = document.createElement("DIV");
		myContent.id = "SplashContent";
		myContainer.appendChild(myContent);
		
		document.body.appendChild(myContainer);
		
	},


	// PREPARE SPLASH
	prepareSplash: function() {
	
		var myElems = document.getElementsByTagName("DIV");
		for (var i = 0; i < myElems.length; i++) {
			if (hasClass(myElems[i], "Slide")) {
				var myLinks = myElems[i].getElementsByTagName("A");
				myLinks[0].onclick = function() {
					myMainClass.splashLoad(this.parentNode);
					return false;
				};
			}
		}
		
	},


	// SPLASH - LOAD
	splashLoad: function(node) {
		
		if (this.slideCurrent == node) return;
		this.slideCurrent = node;
		var clone = node.cloneNode(true);
		clone.className = "SplashSlide";
		clone.style.width = "auto";
		var myLink = clone.getElementsByTagName("A")[0];
		var myImage = myLink.firstChild;
		var imgSrc = myLink.href;
		
		// Fix strange IE6 bug
		if (imgSrc.trim().indexOf("about:blank") == 0) imgSrc = imgSrc.substring(11);
		// Fix strange IE7 bug
		if (imgSrc.trim().indexOf("about:") == 0) imgSrc = imgSrc.substring(6);
		
		var spl = myLink.href.split(/\?/);
		var search = spl[spl.length - 1];
		var spl = search.split(/-/);
		myImage.width = spl[0];
		myImage.height = spl[1];
		myImage.src = imgSrc;
		myImage.title = this.local.slideshowClose;
		myImage.onclick = function() {
			myMainClass.splashClose();
			return false;
		};
		// Replace Link with Paragraph
		var myP = document.createElement("P");
		myP.className = "SlideImage";
		myP.appendChild(myImage);
		myLink.parentNode.replaceChild(myP, myLink);
		
		// content
		var content = document.getElementById("SplashContent");
		// clean up
		while (content.hasChildNodes()) {
			content.removeChild(content.lastChild);
		}
		// update
		content.appendChild(clone);
		content.style.width = (parseInt(spl[0]) + 2) + "px";
		
		var container = document.getElementById("SplashContainer");
		container.style.display = "block";
		if (! hasClass(node, "Image")) {
			container.className = "Slide";
			this.slidePreload();
		}
		
		if (typeof document.body.style.maxHeight == "undefined") {
			// IE6 or worse
			var content = document.getElementById("SplashContent");
			if (document.documentElement.clientWidth) {
				content.style.top = document.documentElement.scrollTop + "px";
				container.style.height = document.documentElement.scrollHeight + "px";
			} else if (document.body.clientWidth) {
// 				content.style.top = document.body.scrollTop + "px";
// 				container.style.height = document.body.scrollHeight + "px";
			}
		}
		addClass(document.body, "Splash");
	
	},


	// SPLASH - CLOSE
	splashClose: function() {
		this.slideStop();
		this.slideCurrent = null;
		var container = document.getElementById("SplashContainer");
		container.className = "";
		if (typeof document.body.style.maxHeight == "undefined") {
			// IE6 or worse
			container.style.height = "1px";
		}
		container.style.display = "none";
		removeClass(document.body, "Splash");
	},


	// SLIDE - PRELOAD
	slidePreload: function() {
		var node = this.slideCurrent.nextSibling;
		if (!node)  node = this.slideCurrent.parentNode.firstChild;
		var myLink = node.getElementsByTagName("A")[0];
		var myImage = new Image;
		myImage.src = myLink.href;
	},
	// SLIDE - NEXT
	slideNext: function() {
		var node = this.slideCurrent.nextSibling;
		if (!node)  node = this.slideCurrent.parentNode.firstChild;
		this.splashLoad(node);
	},
	// SLIDE - PREVIOUS
	slidePrev: function() {
		var node = this.slideCurrent.previousSibling;
		if (!node)  node = this.slideCurrent.parentNode.lastChild;
		this.splashLoad(node);
	},
	// SLIDE - PLAY
	slidePlay: function(myLink) {
		if (this.slideShowPlaying) {
			this.slideStop();
			return;
		}
		this.slideShowPlaying = true;
		window.setTimeout("myMainClass.slideCount()", this.slideShowRefresh);
		this.slideShowPlayLink = myLink;
		addClass(this.slideShowPlayLink, "Pause");
		addClass(this.slideShowPlayLink, "Active");
// 		this.slideShowPlayLink.replaceChild(document.createTextNode("||"), this.slideShowPlayLink.firstChild);
	},
	// SLIDE - STOP
	slideStop: function() {
		this.slideShowPlaying = false;
		if (this.slideShowPlayLink) {
			removeClass(this.slideShowPlayLink, "Pause");
			removeClass(this.slideShowPlayLink, "Active");
// 			this.slideShowPlayLink.replaceChild(document.createTextNode("▶"), this.slideShowPlayLink.firstChild);
		}
	},
	// SLIDE - SPEED
	slideSpeed: function(myLink, speed) {
		this.slideShowSpeed = speed;
		if (this.slideShowSpeed > 10) this.slideShowSpeed = 10;
		if (this.slideShowSpeed < 1) this.slideShowSpeed = 1;
		var siblings = myLink.parentNode.childNodes;
		for (var i = 0; i < siblings.length; i++) {
			removeClass(siblings[i], "Active");
		}
		addClass(myLink, "Active");
	},
	// SLIDE - SLOWER
	slideSlower: function() {
		this.slideShowSpeed++;
		if (this.slideShowSpeed > 10) this.slideShowSpeed = 10;
		var meter = document.getElementById("SplashSpeedometer");
		if (meter) meter.value = this.slideShowSpeed;
	},
	// SLIDE - FASTER
	slideFaster: function() {
		this.slideShowSpeed--;
		if (this.slideShowSpeed < 1) this.slideShowSpeed = 1;
		var meter = document.getElementById("SplashSpeedometer");
		if (meter) meter.value = this.slideShowSpeed;
	},
	// SLIDE COUNTER
	slideCount: function() {
		if (! this.slideShowPlaying)  return;
		if (this.slideShowCounter == 0) {
			myMainClass.slideNext();
		}
		this.slideShowCounter++;
		if (this.slideShowCounter > this.slideShowSpeed) {
			this.slideShowCounter = 0;
		}
		window.setTimeout("myMainClass.slideCount()", this.slideShowRefresh);
	},


	// PREPARE SNOWBOARD FORMS
	prepareSnowboardForms: function() {

		var myForms = document.getElementsByTagName("FORM");
		for (var i = 0; i < myForms.length; i++) {
			if (myForms[i].className == "Snowboard") {
				var elems = myForms[i].elements;
				for (var k = 0; k < elems.length; k++) {
					if (elems[k].tagName != "SELECT" && elems[k].type != "checkbox" && elems[k].type != "radio") continue;
					elems[k].onclick = elems[k].onchange = function() {
						myMainClass.snowboardFormUpdate(this.form);
					};
				}
				myMainClass.snowboardFormUpdate(myForms[i]);
			}
		}

	},


	// SNOWBOARD FORM - UPDATE
	snowboardFormUpdate: function(myform) {

		var msg = "";
		var fields = myform.elements;
		var price = parseFloat(fields["base_price"].value);
		for (var f = 0; f < fields.length; f++) {
			var myF = fields[f];
			var label = null;
			if (myF.nodeName == "SELECT") {
				if (myF.options.length > 0)
					label = myF.options[myF.selectedIndex].firstChild.nodeValue;
			} else if (myF.nodeName == "INPUT" && myF.type == "checkbox"){
				if (myF.checked)
					label = myF.parentNode.lastChild.firstChild.nodeValue;
			}
			if (label) {
				msg += "\n" + label;
				var myExp = /\((.*) €\)$/;
				var myMatch = label.match(myExp);
				if (myMatch) {
					msg += " --- match found: " + myMatch[1];
					var myprice = parseFloat(myMatch[1]);
					if (myprice) price += myprice;
				}
			}
		}
		fields["config_price"].value = Math.round(price*100)/100 + " €";
		
	},


	// BUILD CHECKBOX ELEMENT
	buildCheckbox: function(append, label, val, cookieIdx, bodyClass) {
		myLabel = document.createElement("LABEL");
		myInput = document.createElement("INPUT");
		myInput.type = "checkbox";
		myLabel.appendChild(myInput);
		myLabel.appendChild(document.createTextNode(" " + label));
		if (val == "1") try {
			myInput.checked = checked;
		} catch(e) {
			myInput.value = "toCheck"; // IE Sucks
		}
		myInput.onclick = function() {
			this.checked ? addClass(document.body, bodyClass) : removeClass(document.body, bodyClass);
			myMainClass.updatePreferencesCookie(cookieIdx, this.checked ? 1 : 0);
		}
		append.appendChild(myLabel);
		return myLabel;
	},


	// BUILD RADIO ELEMENT
	buildRadio: function(append, labels, val, cookieIdx, bodyClasses, fname) {
		for (var idx = 0; idx < labels.length; idx++) {
			myLabel = document.createElement("LABEL");
			myInput = document.createElement("INPUT");
			myInput.type = "radio";
			myInput.name = fname;
			myInput.value = idx;
			myLabel.appendChild(myInput);
			myLabel.appendChild(document.createTextNode(" " + labels[idx]));
			if (val == idx) try {
				myInput.checked = checked;
			} catch(e) {
				myInput.defaultChecked = true; // IE Sucks
			}
			myInput.onclick = function() {
				removeClasses(document.body, bodyClasses);
				addClass(document.body, bodyClasses[this.value]);
				myMainClass.updatePreferencesCookie(cookieIdx, this.value);
			}
			append.appendChild(myLabel);
		}
	},


	// BUILD SELECT ELEMENT
	buildSelect: function(opts, val) {
		
		var mySelect, myOption;
		mySelect = document.createElement("SELECT");
		for (var i = 0; i < opts.length; i++) {
			myOption = document.createElement("OPTION");
			myOption.value = opts[i][0];
			if (opts[i][0] == val) myOption.selected = "selected";
			myOption.appendChild(document.createTextNode(opts[i][1]));
			mySelect.appendChild(myOption);
		}
		return mySelect;
		
	},


	// UPDATE PREFERENCES
	updatePreferencesCookie: function(idx, val, idx2, val2) {
		
		// Update cookie
		var oldCookie = readCookie("preferences");
		if (oldCookie) {
			var cookieVals = oldCookie.split(/_/);
			cookieVals[idx] = val;
			if (idx2 != null) cookieVals[idx2] = val2;
			var newCookie = cookieVals.join("_");
			writeCookie("preferences", newCookie, 7);
		}
		
	},


	// UPDATE COLOR STYLESHEET
	updateColorStylesheet: function(idx, val, idx2, val2) {
		
		this.updatePreferencesCookie(idx, val, idx2, val2);
		
		// REFRESH COLOR STYLESHEET
		var myExp = /(.*)\/colors_(.*)\.css$/;
		var linkElems = document.getElementsByTagName("LINK");
		var sheets = Array();
		var prefs = Array();
		var paths = Array();
		for (var i = linkElems.length - 1; i > 0; i--) {
			if (linkElems[i].getAttribute("rel").indexOf("stylesheet") == -1) continue;
			var myMatch = linkElems[i].href.match(myExp);
			if (myMatch) {
				sheets[sheets.length] = linkElems[i];
				paths[paths.length] = myMatch[1];
				prefs[prefs.length] = myMatch[2];
			}
		}
		
		if (sheets.length >= 2) {
			var myPrefs = prefs[0].split(/_/);
			myPrefs[idx] = val;
			if (idx2 != null) myPrefs[idx2] = val2;
			var newHref = paths[0] + "/colors_" + myPrefs.join("_") + ".css";
			sheets[1].href = sheets[0].href;
			sheets[0].href = newHref;
		}
		
	},


	// UPDATE CURRENT COLOR
	updateCurrentColor: function(aCell) {
		
		var myCells = document.getElementById("color-chooser").getElementsByTagName("TD");
		for (var i = 0; i < myCells.length; i++) {
			if (myCells[i].className == "Current") myCells[i].className = "";
		}
		aCell.className = "Current";
		
	},


	// BUILD PREFERENCES
	showPreferences: function() {
		
		var myPrefs = document.getElementById("preferences");
		if (myPrefs) {
			myPrefs.className = "Open";
			if (typeof document.body.style.maxHeight == "undefined") {
				// IE6 or worse
				document.removeChild(myPrefs);
				document.appendChild(myPrefs);
			}
			return;
		}
		myPrefs = document.createElement("DIV");
		myPrefs.id = "preferences";
		myPrefs.className = "Open";
		document.body.appendChild(myPrefs);
		
		var myA = document.createElement("A");
		myA.appendChild(document.createTextNode("x"));
		myA.className = "Closer";
		myA.onclick = function() {
			document.getElementById("preferences").className = "Closed";
		}
		var cookieVals = Array();
		var prefCookie = readCookie("preferences");
		if (prefCookie) {
			cookieVals = prefCookie.split(/_/);
		}
		myPrefs.appendChild(myA);
		// Form required by Konqueror for radio buttons
		var myForm = document.createElement("FORM");
		myPrefs.appendChild(myForm);
		myForm.appendChild(this.buildTextChooser(cookieVals));
		myForm.appendChild(this.buildColorChooser(cookieVals));
		
		// DEFAULTS
		var myP = document.createElement("P");
		myP.className = "Defaults";
		myPrefs.appendChild(myP);
		myButton = document.createElement("INPUT");
		myButton.type = "button";
		myButton.value = this.local.colorDefaults
		myButton.onclick = function() {
			writeCookie("preferences", "");
			var myExp = /^[^\#]+/;
			var myMatch = ("" + window.location).match(myExp);
			window.location = myMatch[0];
		}
		myP.appendChild(myButton);
		
		
		// IE Sucks
		var ieSucks = document.getElementById("text-chooser").getElementsByTagName("INPUT");
		for (var i = 0; i < ieSucks.length; i++) {
			if (ieSucks[i].value == "toCheck") try { 
				ieSucks[i].checked = "checked";
			} catch(e) {
			}
		}
		
	},


	// BUILD TEXT CHOOSER
	buildTextChooser: function(cookieVals) {
		
		$cIdx = 6;
		
		var myP, mySpan, myLabel, myInput, labels, bodyClasses, myNode;
		var myChooser = document.createElement("DIV");
		myChooser.id = "text-chooser";
		
		// TEXT SIZE
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		myEm = document.createElement("EM");
		myEm.appendChild(document.createTextNode(this.local.textSize));
		myP.appendChild(myEm);
		
		labels = Array("A", "A", "A");
		bodyClasses = Array("Text0", "Text1", "Text2");
		this.buildRadio(myP, labels, cookieVals[$cIdx], $cIdx++, bodyClasses, "pref-txt-size");
		
		// small
		myNode = myP.firstChild.nextSibling;
		myNode.title = this.local.textSmall;
		myNode.style.fontSize = "75%";
		// medium
		myNode = myNode.nextSibling;
		myNode.title = this.local.textMedium;
		myNode.style.fontSize = "100%";
		// large
		myNode = myNode.nextSibling;
		myNode.title = this.local.textLarge;
		myNode.style.fontSize = "120%";
		
		// TEXT FONT
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		myEm = document.createElement("EM");
		myEm.appendChild(document.createTextNode(this.local.textFont));
		myP.appendChild(myEm);
		
		labels = Array("sans", "serif", "mono");
		bodyClasses = Array("Sans", "Serif", "Mono");
		this.buildRadio(myP, labels, cookieVals[$cIdx], $cIdx++, bodyClasses, "pref-txt-font");
		
		// TITLES FONT
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		myEm = document.createElement("EM");
		myEm.appendChild(document.createTextNode(this.local.titlesFont));
		myP.appendChild(myEm);
		
		labels = Array("sans", "serif", "mono");
		bodyClasses = Array("TSans", "TSerif", "TMono");
		this.buildRadio(myP, labels, cookieVals[$cIdx], $cIdx++, bodyClasses, "pref-titles-font");
		
		// TITLES FONT VARIANT
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		myEm = document.createElement("EM");
		myEm.appendChild(document.createTextNode(this.local.titlesVariant));
		myP.appendChild(myEm);
		// SMALLCAPS
		this.buildCheckbox(myP, this.local.smallcaps, cookieVals[$cIdx], $cIdx++, "TSmallCaps");
		// ITALIC
		this.buildCheckbox(myP, this.local.italic, cookieVals[$cIdx], $cIdx++, "TItalic");
		
		// TITLE DECO
		labels = Array(this.local.plain, this.local.tab, this.local.fancy);
		// TITLE 1
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		myEm = document.createElement("EM");
		myEm.appendChild(document.createTextNode(this.local.title1Deco));
		myP.appendChild(myEm);
		bodyClasses = Array("", "TabH1", "FancyH1");
		this.buildRadio(myP, labels, cookieVals[$cIdx], $cIdx++, bodyClasses, "pref-deco-h1");
		// TITLE 2
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		myEm = document.createElement("EM");
		myEm.appendChild(document.createTextNode(this.local.title2Deco));
		myP.appendChild(myEm);
		bodyClasses = Array("", "TabH2", "FancyH2");
		this.buildRadio(myP, labels, cookieVals[$cIdx], $cIdx++, bodyClasses, "pref-deco-h2");
		
		// LOGO
		labels = Array(this.local.left, this.local.center);
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		myEm = document.createElement("EM");
		myEm.appendChild(document.createTextNode(this.local.logo));
		myP.appendChild(myEm);
		bodyClasses = Array("", "LogoC");
		this.buildRadio(myP, labels, cookieVals[$cIdx], $cIdx++, bodyClasses, "pref-logo");
		
		return myChooser;
		
	},


	// BUILD COLOR CHOOSER
	buildColorChooser: function(cookieVals) {

		var selectSize = 1;
		var myP, mySelect, lbl, opts;
		var myChooser = document.createElement("DIV");
		myChooser.id = "color-chooser";
		
		// COLOR PICKER
		var myTable = document.createElement("TABLE");
		var myTBody = document.createElement("TBODY");
		myChooser.appendChild(myTable);
		myTable.appendChild(myTBody);
		for (sat = 255; sat > 0; sat -= 32) {
			var myRow = document.createElement("TR");
			for (hue = 0; hue < 256; hue += 8) {
				var myCell = document.createElement("TD");
				myCell.hue = hue;
				myCell.sat = sat;
				myCell.title = hue + "-" + sat;
				myCell.style.background = myCell.style.color = this.HSV_TO_RGB(hue, sat, 128);
				if (hue == cookieVals[0] && sat == cookieVals[1]) {
					myCell.className = "Current";
				}
				myCell.onclick = function() {
					myMainClass.updateColorStylesheet(0, this.hue, 1, this.sat);
					myMainClass.updateCurrentColor(this);
				}
				myCell.appendChild(document.createTextNode("X"));
				myRow.appendChild(myCell);
			}
			myTBody.appendChild(myRow);
		}
		
		// SELECT ELEMENTS
		myP = document.createElement("P");
		myChooser.appendChild(myP);
		
		// type
		var lblL = this.local.colorLight;
		var lblD = this.local.colorDark;
		mySelect = this.buildSelect(Array(
			Array("0", lblL + " + " + lblL),
			Array("3", lblD + " + " + lblD),
			Array("2", lblL + " + " + lblD),
			Array("1", lblD + " + " + lblL)
		), cookieVals[2]);
		mySelect.size = selectSize;
		mySelect.onchange = function() {
			myMainClass.updateColorStylesheet(2, this.value);
		}
		myP.appendChild(mySelect);
		
		// contrast
		lbl = this.local.colorContrast + " ";
		opts = Array();
		for (var i = -8; i <= 8; i++) {
			var ipre = (i > 0)? "+" : "";
			opts[opts.length] = Array(i, lbl + ipre + i);
		}
		mySelect = this.buildSelect(opts, cookieVals[3]);
		mySelect.size = selectSize;
		mySelect.onchange = function() {
			myMainClass.updateColorStylesheet(3, this.value);
		}
		myP.appendChild(mySelect);
		
		// birghtness
		lbl = this.local.colorBrightness + " ";
		opts = Array();
		for (var i = -8; i <= 8; i++) {
			var ipre = (i > 0)? "+" : "";
			opts[opts.length] = Array(i, lbl + ipre + i);
		}
		mySelect = this.buildSelect(opts, cookieVals[4]);
		mySelect.size = selectSize;
		mySelect.onchange = function() {
			myMainClass.updateColorStylesheet(4, this.value);
		}
		myP.appendChild(mySelect);
		
		// color 2
		lbl = this.local.color2 + " ";
		mySelect = this.buildSelect(Array(
			Array("-128", lbl + "-128"),
			Array( "-96", lbl +  "-96"),
			Array( "-64", lbl +  "-64"),
			Array( "-48", lbl +  "-48"),
			Array( "-32", lbl +  "-32"),
			Array( "-24", lbl +  "-24"),
			Array( "-16", lbl +  "-16"),
			Array(  "-8", lbl +   "-8"),
			Array(   "0", lbl +    "0"),
			Array(   "8", lbl +   "+8"),
			Array(  "16", lbl +  "+16"),
			Array(  "24", lbl +  "+24"),
			Array(  "32", lbl +  "+32"),
			Array(  "48", lbl +  "+48"),
			Array(  "64", lbl +  "+64"),
			Array(  "96", lbl +  "+96"),
			Array( "128", lbl + "+128")
		), cookieVals[5]);
		mySelect.size = selectSize;
		mySelect.onchange = function() {
			myMainClass.updateColorStylesheet(5, this.value);
		}
		myP.appendChild(mySelect);
		
		return myChooser;
		
	},


	// HSV TO RGB
	HSV_TO_RGB: function (H, S, V) {
		
		H = H / 255;
		S = S / 255;
		V = V / 255;
		var R, G, B;
		
		if (S == 0) {
			R = G = B = V * 255;
		}
		else {
			var_H = H * 6;
			var_i = Math.floor( var_H );
			var_1 = V * ( 1 - S );
			var_2 = V * ( 1 - S * ( var_H - var_i ) );
			var_3 = V * ( 1 - S * (1 - ( var_H - var_i ) ) );

			if       (var_i == 0) { var_R = V     ; var_G = var_3  ; var_B = var_1 ; }
			else if  (var_i == 1) { var_R = var_2 ; var_G = V      ; var_B = var_1 ; }
			else if  (var_i == 2) { var_R = var_1 ; var_G = V      ; var_B = var_3 ; }
			else if  (var_i == 3) { var_R = var_1 ; var_G = var_2  ; var_B = V     ; }
			else if  (var_i == 4) { var_R = var_3 ; var_G = var_1  ; var_B = V     ; }
			else                  { var_R = V     ; var_G = var_1  ; var_B = var_2 ; }

			R = parseInt(var_R * 255);
			G = parseInt(var_G * 255);
			B = parseInt(var_B * 255);
		}

		return "rgb(" + R + "," + G + "," + B + ")";
		
	}


};




// Trim String
String.prototype.trim = function() {
	var a = this.replace(/^\s+/, "");
	return a.replace(/\s+$/, "");
};


// Reverse String
String.prototype.reverse = function() { 
	return this.split("").reverse().join("");
};


// Rot13
String.prototype.rot13 = function(){
		return this.replace(/[a-zA-Z]/g, function(c){
				return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
		});
};



// node class helper functions

function hasClass(anode, aclass) {
	var myClasses = " " + anode.className + " ";
	return (myClasses.indexOf(" " + aclass + " ") >= 0);
};

function addClass(anode, aclass) {
	var myClasses = " " + anode.className + " ";
	if (myClasses.indexOf(" " + aclass + " ") < 0) {
		myClasses += " " + aclass;
		myClasses.trim();
		anode.className = myClasses;
	}
};

function removeClass(anode, aclass) {
	var myClasses = " " + anode.className + " ";
	var idx = myClasses.indexOf(" " + aclass + " ");
	if (idx >= 0) {
		myClasses = myClasses.substring(0, idx) + myClasses.substring(idx + aclass.length + 1);
		myClasses.trim();
		anode.className = myClasses;
	}
};

function removeClasses(anode, classArray) {
	for (var i = 0; i < classArray.length; i++) {
		removeClass(anode, classArray[i]);
	}
};

function toggleClass(anode, classA, classB) {
	if (hasClass(anode, classA)) {
		removeClass(anode, classA);
		addClass(anode, classB);
	} else {
		removeClass(anode, classB);
		addClass(anode, classA);
	}
}

function writeCookie(name, value, days) {
	var expires = "";
	if (days) {
		var date = new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		expires = "; expires=" + date.toGMTString();
	}
	var myExp = /^\w+:\/\/[^\/]+((\/[^\/]+)+\/)[^\/]+$/;
	var loc = "" + window.location;
	var match = loc.match(myExp);
	var path = (match) ? match[1] : "/";
	document.cookie = name + "=" + escape(value) + expires + "; path=" + path;
}

function readCookie(name) {
	var cook = " " + document.cookie;
	var idx0 = cook.indexOf(" " + name + "=");
	if (idx0 < 0)  return null;
	var idx1 = idx0 + name.length + 2;
	var idx2 = cook.indexOf(";", idx1);
	if (idx2 < 0)  idx2 = cook.length;
	return unescape(cook.substring(idx1, idx2));
}

function formValidateEmail(field) {
	var myVal = field.value.trim();
	if (! field.value) return;
	var myExp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/;
	var myMatch = myVal.match(myExp);
	if (!myMatch) { alert(myLocalizationClass.formInvalidEmail); }
}


// class instances
var myLocalizationClass = new LocalizationClass();
var myMainClass = new MainClass(myLocalizationClass);


var jsCss = new Array (
"",
"	<style type='text/css'>",
"	div.SlideShow div.Slide h3,",
"	div.SlideShow div.Slide div.Comment {",
"		display: none;",
"	}",
"	</style>",
""
);
document.write(jsCss.join("\n"));



