var buttonsLoop = true;
var alwaysReload = false;
var scaled_path;
var scaled_name='scaled';
var scaled_ext='.jpeg';
var comments = new Object();
var size_is_guess;
var slideshowDelay = 8000;
var slideshowInterval = 1000;
var slideshowElapsed = 0;
var slideshowTimer;
var phonePrefixes = {};
phonePrefixes['iso4'] = '+93';
phonePrefixes['iso248'] = '+358';
phonePrefixes['iso8'] = '+355';
phonePrefixes['iso12'] = '+213';
phonePrefixes['iso16'] = '+1-684';
phonePrefixes['iso20'] = '+376';
phonePrefixes['iso24'] = '+244';
phonePrefixes['iso660'] = '+1-264';
phonePrefixes['iso10'] = '(depends on base)';
phonePrefixes['iso28'] = '+1-268';
phonePrefixes['iso32'] = '+54';
phonePrefixes['iso51'] = '+374';
phonePrefixes['iso533'] = '+297';
phonePrefixes['iso36'] = '+61';
phonePrefixes['iso40'] = '+43';
phonePrefixes['iso31'] = '+994';
phonePrefixes['iso44'] = '+1-242';
phonePrefixes['iso48'] = '+973';
phonePrefixes['iso50'] = '+880';
phonePrefixes['iso52'] = '+1-246';
phonePrefixes['iso112'] = '+375';
phonePrefixes['iso56'] = '+32';
phonePrefixes['iso84'] = '+501';
phonePrefixes['iso204'] = '+229';
phonePrefixes['iso60'] = '+1-441';
phonePrefixes['iso64'] = '+975';
phonePrefixes['iso68'] = '+591';
phonePrefixes['iso70'] = '+387';
phonePrefixes['iso72'] = '+267';
phonePrefixes['iso74'] = '(lump of ice)';
phonePrefixes['iso76'] = '+55';
phonePrefixes['iso86'] = '+246';
phonePrefixes['iso96'] = '+673';
phonePrefixes['iso100'] = '+359';
phonePrefixes['iso854'] = '+226';
phonePrefixes['iso108'] = '+257';
phonePrefixes['iso116'] = '+855';
phonePrefixes['iso120'] = '+237';
phonePrefixes['iso124'] = '+1';
phonePrefixes['iso132'] = '+238';
phonePrefixes['iso136'] = '+1-345';
phonePrefixes['iso140'] = '+236';
phonePrefixes['iso148'] = '+235';
phonePrefixes['iso152'] = '+56';
phonePrefixes['iso156'] = '+86';
phonePrefixes['iso162'] = '+61';
phonePrefixes['iso166'] = '+61';
phonePrefixes['iso170'] = '+57';
phonePrefixes['iso174'] = '+269';
phonePrefixes['iso178'] = '+242';
phonePrefixes['iso180'] = '+243';
phonePrefixes['iso184'] = '+682';
phonePrefixes['iso188'] = '+506';
phonePrefixes['iso384'] = '+225';
phonePrefixes['iso191'] = '+385';
phonePrefixes['iso192'] = '+53';
phonePrefixes['iso196'] = '+357';
phonePrefixes['iso203'] = '+420';
phonePrefixes['iso208'] = '+45';
phonePrefixes['iso262'] = '+253';
phonePrefixes['iso212'] = '+1-767';
phonePrefixes['iso214'] = '+1-809 and +1-829';
phonePrefixes['iso218'] = '+593';
phonePrefixes['iso818'] = '+20';
phonePrefixes['iso222'] = '+503';
phonePrefixes['iso226'] = '+240';
phonePrefixes['iso232'] = '+291';
phonePrefixes['iso233'] = '+372';
phonePrefixes['iso231'] = '+251';
phonePrefixes['iso238'] = '+500';
phonePrefixes['iso234'] = '+298';
phonePrefixes['iso242'] = '+679';
phonePrefixes['iso246'] = '+358';
phonePrefixes['iso250'] = '+33';
phonePrefixes['iso254'] = '+594';
phonePrefixes['iso258'] = '+689';
phonePrefixes['iso260'] = '(lumps of ice)';
phonePrefixes['iso266'] = '+241';
phonePrefixes['iso270'] = '+220';
phonePrefixes['iso268'] = '+995';
phonePrefixes['iso276'] = '+49';
phonePrefixes['iso288'] = '+233';
phonePrefixes['iso292'] = '+350';
phonePrefixes['iso300'] = '+30';
phonePrefixes['iso304'] = '+299';
phonePrefixes['iso308'] = '+1-473';
phonePrefixes['iso312'] = '+590';
phonePrefixes['iso316'] = '+1-671';
phonePrefixes['iso320'] = '+502';
phonePrefixes['iso831'] = '+44';
phonePrefixes['iso324'] = '+224';
phonePrefixes['iso624'] = '+245';
phonePrefixes['iso328'] = '+592';
phonePrefixes['iso332'] = '+509';
phonePrefixes['iso334'] = '(nature preserves)';
phonePrefixes['iso336'] = '+379 assigned, +39 used';
phonePrefixes['iso340'] = '+504';
phonePrefixes['iso344'] = '+852';
phonePrefixes['iso348'] = '+36';
phonePrefixes['iso352'] = '+354';
phonePrefixes['iso356'] = '+91';
phonePrefixes['iso360'] = '+62';
phonePrefixes['iso364'] = '+98';
phonePrefixes['iso368'] = '+964';
phonePrefixes['iso372'] = '+353';
phonePrefixes['iso833'] = '+44';
phonePrefixes['iso376'] = '+972';
phonePrefixes['iso380'] = '+39';
phonePrefixes['iso388'] = '+1-876';
phonePrefixes['iso392'] = '+81';
phonePrefixes['iso832'] = '+44';
phonePrefixes['iso400'] = '+962';
phonePrefixes['iso398'] = '+7';
phonePrefixes['iso404'] = '+254';
phonePrefixes['iso296'] = '+686';
phonePrefixes['iso408'] = '+850';
phonePrefixes['iso410'] = '+82';
phonePrefixes['iso414'] = '+965';
phonePrefixes['iso417'] = '+996';
phonePrefixes['iso418'] = '+856';
phonePrefixes['iso428'] = '+371';
phonePrefixes['iso422'] = '+961';
phonePrefixes['iso426'] = '+266';
phonePrefixes['iso430'] = '+231';
phonePrefixes['iso434'] = '+218';
phonePrefixes['iso438'] = '+423';
phonePrefixes['iso440'] = '+370';
phonePrefixes['iso442'] = '+352';
phonePrefixes['iso446'] = '+853';
phonePrefixes['iso807'] = '+389';
phonePrefixes['iso450'] = '+261';
phonePrefixes['iso454'] = '+265';
phonePrefixes['iso458'] = '+60';
phonePrefixes['iso462'] = '+960';
phonePrefixes['iso466'] = '+223';
phonePrefixes['iso470'] = '+356';
phonePrefixes['iso584'] = '+692';
phonePrefixes['iso474'] = '+596';
phonePrefixes['iso478'] = '+222';
phonePrefixes['iso480'] = '+230';
phonePrefixes['iso175'] = '+269';
phonePrefixes['iso484'] = '+52';
phonePrefixes['iso583'] = '+691';
phonePrefixes['iso498'] = '+373';
phonePrefixes['iso492'] = '+377';
phonePrefixes['iso496'] = '+976';
phonePrefixes['iso499'] = '+382';
phonePrefixes['iso500'] = '+1-664';
phonePrefixes['iso504'] = '+212';
phonePrefixes['iso508'] = '+258';
phonePrefixes['iso104'] = '+95';
phonePrefixes['iso516'] = '+264';
phonePrefixes['iso520'] = '+674';
phonePrefixes['iso524'] = '+977';
phonePrefixes['iso528'] = '+31';
phonePrefixes['iso530'] = '+599';
phonePrefixes['iso540'] = '+687';
phonePrefixes['iso554'] = '+64';
phonePrefixes['iso558'] = '+505';
phonePrefixes['iso562'] = '+227';
phonePrefixes['iso566'] = '+234';
phonePrefixes['iso570'] = '+683';
phonePrefixes['iso574'] = '+672';
phonePrefixes['iso580'] = '+1-670';
phonePrefixes['iso578'] = '+47';
phonePrefixes['iso512'] = '+968';
phonePrefixes['iso586'] = '+92';
phonePrefixes['iso585'] = '+680';
phonePrefixes['iso275'] = '+970';
phonePrefixes['iso591'] = '+507';
phonePrefixes['iso598'] = '+675';
phonePrefixes['iso600'] = '+595';
phonePrefixes['iso604'] = '+51';
phonePrefixes['iso608'] = '+63';
phonePrefixes['iso612'] = '+64-9';
phonePrefixes['iso616'] = '+48';
phonePrefixes['iso620'] = '+351';
phonePrefixes['iso630'] = '+1-787 and +1-939';
phonePrefixes['iso634'] = '+974';
phonePrefixes['iso638'] = '+262';
phonePrefixes['iso642'] = '+40';
phonePrefixes['iso643'] = '+7';
phonePrefixes['iso646'] = '+250';
phonePrefixes['iso654'] = '+290';
phonePrefixes['iso659'] = '+1-869';
phonePrefixes['iso662'] = '+1-758';
phonePrefixes['iso666'] = '+508';
phonePrefixes['iso670'] = '+1-784';
phonePrefixes['iso882'] = '+685';
phonePrefixes['iso674'] = '+378';
phonePrefixes['iso678'] = '+239';
phonePrefixes['iso682'] = '+966';
phonePrefixes['iso686'] = '+221';
phonePrefixes['iso688'] = '+381';
phonePrefixes['iso690'] = '+248';
phonePrefixes['iso694'] = '+232';
phonePrefixes['iso702'] = '+65';
phonePrefixes['iso703'] = '+421';
phonePrefixes['iso705'] = '+386';
phonePrefixes['iso90'] = '+677';
phonePrefixes['iso706'] = '+252';
phonePrefixes['iso710'] = '+27';
phonePrefixes['iso239'] = '+500';
phonePrefixes['iso724'] = '+34';
phonePrefixes['iso144'] = '+94';
phonePrefixes['iso736'] = '+249';
phonePrefixes['iso740'] = '+597';
phonePrefixes['iso744'] = '+47';
phonePrefixes['iso748'] = '+268';
phonePrefixes['iso752'] = '+46';
phonePrefixes['iso756'] = '+41';
phonePrefixes['iso760'] = '+963';
phonePrefixes['iso158'] = '+886';
phonePrefixes['iso762'] = '+992';
phonePrefixes['iso834'] = '+255';
phonePrefixes['iso764'] = '+66';
phonePrefixes['iso626'] = '+670';
phonePrefixes['iso768'] = '+228';
phonePrefixes['iso772'] = '+690';
phonePrefixes['iso776'] = '+676';
phonePrefixes['iso780'] = '+1-868';
phonePrefixes['iso788'] = '+216';
phonePrefixes['iso792'] = '+90';
phonePrefixes['iso795'] = '+993';
phonePrefixes['iso796'] = '+1-649';
phonePrefixes['iso798'] = '+688';
phonePrefixes['iso800'] = '+256';
phonePrefixes['iso804'] = '+380';
phonePrefixes['iso784'] = '+971';
phonePrefixes['iso826'] = '+44';
phonePrefixes['iso840'] = '+1';
phonePrefixes['iso581'] = '(nature preserves)';
phonePrefixes['iso858'] = '+598';
phonePrefixes['iso860'] = '+998';
phonePrefixes['iso548'] = '+678';
phonePrefixes['iso862'] = '+58';
phonePrefixes['iso704'] = '+84';
phonePrefixes['iso92'] = '+1-284';
phonePrefixes['iso850'] = '+1-340';
phonePrefixes['iso876'] = '+681';
phonePrefixes['iso732'] = '(depends on occupying force in region)';
phonePrefixes['iso887'] = '+967';
phonePrefixes['iso894'] = '+260';
phonePrefixes['iso716'] = '+263';

// Scrollbar workarounds for IE6 and IE7.
var resizing = 0;
var horzResizable = new Array();
var vertResizable = new Array();

// PocketIE breaks on document.location.toString().
var debugPrint = new String(document.location).indexOf('debug=on') > -1;
var debugLaunch = new String(document.location).indexOf('debugger=on') > -1;
var sDebug = '';
var debugIndent = 0;

function runDebugger() {
	if (debugLaunch) {
		debugger;
	}
}
function makeDebugButton() {
	var elm = document.getElementById('debugButton');
	var body = document.getElementsByTagName("BODY")[0];
	if ((! elm) && (body)) {
		elm = document.createElement('input');
		elm.id = 'debugButton';
		elm.type = 'button';
		elm.value = 'debug messages';
		function showDebug() { alert(sDebug); };
		elm.onclick = showDebug;
		//elm.attachEvent("onclick", showDebug);
		body.appendChild(elm);
		elm = document.createElement('input');
		elm.id = 'clearButton';
		elm.type = 'button';
		elm.value = 'clear messages';
		function clearDebug() { sDebug = ''; };
		elm.onclick = clearDebug;
		body.appendChild(elm);
	}
}
// debug types
//   0 - async begin
//   1 - sync begin
//   2 - inside
//   3 - end
function debug(s, dbgType) {
	if (debugPrint) {
		if (dbgType == 0) {
			// Good place to start a debugger.
			runDebugger();
		}
		if (dbgType == 2) s = "in " + s;
		if (dbgType < 2) debugIndent++;
		for (var i = 0; i < debugIndent; i++) s = "  " + s;
		if (dbgType == 3) {
			s += " (end)";
			debugIndent--;
		}
		s += " [" + resizing + "]";
		s += "\r\n";
		if (debugIndent == 0) s += "\r\n";
		sDebug += s;
		makeDebugButton();
	}
}


/***************************
 * switchBgColor(object)
 * -----
 * Skifter baggrundsfarven for et objekt til en fast farve og tilbage igen.
 ****************************/
function switchBgColor(obj) {
	if ((String(obj.style.backgroundColor)).length > 0) {
		obj.style.backgroundColor = '';
	} else {
		obj.style.backgroundColor = '#ccffcc';
	}
}


/***************************
 * enableJsControls()
 * -----
 * Finder alle DIVs som indeholder elementer der kun virker når JS fungerer.
 ****************************/
function enableJsControls() {
	var divs = document.getElementsByTagName('DIV');
	for (var i = 0; i < divs.length; i++) {
		var div = divs[i];
		var className = new String(div.className);
		if (className.indexOf('requiresJavascript') > -1) div.style.display = '';
	}
}


/***************************
 * findResizableDivs()
 * -----
 * Finder alle DIVs som kan antage en scrollbar.
 * Benyttes til at hjælpe browseren til at vise scrollbars de rigtige steder..
 ****************************/
function isIe6() {
	return ((renderer.engine == 'trident') && (renderer.versionMajor == 6));
}
function isIe7() {
	return ((renderer.engine == 'trident') && (renderer.versionMajor == 7));
}
function findResizableDivs() {
	var divs = document.getElementsByTagName('DIV');
	for (var i = 0; i < divs.length; i++) {
		var div = divs[i];
		var className = new String(div.className);
		if (className.indexOf('resizable') > -1) {
			div.vertResizable = className.indexOf('vert_resizable') > -1;
			div.horzResizable = className.indexOf('horz_resizable') > -1;
			if (div.vertResizable) vertResizable[vertResizable.length] = div;
			if (div.horzResizable) horzResizable[horzResizable.length] = div;
			if (isIe6()) {
				if (! (div.vertResizable && div.horzResizable)) {
					if (div.vertResizable) div.style.overflowX = 'hidden';
					if (div.horzResizable) div.style.overflowY = 'hidden';
				}
			}
		}
	}
}

/***************************
 * findFirstChildWithTagName(parent object, tag name)
 * -----
 * Finder den første kontrol (kan være parent) med et givent HTML tag.
 * 'tag name' skal angived med store bogstaver.
 ****************************/
function findFirstChildWithTagName(parent, tagName) {
	if ((new String(parent.tagName)).toUpperCase() == tagName) return parent;
	for (var i = 0; i < parent.childNodes.length; i++) {
		var testChild = findFirstChildWithTagName(parent.childNodes[i], tagName);
		if (testChild) return testChild;
	}
	return null;
}


/***************************
 * findAllChildrenWithTagName(result array, parent object, tag name)
 * -----
 * Finder alle kontroller (kan være parent) med et givent HTML tag.
 * 'tag name' skal angived med store bogstaver.
 ****************************/
function findAllChildrenWithTagName(results, parent, tagName) {
	if ((new String(parent.tagName)).toUpperCase() == tagName) results[results.length] = parent;
	for (var i = 0; i < parent.childNodes.length; i++) {
		results = findAllChildrenWithTagName(results, parent.childNodes[i], tagName);
	}
	return results;
}


/***************************
 * hoverClick(parent object)
 * -----
 * Simulerer musetryk på et A element eller sub-element.
 * Bruges typisk i forbindelse med mouseover, hvor et tryk på en TD
 * skal resultere i et tryk på et A link inde i TD'en.
 ****************************/
function hoverClick(parentObj) {
	var foundObj = findFirstChildWithTagName(parentObj, "A");
	if (foundObj) {
		if (foundObj.click) foundObj.click();
		else location.href = foundObj.href;
	}
	return false;
}


/***************************
 * loadkrone
 * -----
 * Så vi ikke skal vente på kronerejser.dk før vor eget kode kører,
 * men vi stadig laver et hit hos dem (er det egentlig vigtigt?).
 ****************************/
function loadkrone() {
	var obj = document.getElementById('kronelink');
	if (obj) obj.src = 'http://www.kronerejser.dk/images/banners/fbbanner.gif';
}


/***************************
 * setCapabilities
 * -----
 * Sætter en cookie med bla. skærmstørrelse, som serveren bruger når billedgallerier vises.
 ****************************/
function setCapabilities() {
	var html = document.documentElement;
	// On IE, when setCapabilities is called via window.onload(), this next line invokes onresize().
	if (typeof(renderer) == 'undefined') throw new Error("'Renderer' object not defined.  Perhaps an external javascript file was not loaded.  Check connection for intermittent failures?");
	var caps = "engine=" + renderer.engine + "&width=" + html.clientWidth + "&height=" + html.clientHeight;
	document.cookie = "CLIENTCAPS=" + escape(caps) + "; path=/";
	if (size_is_guess) {
		// Reload with cookie set if this is user's first visit.
		// Hope that nothing odd happens to send the user into a reload loop.
		// If that happens we can add a magic to the URL before reload
		// and stop redirecting if that magic is present.
		if (document.cookie.indexOf("CLIENTCAPS") != -1) document.location.reload();
	}
}


/***************************
 * validation stuff
 * -----
 * Kaldes ved onload, og når en kontrol ændrer sig
 * Validerer og farver kontroller, hvis der er nogen kontroller.
 ****************************/
function validate(target) {
	if ((! this.validateRepost) && (! target)) return;
	if (validateFields) {
		for (var field in validateFields) {
			if ((! target) || ((target) && (target == field))) {
				var obj = document.getElementById(field);
				// Only try to validate if the form was actually sent; sometimes there may be a confirmation page etc instead.
				if (obj) {
					obj.value = obj.value.replace(/^\s+|\s+$/, '');
					var matches = obj.value.match(validateFields[field]);
					matches = matches && obj.value.length <= validateLengths[field];
					if (matches) {
						/*if (target == field) obj.style.backgroundColor = '#0f0';
						else obj.style.backgroundColor = '';*/
						obj.style.backgroundColor = '#0f0';
					} else {
						if (obj.value.length == 0) obj.style.backgroundColor = validateRepost ? '#f00' : '';
						else obj.style.backgroundColor = '#f00';
					}
				}
			}
		}
	}
	postValidate(target);
}
function validateReset(target) {
	var obj = document.getElementById(target);
	obj.style.backgroundColor = '#fff';
}
function postValidate(target) {
	var pfxSpan = document.getElementById('tlfDefaultPrefix');
	var country = document.getElementById('Land');
	if (! pfxSpan) return;
	pfxSpan.innerHTML = "";
	if (! country) return;
	country = country.value;
	if (! country) return;
	if (! phonePrefixes) return;
	var s = phonePrefixes["iso" + country];
	if (! s) return;
	if (s[0] != '(') s = '(' + s + ')';
	pfxSpan.innerHTML = s;
}


/***************************
 * onload stuff
 * -----
 * Kaldes når .js inkluderes.
 * Tegner menuer og lignende.
 ****************************/
function siteInitNifty() {
	debug('siteInitNifty', 0);
	beginIeWorkaround();
	borderHackColor='#ffffff';
	if (typeof(Nifty) == 'undefined') throw new Error("'Nifty' object not defined.");
	Nifty("ul#mainnav a","transparent all");
	borderHackColor='#ffffff';
	Nifty("ul#subnav a","transparent top");
	borderHackColor='#ffffff';
	Nifty("td#maincontent","tr");
	borderHackColor='#ffffff';
	Nifty("div#subcontent","bl br tr");
	Nifty("td#affix_bottom_corners","bl br");
	endIeWorkaround();
	debug('siteInitNifty', 3);
}

function siteInit() {
	debug('siteInit', 0);
	beginIeWorkaround();
	//findRules();
	findWeeks();
	findResizableDivs();
	enableJsControls();
	loadkrone();
	validate();
	// Find out renderer's viewport size etc.
	setCapabilities();
	wait(["images_loaded"], function() {
		// PocketIE breaks when trying to set property.
		if (! renderer.jsBroken) window.onresize = resize;
		// Help the browser to apply correct scrollbars.
		resizeElements(true);
	});
	// Disable 'prev' button if first image selected, etc.
	flickPrevNextButtons();
	// Find and activate first form field, if it exists.
	var inputs = document.getElementsByTagName('INPUT');
	if (inputs.length > 0) {
		// IE will abort if the input element is inside something hidden with display:none.
		setTimeout("try { document.getElementsByTagName('INPUT')[0].focus(); } catch (e) { }", 0);
	}
	// Enable Google Maps stuff.
	if (enableMap()) {
		// Execute page-specific onload function, if any.
		if (window.loadMap) window.loadMap();
	}
	if (window.pageLoad) window.pageLoad();
	// Fix Google Maps urls to work like the rest of the site.
	makeGoogleExternalLinksOpenInTabs();
	endIeWorkaround();
	debug('siteInit', 3);
}
function siteInitRot() {
	debug('siteInitRot', 0);
	beginIeWorkaround();
	Rot.decryptMailto();
	endIeWorkaround();
	debug('siteInitRot', 3);
}
function siteJsLoadWait() {
	// Execute linked javascripts when the browser has fetched them,
	// and their inter-dependencies allow for execution.
	debug('siteJsLoadWait', 0);
	wait(["html_loaded", "uaselect_loaded", "nifty_loaded"], siteInitNifty);
	wait(["html_loaded", "uaselect_loaded"], siteInit);
	wait(["html_loaded", "uaselect_loaded", "rot_loaded"], siteInitRot);
	debug('siteJsLoadWait', 3);
}


/***************************
 * kalender hover helper funktion
 * --
 * Highlights a bunch of elements belonging to the same vacation week by fiddling with CSS rules.
 ****************************/
var sheet, rules;
var hoverRules = new Array();
var newRules = new Object();
var addedRules = new Array();
function findRules() {
	if (hoverRules.length == 0) {
		var i;
		var sheets = document.styleSheets;
		sheet = null;
		for (i = 0; i < sheets.length; i++) {
			var h = sheets[i].href;
			if (h.indexOf('kalender.css') != -1) {
				sheet = sheets[i];
				break;
			}
		}
		var rule = null;
		var search = ":hover";
		if (! sheet) throw new Error("No CSS style sheet API found.");
		if (sheet.cssRules) rules = sheet.cssRules;
		if (sheet.rules) rules = sheet.rules;
		if (rules.length == 0) throw new Error("No CSS rules in style sheet " + sheet.href + ".");
		for (i = 0; i < rules.length; i++) {
			var text = rules[i].selectorText.toString().toLowerCase();
			if (text.indexOf(search) != -1) {
				var obj = new Object();
				obj.selectorText = rules[i].selectorText;
				obj.propsText = rules[i].style.cssText;
				hoverRules.push(obj);
			}
		}
		if (hoverRules.length == 0) throw new Error("No applicable CSS rules found.");
	}
}
function eraseAdded() {
	var o;
	while (o = addedRules.pop()) {
		if (sheet.removeRule) sheet.removeRule(o);
		else if (sheet.deleteRule) sheet.deleteRule(o);
	}
}
function makeNewRules(weekNr) {
	if (! newRules[weekNr]) {
		newRules[weekNr] = new Array();
		for (var i = 0; i < hoverRules.length; i++) {
			var selector = hoverRules[i].selectorText;
			var props = hoverRules[i].propsText;
			selector = selector.replace(/:hover/g, weekNr.toString());
			newRules[weekNr].push(selector);
			newRules[weekNr].push(props);
		}
	}
}
function addRules(weekNr) {
	var ruleBase = newRules[weekNr];
	for (var i = 0; i < ruleBase.length; i += 2) {
		if (sheet.addRule) sheet.addRule(ruleBase[i], ruleBase[i + 1]);
		else if (sheet.insertRule) sheet.insertRule(ruleBase[i] + '{ ' + ruleBase[i + 1] + '}', rules.length);
		addedRules.push(rules.length - 1);
	}
}
/*function hoverWeekNumber(weekNr) {
	// Correct way of doing things.
	// Very slow in nearly all browsers, unfortunately.
	eraseAdded();
	makeNewRules(weekNr);
	addRules(weekNr);
}
function unHover(weekNr) {
	// See comment in hoverWeekNumber.
	eraseAdded();
}*/
function hoverWeekNumber(weekNr) {
	// A faster workaround.
	setHoverClass(weekNr, true);
}
function unHover(weekNr) {
	// As above.
	setHoverClass(weekNr, false);
}
function findWeeks() {
	if (String(document.location.href).indexOf('/ugeplan') > -1) {
		var rows = document.getElementsByTagName('TR');
		var re = new RegExp("week(\\d+)");
		for (var i = 0; i < rows.length; i++) {
			var matches = re.exec(rows[i].className);
			if (matches) rows[i][matches[0]] = true;
			if (rows[i].className.indexOf('active') > -1) rows[i]['weekActive'] = true;
		}
	}
}
function setHoverClass(weekNr, setting) {
	var rows = document.getElementsByTagName('TR');
	var name = 'week' + weekNr;
	for (var i = 0; i < rows.length; i++) {
		if (rows[i][name]) {
			var hoverclass = " " + (rows[i].weekActive ? "activeweek" : "week") + "hover";
			if (setting) rows[i].className += hoverclass;
			else rows[i].className = rows[i].className.replace(hoverclass, "");
		}
	}
}


/***************************
 * indexOf funktion til javascript arrays
 ****************************/
[].indexOf || (Array.prototype.indexOf = function(obj) {
	for (var i = 0; i < this.length; i++) if (this[i] == obj) return i;
	return -1;
});


/***************************
 * Kode til valg af et emne på en liste og visning
 * af relevante kontroller for det valgte emne.
 * Workarounds for manglende CSS funktioner i IE6.
 ****************************/
var prevSel = null;
var selCol = '#ff8886';
var highCol = '#8a8ae2';
function setSelectedName(name) {
	var obj = document.getElementById('nameContain');
	obj.innerHTML = name;
}
function setEnabledActions(obj, status) {
	var c = obj.childNodes;
	var j = 0;
	for (var i = 0; i < c.length; i++) {
		if (c[i].tagName == "OPTION") {
			if (j > 1) c[i].disabled = ! status;
			j++;
		}
	}
}
function selectRow(obj) {
	if (prevSel) prevSel.style.backgroundColor = '';
	if (obj) obj.style.backgroundColor = selCol;
	prevSel = obj;
	var sel = document.getElementById('Action');
	if (sel.selectedIndex == 1) sel.selectedIndex = 0;
	setEnabledActions(sel, Boolean(obj));
	//sel.selectedIndex = 0;
	setSelectedName("'" + findFirstChildWithTagName(obj, "TD").innerHTML + "'");
	var root = document.getElementById('RootEvent');
	root.value = obj.className.substring(3);
	flipEditControls(sel);
}
function high(obj) {
	if (obj.style.backgroundColor == '') obj.style.backgroundColor = highCol;
}
function low(obj) {
	if (obj != prevSel) obj.style.backgroundColor = '';
}
function flipNotfound() {
	var obj = document.getElementById('notFound');
	if (obj.style.display == 'none') obj.style.display = '';
	else obj.style.display = 'none';
}
function flipEditControls(actionBox) {
	// Hide and show relevant edit controls.
	var a = actionBox.selectedIndex;
	for (var i = 0; i < controls.length; i++) {
		var ctl = document.getElementById(controls[i]);
		var vis = actions[a].indexOf(i) > -1;
		ctl.style.display = vis ? "" : "none";
	}

	// Fetch id of selected event.
	var root = document.getElementById('RootEvent').value;

	// Fill in template text.
	var template = document.getElementById('template_' + a);
	var textArea = document.getElementById('textarea_' + a);
	var helpArea = document.getElementById('helparea_' + a);
	if (template) {
		var text = template.innerHTML;
		var matchObj = new RegExp("^data_" + root + "_(.*)$");
		var dataObjs = document.getElementsByTagName('INPUT');
		for (var i = 0; i < dataObjs.length; i++) {
			var data = matchObj.exec(dataObjs[i].id);
			if (data) {
				text = text.replace(new RegExp("%" + data[1] + "%", "g"), dataObjs[i].value);
			}
		}
		textArea.innerHTML = text;
	}
	for (var j = 1; j < actions.length; j++) {
		var ctl = document.getElementById('helparea_' + j);
		if (ctl) ctl.style.display = "none";
		ctl = document.getElementById('textarea_' + j);
		if (ctl) ctl.style.display = "none";
	}
	if (helpArea) helpArea.style.display = '';
	if (textArea) textArea.style.display = '';
}
function selectAction(obj) {
	if (obj.selectedIndex == 0) {
		flipEditControls(obj);
	} else if (obj.selectedIndex == 1) {
		setEnabledActions(obj, false);
		setSelectedName('(ingen)');
		if (prevSel) prevSel.style.backgroundColor = '';
		prevSel = null;
		flipEditControls(obj);
	} else if (prevSel) flipEditControls(obj);
	else {
		// For browsers that won't disable select options.
		obj.selectedIndex = 0;
		selectAction(obj);
	}
}


/***************************
 * replace scaled image with another one
 ****************************/
function getThumbnails() {
	var thumbs = document.getElementById('thumbnails');
	var images = findAllChildrenWithTagName(new Array(), thumbs, "IMG");
	return images;
}
function getImageNumber(images, image) {
	for (i = 0; i < images.length; i++) {
		if (images[i] == image) return "[" + (i + 1) + "/" + images.length + "]";
	}
	return "&nbsp;";
}
function getImageUrl(thumbLink) {
	var selImage = thumbLink.href;
	selImage = selImage.substring(selImage.indexOf('?show=') + 6);
	if (selImage.indexOf('&') > -1) selImage = selImage.substring(0, selImage.indexOf('&'));
	return selImage;
}
function getFullPath(imageName) {
	return scaled_path + '/' + scaled_name + '_' + imageName + scaled_ext;
}
function showImage(obj, isSlideshow, doScroll) {
	if (alwaysReload) return true;
	// Stop slideshow if it was a manual click.
	if (! isSlideshow) stopSlideshow();
	// If the user has resized the window by more than 50 pixels,
	// recalculate and get a new scaled path from server.
	var html = document.documentElement;
	if (Math.abs(wanted_width - html.clientWidth) > 50) {
		// Abort and cause an actual page refresh so that the cookie gets set.
		// Unless size is a guess, in which case the cookie code failed, and
		// thus doing a real refresh won't help anything anyway.
		if (! size_is_guess) return true;
	}
	// Hide image before switching view, to avoid displaying old one again.
	var imgObj = document.getElementById('scaled_image');
	var img = findFirstChildWithTagName(imgObj, "IMG");
	img.style.visibility = 'hidden';
	// Save view state to decide if we should scroll to picture.
	var wasThumbView = isThumbView();
	// Return to non-full thumbnail view.
	thumbViewOff();
	var selImage = getImageUrl(obj);
	var thumbObj = findFirstChildWithTagName(obj, "IMG");
	// Scroll small right-hand thumbnail view to image selected in full thumbnail view.
	var thumbs = document.getElementById('thumbnails');
	if (thumbs && (wasThumbView || isSlideshow || doScroll)) {
		var y = Math.round(thumbObj.offsetTop - (thumbs.clientHeight / 2) + (thumbObj.clientHeight / 2));
		/*if (y < 0) y = 0;
		var maxTop = thumbs.scrollHeight - thumbs.clientHeight
		if (y > maxTop) y = maxTop;*/
		thumbs.scrollTop = y;
	}
	if ((renderer.engine == 'presto') && (img.complete)) {
		// Workaround for Opera bug: The onload line never fires in Opera.
		window.operaSetSelected = function() { setSelected(thumbObj, img, isSlideshow); };
		setTimeout("window.operaSetSelected()", 0);
	} else {
		img.onload = function() { setSelected(thumbObj, img, isSlideshow); };
	}
	img.src = getFullPath(selImage);
	// Todo: switch image name in history URL, so a reload via F5 will show the same image?
	var commentObj = document.getElementById('scaled_comment');
	var newComment = comments[selImage];
	if (! newComment) newComment = '&nbsp;';
	commentObj.innerHTML = newComment;
	var nrObj = document.getElementById('scaled_number');
	var images = findAllChildrenWithTagName(new Array(), thumbs, "IMG");
	var nr = getImageNumber(images, thumbObj);
	nrObj.innerHTML = nr;
	return false;
}
function setSelected(thumbObj, img, isSlideshow) {
	img.style.visibility = '';
	resizeElements();
	var images = getThumbnails();
	for (var i = 0; i < images.length; i++) {
		images[i].className = '';
	}
	thumbObj.className = 'selected';
	flickPrevNextButtons();
	if (isSlideshow) progressSlideshowTimer();
}
function showOrClickImage(obj, isSlideshow, doScroll) {
	if (showImage(obj, isSlideshow, doScroll)) document.location.href = obj.href;
}
function setCachingColor() {
	var running = document.getElementById('label_running');
	running.style.color = '#e00';
}
function setPreloadedColor() {
	var running = document.getElementById('label_running');
	running.style.color = '#0e0';
}
function showNextImage(isSlideshow, doScroll) {
	var images = getThumbnails();
	var next = false;
	for (var i = 0; i < images.length; i++) {
		if (next) {
			showOrClickImage(images[i].parentNode, isSlideshow, doScroll);
			// Preload next image.
			if (isSlideshow && (i < images.length - 1)) {
				window.someImage = new Image();
				setCachingColor();
				someImage.onload = setPreloadedColor;
				someImage.src = getFullPath(getImageUrl(images[i+1].parentNode));
			}
			return true;
		}
		if (images[i].className == 'selected') next = true;
	}
	if (! isSlideshow) {
		if (! buttonsLoop) return false;
		showFirstImage(isSlideshow, doScroll);
		return true;
	} else {
		// Prevent unattended clients looping and sucking bandwidth.
		if (confirm('Kør slideshow igen fra start?')) {
			showFirstImage(isSlideshow, doScroll);
			return true;
		} else stopSlideshow();
	}
	return false;
}
function showPrevImage(isSlideshow, doScroll) {
	var images = getThumbnails();
	var prev = false;
	for (var i = images.length - 1; i >= 0; i--) {
		if (prev) {
			showOrClickImage(images[i].parentNode, isSlideshow, doScroll);
			return true;
		}
		if (images[i].className == 'selected') prev = true;
	}
	if (! isSlideshow) {
		if (! buttonsLoop) return false;
		showLastImage(isSlideshow, doScroll);
		return true;
	}
	return false;
}
function showFirstImage(isSlideshow, doScroll) {
	var images = getThumbnails();
	if (images.length > 0) showOrClickImage(images[0].parentNode, isSlideshow, doScroll);
}
function showLastImage(isSlideshow, doScroll) {
	var images = getThumbnails();
	if (images.length > 0) showOrClickImage(images[images.length - 1].parentNode, isSlideshow, doScroll);
}
function flickPrevNextButtons() {
	if (! buttonsLoop) {
		var images = getThumbnails();
		var prevButton = document.getElementById('btnPrevImage').parentNode;
		var nextButton = document.getElementById('btnNextImage').parentNode;
		var className = "image_button";
		className += (images[0].className == 'selected') ? "_disabled" : "";
		prevButton.className = className;
		className = "image_button";
		className += (images[images.length - 1].className == 'selected') ? "_disabled" : "";
		nextButton.className = className;
	}
}


/***************************
 * start/stop slideshow
 ****************************/
function flipSlideshow() {
	var stopButton = document.getElementById('btnStop');
	if (stopButton.style.display == 'none') {
		// Currently stopped
		startSlideshow();
	} else {
		// Currently running
		stopSlideshow();
	}
}
function stopSlideshow() {
	var stopButton = document.getElementById('btnStop');
	var startButton = document.getElementById('btnStart');
	var restartButton = document.getElementById('btnRestart');
	var running = document.getElementById('label_running');
	if (slideshowTimer) {
		clearTimeout(slideshowTimer);
		startButton.style.display = 'none';
		stopButton.style.display = 'none';
		restartButton.style.display = '';
		running.innerHTML = '';
	}
}
function startSlideshow() {
	//alert('Tip: Brug F11 til at forstørre slideshowet.');
	var stopButton = document.getElementById('btnStop');
	var startButton = document.getElementById('btnStart');
	var restartButton = document.getElementById('btnRestart');
	startButton.style.display = 'none';
	stopButton.style.display = '';
	restartButton.style.display = 'none';
	progressSlideshowTimer();
}
function progressSlideshowTimer() {
	if (slideshowElapsed >= slideshowDelay) slideshowElapsed = 0;
	var running = document.getElementById('label_running');
	slideshowElapsed += slideshowInterval;
	var remaining = (slideshowDelay - slideshowElapsed) / 1000;
	var rString = "";
	for (var i = 0; i < remaining; i++) rString += ":";
	running.innerHTML = rString;
	if (slideshowElapsed >= slideshowDelay) nextSlide();
	else slideshowTimer = setTimeout("progressSlideshowTimer()", slideshowInterval);
}
function nextSlide() {
	debug('nextSlide', 0);
	showNextImage(true);
	debug('nextSlide', 3);
}


/***************************
 * add size parameter to thumbnail link (unused)
 ****************************/
function addSizeThumbnails() {
	var thumbs = document.getElementById('thumbnails');
	if (thumbs) {
		var html = document.documentElement;
		var images = findAllChildrenWithTagName(new Array(), thumbs, "A");
 		for (var i = 0; i < images.length; i++) {
			var link = images[i].href;
			if (link.indexOf('&width') > -1) link = link.substring(0, link.indexOf('&width'));
			link += '&width=' + html.clientWidth;
			images[i].href = link;
		}
	}
}


/***************************
 * expand thumbnail view to fill whole screen
 ****************************/
function flipThumbView() {
	stopSlideshow();
	var scaledBox = document.getElementById('scaledContainer');
	var thumbs = document.getElementById('thumbnails');
	//var thumbBox = document.getElementById('thumbContainer');
	var more = document.getElementById('btnViewMore');
	var less = document.getElementById('btnViewLess');
	if (less.style.display == 'none') {
		more.style.display = 'none';
		less.style.display = '';
		scaledBox.style.display = 'none';
		//thumbBox.prevSize = thumbBox.style.width;
		//thumbBox.style.width = '100%';
	} else {
		more.style.display = '';
		less.style.display = 'none';
		scaledBox.style.display = '';
		//thumbBox.style.width = thumbBox.prevSize;
		//thumbBox.style.width = 'auto';
	}
	// Fixes some browsers that seem to keep the scroll value..
	thumbs.scrollTop = 0;
	var tmp = thumbs.prevSize;
	if (! tmp) tmp = '';
	thumbs.prevSize = thumbs.style.width;
	thumbs.style.width = tmp;
}
function isThumbView() {
	var less = document.getElementById('btnViewLess');
	return (less.style.display != 'none');
}
function thumbViewOff() {
	if (isThumbView()) flipThumbView();
}


/***************************
 * various helper functions used when fixing IE
 ****************************/
// setTimeout(0) hopefully just means queue the call until after the current call thread has exited.
var ieTimeout = 0;
function invoke(func, funcparam1, funcparam2) {
	if (! isIe6()) {
		func(funcparam1, funcparam2);
	} else {
		var info = 'parameter closure for ';
		var paramContainer = function() {
			debug(info + func.name, 0);
			func(funcparam1, funcparam2);
			debug('end ' + info + func.name, 3);
		}
		setTimeout(paramContainer, ieTimeout);
	}
}
function beginIeWorkaround() {
	resizing++;
}
function endIeWorkaround() {
	resizing--;
}


/***************************
 * fix broken/useless implementation of height=100%, scroll=auto etc. (all browsers)
 ****************************/
function resizeHorzStep1(horzDiv, baseline) {
	// This method contains what we actually wanted to do.
	// The rest is just footwork required to support the workaround for IE.
	debug('resizeHorzStep1', 1);
	var html = document.documentElement;
	// Figure out and set correct width.
	var cw = horzDiv.scrollWidth;
	var of = html.scrollWidth - html.clientWidth;
	var aw = cw - of + baseline;
	debug('resizeHorzStep1, ' + horzDiv.id + ' overflowed by ' + of + 'px, baseline ' + baseline + 'px, restricting width to ' + aw + ' of ' + cw, 2);
	if ((of > 0) && (aw > 0)) horzDiv.style.width = aw + "px";
	// Hide element again.
	horzDiv.style.display = 'none';
	// Continue resizing.
	invoke(continueHorzResize, horzDiv, baseline);
	debug('resizeHorzStep1', 3);
}
function resizeVertStep1(vertDiv, baseline) {
	// This method contains what we actually wanted to do.
	// The rest is just footwork required to support the workaround for IE.
	debug('resizeVertStep1', 1);
	var html = document.documentElement;
	// Figure out and set correct width.
	var ch = vertDiv.scrollHeight;
	var of = html.scrollHeight - html.clientHeight;
	var ah = ch - of + baseline;
	debug('resizeVertStep1, ' + vertDiv.id + ' overflowed by ' + of + 'px, baseline ' + baseline + 'px, restricting height to ' + ah + ' of ' + ch, 2);
	if ((of > 0) && (ah > 0)) vertDiv.style.height = ah + "px";
	// Hide element again.
	vertDiv.style.display = 'none';
	// Continue resizing.
	invoke(continueVertResize, vertDiv, baseline);
	debug('resizeVertStep1', 3);
}
function findVertBaseline() {
	// Find out how much the window scrolls when all relevant elements are hidden.
	var html = document.documentElement;
	var of = html.scrollHeight - html.clientHeight;
	if (of < 0) of = 0;
	// Begin resizing.
	invoke(continueVertResize, false, of);
}
function findHorzBaseline() {
	// Find out how much the window scrolls when all relevant elements are hidden.
	var html = document.documentElement;
	var of = html.scrollWidth - html.clientWidth;
	if (of < 0) of = 0;
	// Begin resizing.
	invoke(continueHorzResize, false, of);
}
function continueHorzResize(curElement, baseline) {
	debug('continueHorzResize', 1);
	var found = curElement ? false : true;
	var last = true;
	// Resize elements.
	for (var i = 0; i < horzResizable.length; i++) {
		var horzDiv = horzResizable[i];
		if (! found) {
			if (curElement == horzDiv) found = true;
			continue;
		}
		last = false;
		debug('continueHorzResize, adjusting ' + horzDiv.id, 2);
		if (horzDiv.reDisplay) {
			// Show element using automatic (maximum) width.
			horzDiv.style.display = '';
			horzDiv.style.width = '';
			// Allow IE layout engine to settle, then resize.
			invoke(resizeHorzStep1, horzDiv, baseline);
		}
		break;
	}
	if (last) {
		// Revisualize all elements.
		debug('continueHorzResize, revisualize', 2);
		for (var i = 0; i < horzResizable.length; i++) {
			var horzDiv = horzResizable[i];
			horzDiv.style.display = '';
			horzDiv.reDisplay = false;
			horzDiv.scrollTop = horzDiv.preScrollTop;
		}
		beginResizeVertElements();
	}
	debug('continueHorzResize', 3);
}
function continueVertResize(curElement, baseline) {
	debug('continueVertResize', 1);
	var found = (curElement) ? false : true;
	var last = true;
	// Resize elements.
	for (var i = 0; i < vertResizable.length; i++) {
		var vertDiv = vertResizable[i];
		if (! found) {
			if (curElement == vertDiv) found = true;
			continue;
		}
		last = false;
		debug('continueVertResize, adjusting ' + vertDiv.id, 2);
		if (vertDiv.reDisplay) {
			// Show element using automatic (maximum) height.
			vertDiv.style.display = '';
			vertDiv.style.height = '';
			// Allow IE layout engine to settle, then resize.
			invoke(resizeVertStep1, vertDiv, baseline);
		}
		break;
	}
	if (last) {
		// Revisualize all elements.
		debug('continueVertResize, revisualize', 2);
		for (var i = 0; i < vertResizable.length; i++) {
			var vertDiv = vertResizable[i];
			vertDiv.style.display = '';
			vertDiv.reDisplay = false;
			vertDiv.scrollTop = vertDiv.preScrollTop;
		}
		beginResizeMisc();
	}
	debug('continueVertResize', 3);
}
function beginResizeHorzElements(force) {
	debug('beginResizeHorzElements', 1);
	var html = document.documentElement;
	var run = false;
	for (var i = 0; i < horzResizable.length; i++) {
		var horzDiv = horzResizable[i];
		// Skip invisible elements.
		if (horzDiv.style.display == 'none') continue;
		// Skip already resized elements.
		var sizeState = html.clientWidth + "." + horzDiv.scrollWidth;
		if (force) {
			debug('beginResizeHorzElements, forced cache miss', 2);
			horzDiv.sizeState = sizeState;
		} else if (sizeState != horzDiv.sizeState) {
			debug('beginResizeHorzElements, cache miss (' + sizeState + ' != ' + horzDiv.id + ' ' + horzDiv.sizeState + ')', 2);
			horzDiv.sizeState = sizeState;
		} else {
			debug('beginResizeHorzElements, cache hit for ' + horzDiv.id, 2);
			continue;
		}
		run = true;
	}
	if (run) {
		for (var i = 0; i < horzResizable.length; i++) {
			var horzDiv = horzResizable[i];
			// Skip invisible elements.
			if (horzDiv.style.display == 'none') continue;
			// Hide everyone else.
			horzDiv.reDisplay = true;
			// Some browsers will reset the scroller, work around that.
			horzDiv.preScrollTop = horzDiv.scrollTop;
			horzDiv.style.display = 'none';
		}
		invoke(findHorzBaseline);
	} else beginResizeVertElements();
	debug('beginResizeHorzElements', 3);
}
function beginResizeVertElements(force) {
	debug('beginResizeVertElements', 1);
	var html = document.documentElement;
	var run = false;
	for (var i = 0; i < vertResizable.length; i++) {
		var vertDiv = vertResizable[i];
		// Skip invisible elements.
		if (vertDiv.style.display == 'none') continue;
		// Skip already resized elements.
		var sizeState = html.clientHeight + "." + vertDiv.scrollHeight;
		if (force) {
			debug('beginResizeVertElements, forced cache miss', 2);
			vertDiv.sizeState = sizeState;
		} else if (sizeState != vertDiv.sizeState) {
			debug('beginResizeVertElements, cache miss (' + sizeState + ' != ' + vertDiv.id + ' ' + vertDiv.sizeState + ')', 2);
			vertDiv.sizeState = sizeState;
		} else {
			debug('beginResizeVertElements, cache hit for ' + vertDiv.id, 2);
			continue;
		}
		run = true;
	}
	if (run) {
		for (var i = 0; i < vertResizable.length; i++) {
			var vertDiv = vertResizable[i];
			// Skip invisible elements.
			if (vertDiv.style.display == 'none') continue;
			// Hide everyone else.
			vertDiv.reDisplay = true;
			// Some browsers will reset the scroller, work around that.
			vertDiv.preScrollTop = vertDiv.scrollTop;
			vertDiv.style.display = 'none';
		}
		invoke(findVertBaseline);
	} else beginResizeMisc();
	debug('beginResizeVertElements', 3);
}
function resizeElements(force) {
	debug('resizeElements', 1);
	beginIeWorkaround();
	beginResizeHorzElements(force);
	debug('resizeElements', 3);
}
function resizeMiscStep1() {
	debug('resizeMiscStep1', 0);
	// Workaround two IE rendering bugs:
	//  - Float elements with hasLayout take up entire screen in IE6.
	//  - IE7 doesn't expand container to fit the scrollbar in overflow:auto.
	if (renderer.engine == 'trident') {
		var imgDiv = document.getElementById('scaled_image');
		if (imgDiv) {
			if (imgDiv.style.width == "") {
				var scrollbarWidth = imgDiv.scrollWidth - imgDiv.clientWidth;
				imgDiv.style.width = String(imgDiv.scrollWidth + scrollbarWidth) + "px";
			}
			if (imgDiv.style.height == "") {
				var scrollbarHeight = imgDiv.scrollHeight - imgDiv.clientHeight;
				imgDiv.style.height = String(imgDiv.scrollHeight + scrollbarHeight) + "px";
			}
		}
	}
	// Close call stack and let IE run onresize() one last time before releasing.
	invoke(endIeWorkaround);
	debug('resizeMiscStep1', 3);
}
function beginResizeMisc() {
	debug('beginResizeMisc', 1);
	// Two workarounds for IE, as usual has to be split and run asynchronously as a 3rd workaround.
	if (renderer.engine == 'trident') {
		var imgObj = document.getElementById('scaled_image');
		if (imgObj) imgObj.style.width = '';
	}
	invoke(resizeMiscStep1);
	debug('beginResizeMisc', 3);
}


/***************************
 * - scrollbar fix til IE
 ****************************/
var preventIeLoop = 0;
function resize() {
	// IE doesn't add scrollbars (as it should?), unless we force a pixel size on the image/thumb box.
	debug('onresize', 0);
	// IE loops into onresize when html.client{width,height} is read and such.
	if (resizing > 0) {
		debug('onresize', 3);
		return;
	}
	beginIeWorkaround();

	// IE loops in onresize when various DOM properties are read out, consuming 100% CPU.
	preventIeLoop++;
	if ((preventIeLoop % 2 > 0) || (! isIe6())) {
		// Beware IE bug.
		// When done via onresize, resizing elements will not cause relayout before the thread has returned.
		// See workaround in invoke().
		resizeElements();

		// Set browser window size information.
		setCapabilities();

		// Todo: The scaled image isn't resized.
		//       Either the client should know about other sizes,
		//       or we should reload when the mismatch is above a threshold.

		// Resize Google Map.
		resizeMap();
	}

	endIeWorkaround();
	debug('onresize', 3);
}


/***************************
 * google fixes
 ****************************/
function makeGoogleExternalLinksOpenInTabs() {
	// All external links on bormes.dk opens in a new window
	// (tab for those who've configured their browser such).
	// Keeping the user experience uniform, apply the same to links on the map.
	var hrefs = document.getElementsByTagName('A');
	for (var i = 0; i < hrefs.length; i++) {
		var a = hrefs[i];
		if ((a.href.indexOf('google') > -1) && (a.href.indexOf('terms') > -1)) a.target = "_blank";
	}
	var imgs = document.getElementsByTagName('IMG');
	for (var i = 0; i < imgs.length; i++) {
		var img = imgs[i];
		if ((img.src.indexOf('google') > -1) && (img.src.indexOf('poweredby') > -1)) {
			// Doesn't work for some reason, activates after Google changes the browser's URL.
			/*img.onclick = function(e) {
				// Not sure how to get the real URL... fix later.
				window.open('http://maps.google.com/', '_blank');
				if (! e) e = window.event;
				e.cancelBubble = true;
				if (e.stopPropagation) e.stopPropagation();
			}*/
			// Brutal, and I don't like removing the Google ad since they're
			// kindly letting us use their map code and data, but it works.
			// Inserted a link in the 'see also' paragraph right above the
			// Google Maps picture which links to the same page this logo did (but as an external link).
			img.parentNode.removeChild(img);
		}
	}
}

function enableMap() {
	var map = document.getElementById('map');
	if (map) {
		if (this.GBrowserIsCompatible && GBrowserIsCompatible()) {
			window.map = map;
			window.onunload = GUnload;
			// If Google Map works, show DIVs related to the map.
			var divs = document.getElementsByTagName('DIV');
			for (var i = 0; i < divs.length; i++) {
				var className = new String(divs[i].className);
				if (className.indexOf('showWithMap') > -1) {
					divs[i].style.display = '';
				}
			}
			map.style.display = '';
			resizeMap();
			return true;
		} else {
			/* Supposed to work in conjunction with [noscript id='vanilla'], but doesn't.
			// Google Maps won't work, show vanilla contents.
			var ice = document.getElementById("vanilla");
			for (var i = 0; i < ice.childNodes.length; i++) {
				alert(ice.childNodes[i]);
				ice.parentNode.insertBefore(ice.childNodes[i], ice);
			}
			ice.parentNode.removeChild(ice);
			*/
			var ice = document.getElementById("vanilla");
			ice.style.display = '';
		}
	}
	return false;
}

function resizeMap() {
	var height = document.documentElement.clientHeight - 160;
	if (window.map) window.map.style.height = height + "px";
}


/***************************
 * vis billeder i fuld skærm
 ****************************/
function show_fullscreen(url) {
	// fullscreen means "maximize window".
	//
	// there's no way to simply invoke kiosk mode, unfortunately.
	// would have been extremely useful for pages containing slideshows.
	//
	// always use resizable=yes,scrollbars=yes,status=yes for accessibility reasons.
	// (no, there's no way to just say "use the defaults", short of removing all features specified. unfortunately.)

	var features = "resizable=yes,scrollbars=yes,status=yes,menubar=yes,toolbar=yes,location=yes,fullscreen=yes";
	window.open(url, "_blank", features);
}


/***************************
 * skal være til slut - aktiverer dette script's onload funktioner
 ****************************/
siteJsLoadWait();

