/**
* Styleswitcher für Schriftgröße und alternative Styles (z.B. Kontrastversion)
* da die Funktion JavaScript voraussetzt, wird der Styleswitcher auch per JS in das Dokument geschrieben;
* vorhanden Stylesheets für media="screen" werden aufgelistet und als Alternativlink dargestellt;
*
* die JS-Datei sollte unbedingt NACH den Dokument-Stylesheets eingebunden werden!
*
* Vorgehensweise:
* - externe Stylesheets einbinden (title!)
* - alternative Stylesheets für media screen (title!)
* (alle Styles müssen auch code für den Styleswitcher enthalten; siehe unten)
* - dieses Script NACH den Style-Links einbinden
* - ins Dokument an die Stelle, an die der Styleswitcher soll, einen Container mit eindeutiger
*   ID schreiben (z.B. '<div id="styleswitcher"></div>')
*
* ACHTUNG: spezielle Anweisungen nur für REHAaktiv müssen bei Wiederverwendung entfernt werden
* (function REHA...)
*
* © 04/2006 i-D internet & Design GmbH & Co. KG
* Erfurter Str. 35
* 99423 Weimar
* Deutschland
* Fon:     03643 7785 0
* Fax:     03643 7785 29
* E-Mail:  office@i-d.de
* Web:     http://www.i-d.de/
*
* @author Niels Bobogk <niels@i-d.de>
*/

//--- Beginn Konfiguration ---

	// vorgegebene Schriftgrößen
	document.fontSizes = new Array('69%', '76%', '86%', '93%', '101.01%');
	
	// ID des Html-Elements, welches das Styleswitcher-GUI enthalten soll
	var ID_STYLESWITCHER_CONTAINER_ID = "styleswitcher";

//--- Ende Konfiguration ---


//--- Cookies ---

/**
* Erzeugen eines cookies
*
* @param string Name
* @param mixed Wert
* @param int Tage bis zum Ablauf des Cookies
*/
function setCookie(name, value, daysExp, path, domain, secure) {
	var d = document;
	var expires, date;
	
	if (typeof daysExp == "number") {
		date = new Date();
		date.setTime(date.getTime() + (daysExp * 24 * 60 * 60 * 1000));
		expires = "; expires=" + date.toGMTString();
	}
	document.cookie = name + "=" + escape(value) 
		+ ((expires) ? "; expires=" + expires : "") 
		+ ((path) ? "; path=" + path : "") 
		+ ((domain) ? "; domain=" + domain : "") 
		+ ((secure) ? "; secure" : "");
}

/**
* Lesen eines cookies
*
* @param string Name
*/
function getCookie(name) {
	var namEQ = name + "=";
	var arrCookies = document.cookie.split(';');
	
	for (var i = 0; i < arrCookies.length; i++) {
		var cookie = arrCookies[i];
		while (cookie.charAt(0) == ' ') {
			cookie = cookie.substring(1, cookie.length);
		}
		if (cookie.indexOf(namEQ) == 0) {
			return unescape(cookie.substring(namEQ.length, cookie.length));
		}
	}
	return null;
}

/**
* Löschen eines cookies;
* Verfallsdatum wird auf kleinstmöglichen Wert in der Vergangenheit gesetzt
*
* @param string Name
* @param string Pfad
* @param string Domäne
*/
function deleteCookie(name, path, domain) {
	if (getCookie(name)) {
		document.cookie = name + "=" 
			+ ((path) ? "; path=" + path : "") 
			+ ((domain) ? "; domain=" + domain : "") 
			+ "; expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}



//--- Styleswitcher ---

/**
* Setzen des aktiven Stylesheets
*
* @param string Title des Stylesheet-Links
*/
function setActiveStyleSheet(title) {
	var d = document;
	var i, a, main;

	if (title) {
		for(i = 0; (a = d.getElementsByTagName("link")[i]); i++) {
			if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
				a.disabled = true;
				if(a.getAttribute("title") == title) {
					a.disabled = false;
				}
				// im cookie speichern
  				setCookie('style', title, 180, '/', false, false);
			}
		}
	}
	
	REHAchangePicHeader(title);
}

/**
* Ermitteln des aktiven Stylesheets
*/
function getActiveStyleSheet() {
	var d = document;
	var i, a;
	
	for (i = 0; (a = d.getElementsByTagName("link")[i]); i++) {
		if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) {
			return a.getAttribute("title");
		}
	}
	return null;
}

/**
* Ermitteln des bevorzugten Stylesheets
*/
function getPreferredStyleSheet() {
	var d = document;
	var i, a;
	
	for (i = 0; (a = d.getElementsByTagName("link")[i]); i++) {
		if(a.getAttribute("rel").indexOf("style") != -1 
		&& a.getAttribute("rel").indexOf("alt") == -1 
		&& a.getAttribute("title")) {
			return a.getAttribute("title");
		}
  }
  return null;
}

/**
* Alle Stylesheet-Links für einen bestimmten Medientyp ermitteln
*
* @param string Medientyp
*/
function getDocStyleSheets(media) {
	var d = document;
	var mediastyles = new Array;
	var i, a;
	
	for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
		if (a.getAttribute("media").indexOf(media) > -1) {
			mediastyles[mediastyles.length] = a;
		}
	}
	return mediastyles;
}

/**
* Erzeugen der GUI für den Styleswitcher als DOM-Knoten mit IDs für Styles
* der virtuelle Code zu Orientierung:

...
	<div id="sswFontSizeContainer">
		<span id="sswFontSizeLabel">Schriftgröße</span>
		<br /><a href="javascript:;" id="sswFontSizeDown" onclick="setFontSize('down');" title="Schrift verkleinern">Schrift verkleinern</a>
		<br /><a  href="javascript:;"id="sswFontSizeUp" onclick="setFontSize('up');" title="Schrift vergrößern">Schrift vergrößern</a>
	</div>
	<div id="sswLayoutContainer">
		<span id="sswLayoutLabel">Layout</span>
		<ul id="">
			<li><a href="javascript:;" onclick="function..." id="sswLayout[+ Style-Title]">[Style-Title]</a></li>
			<li><a href="javascript:;" onclick="function..." id="sswLayout[+ Style-Title]">[Style-Title]</a></li>
			...
		</ul>
	</div>
...

*
* @author Niels Bobogk <niels@i-d.de>
* @param string ID des DOM-Knotens, in den der Styleswitcher-GUI eingefügt werden soll
*/
function createStyleswitcherGUI(parentNodeId) {
	var d = document;

	
	if (d.getElementById && d.getElementById(parentNodeId) && d.createElement) {
		var ssw = d.getElementById(parentNodeId);
		var text = '';
		var li, hr;
		
		// Trennlinie
		hr = d.createElement('hr');
		hr.style.display = 'none';
		ssw.appendChild(hr);
		
		// --- SCHRIFTGRÖSSE ---
		// Container
		d.sswFontSizeContainer = d.createElement('div');
		d.sswFontSizeContainer.id = 'sswFontSizeContainer';
		
		// Beschriftung
		d.sswFontSizeLabel = d.createElement('span');
		d.sswFontSizeLabel.id = 'sswFontSizeLabel'; 
		text = d.createTextNode('Schriftgröße');
		d.sswFontSizeLabel.appendChild(text);
		d.sswFontSizeContainer.appendChild(d.sswFontSizeLabel);
		
		d.sswFontSizeListe = d.createElement('ul');
		d.sswFontSizeContainer.appendChild(d.sswFontSizeListe);
		
		// Link Schrift kleiner
		d.sswFontSizeDown = d.createElement('a');
		d.sswFontSizeDown.href = 'java' + 'script:;';
		d.sswFontSizeDown.id = 'sswFontSizeDown';
		d.sswFontSizeDown.title = 'verkleinern';
		text = d.createTextNode('verkleinern');
		d.sswFontSizeDown.appendChild(text);
		d.sswFontSizeDown.onclick = function() { setFontSize('down') };
		li = d.createElement('li');
		li.appendChild(d.sswFontSizeDown);
		d.sswFontSizeListe.appendChild(li);
		
		// Link Schrift größer
		d.sswFontSizeUp = d.createElement('a');
		d.sswFontSizeUp.href = 'java' + 'script:;';
		d.sswFontSizeUp.id = 'sswFontSizeUp';
		d.sswFontSizeUp.title = 'vergrößern';
		text = d.createTextNode('vergrößern');
		d.sswFontSizeUp.appendChild(text);
		d.sswFontSizeUp.onclick = function(){ setFontSize('up') };
		li = d.createElement('li');
		li.appendChild(d.sswFontSizeUp);
		d.sswFontSizeListe.appendChild(li);
		
		// in den übergebenen Dokumentknoten einhängen
		d.sswFontSizeContainer.appendChild(d.sswFontSizeListe);
		ssw.appendChild(d.sswFontSizeContainer);
		
		
		// --- LAYOUT ---
		var docStyles = getDocStyleSheets('screen');
		if (docStyles && docStyles.length > 1) {
			d.sswLayoutContainer = d.createElement('div');
			d.sswLayoutContainer.id = 'sswLayoutContainer';
			
			// Beschriftung
			d.sswLayoutLabel = d.createElement('span');
			d.sswLayoutLabel.id = 'sswLayoutLabel'; 
			text = d.createTextNode('Layout');
			d.sswLayoutLabel.appendChild(text);
			d.sswLayoutContainer.appendChild(d.sswLayoutLabel);
			
			// Stylesheetliste
			d.sswLayoutListe = d.createElement('ul');			
			d.sswLayouts = new Array;
			for (var i = 0; i < docStyles.length; i++) {
				// nur wenn title-Attribut (= Name)
				var layout = docStyles[i].getAttribute('title');
				if (layout) {
					d.sswLayouts[i] = d.createElement('a');
					d.sswLayouts[i].href = 'java' + 'script:;';
					d.sswLayouts[i].id = 'sswLayout' + layout;
					d.sswLayouts[i].title = layout;
					text = d.createTextNode(layout);
					d.sswLayouts[i].appendChild(text);
					
					// Stylesheets beim Klicken wechseln
					// der Link-Title ist gleich dem Title der Eventquelle
					d.sswLayouts[i].onclick = function(e) { 
						if (!e) var e = window.event;
						
						var eventSource;
						if (e.target) eventSource = e.target;
						else if (e.srcElement) eventSource = e.srcElement;
						else eventSource = null;
						
						if (eventSource && eventSource.title) {
							setActiveStyleSheet(eventSource.title);
						}
					};
					
					var li = d.createElement('li');
					li.appendChild(d.sswLayouts[i]);
					d.sswLayoutListe.appendChild(li);
				}
			}
			
			d.sswLayoutContainer.appendChild(d.sswLayoutListe);
			
			// Trennlinie
			hr = d.createElement('hr');
			hr.style.display = 'none';
			ssw.appendChild(hr);
			
			// in den übergebenen Dokumentknoten einhängen
			ssw.appendChild(d.sswLayoutContainer);
		}
	}
}



//--- Schriftgröße ---

/**
* Zuweisen einer vordefinierten Schriftgröße an den body-Tag
*
* @author Niels Bobogk <niels@i-d.de>
* @param string 'up' für größere oder 'down' für kleinere Schrift
*/
function setFontSize(dir) {
	var d = document;
	
	// Array mit vorgegebenen Schriftgrößen, falls nicht schon vorkonfiguriert
	if (!d.fontSizes) d.fontSizes = new Array('69%', '76%', '86%', '93%', '101.01%');
	var newSize = 0;
	
	for (i = 0; i < d.fontSizes.length; i++) {
		if (d.body.style.fontSize == d.fontSizes[i]) {
			// größer
			if (dir == 'up') {
				if (i < d.fontSizes.length - 1) {
					newSize = d.fontSizes[i + 1];
				}
				else {
					newSize = d.fontSizes[d.fontSizes.length - 1];
				}
			}
			// kleiner
			if (dir == 'down') {
				if (i > 0) {
					newSize = d.fontSizes[i - 1];
				}
				else {
					newSize = d.fontSizes[0];
				}
			}
			break;
		}
	}
	
	// wenn keine Größe gefunden wurde, dann als Standard Größe im Feld [1]
	if (newSize == 0) newSize = d.fontSizes[1];

	// in cookie speichern
	setCookie('fontSize', newSize, 180, '/', false, false);
	
	// Schriftgröße zuweisen
	d.body.style.fontSize = newSize;
}

/**
* Schriftgröße aus einem Cookie so früh wie möglich zuweisen
* (sobald body verfügbar)
*
* @author Niels Bobogk <niels@i-d.de>
* @param string 'up' für größere oder 'down' für kleinere Schrift
*/
function setBodyFontSize() {
	var d = document;
	var fontSize = getCookie('fontSize');
	
	if (fontSize) {
		if (d.body) {			
			if (fontSize) d.body.style.fontSize = fontSize;
		}
		else {
			setTimeout('setBodyFontSize()', 100);
		}
	}
}


/**
* laden der Kontrast-Kopfgrafik
*
* @author Niels Bobogk <niels@i-d.de>
*/
function REHAloadContrastPicHeader() {
	var d = document;
	if (d.getElementById && d.getElementById('picHeader')) {
		var picHeader = d.getElementById('picHeader').firstChild;
		
		if (picHeader) {
			d.picHeaderNormal = new Image;
			d.picHeaderNormal.src = picHeader.src;
			
			d.contrastPicHeader = new Image;
			var newSrc = picHeader.src.replace('/kopfgrafiken/', '/kopfgrafiken_sw/');
			newSrc = newSrc.replace('.jpg', '.gif');
			d.contrastPicHeader.src = newSrc;
		}
	} 
}

/**
* wechseln der (Kontrast)-Kopfgrafik
*
* @author Niels Bobogk <niels@i-d.de>
* @param string Title des aktiven Stylesheets
*/
function REHAchangePicHeader(title) {
	var d = document;
	var picHeader = d.getElementById('picHeader').firstChild;
	
	if (picHeader && d.picHeaderNormal && d.contrastPicHeader) {
		if (title == 'Kontrastreich') {
			picHeader.src = d.contrastPicHeader.src;
		}
		else {
			picHeader.src = d.picHeaderNormal.src;
		}
	}
}



//--- Start ---

/**
* Startprozedur
*
* @author Niels Bobogk <niels@i-d.de>
*/
function init() {
	// da cookiebasiert erst auf cookies testen
	if (navigator.cookieEnabled) {
		createStyleswitcherGUI(ID_STYLESWITCHER_CONTAINER_ID);
		var cookie = getCookie('style');
  		var title = cookie ? cookie : getPreferredStyleSheet();
  		setActiveStyleSheet(title);
	}
	
	REHAloadContrastPicHeader();
	REHAchangePicHeader(getActiveStyleSheet());
}

// Schriftgröße so früh wie möglich laden
setBodyFontSize();

// Initialisierung, wenn Seite vollständig
window.onload = init;

