/**
* Stellt die Funktionalität für Schriftvergrößerung/Verkleinerung zur Verfügung
*
* @package fontSize
* @author Ralf Glaser
*
* Voraussetzungen:
* ================
*	In der CSS-Stylesheet-Datei muss ein Style für den body definiert sein, dass die
* Basis-Schriftgröße in em festlegt. Alle anderen Schriftgrößen müssen ebenfalls in
* em definiert sein
*
* 
*
* Script einbinden:
* =================
* <script language="JavaScript" type="text/JavaScript" src="fontSize.class.js" />
*	
* Steuer-Panel einbinden:
* =======================
* <a href="javascript:fontSize.changeSize(2);">größer</a>&nbsp;
* <a href="javascript:fontSize.changeSize(0);">reset</a>&nbsp;
* <a href="javascript:fontSize.changeSize(-2);">kleiner</a>
*
*/

function fontSizeEngine()  {
	
	var machine=this;
	
	this.cookieName='fontSize';
	this.currentSize=1;
	this.timerObj=false;
	
	/*********************/
	/*    public         */
	/*********************/
	
	
	
	//-----------------------------------------------------------------------------
	this.changeSize= function(steps)  {
						
		if (steps==0) {
			
			this.currentSize=1;
			
			this.setCookie();
			
			location.reload();
			
		} else {
		
			if (steps>0) {
				
				factor=((steps*1000)+10000)/10000;
				
				} else {
				
				factor=Math.round((1/((Math.abs(steps)/10)+1))*10000)/10000;
								
			}
			
			if (document.styleSheets) {
			
				this.changeStylesSize(factor);
				/*this.changeImgsSize(factor);
				/*this.changeObjectsSize(factor);*/
				this.changeTablesSize(factor);
					
				this.currentSize=Math.round(this.currentSize*factor*10000)/10000;
		
				this.setCookie();
				
			} else {
				
				alert('Sorry!\nDiese Funktion ist mit Ihrem Browser leider nicht verfuegbar.');
				
			}
			
		}
		
				
	}

	/*********************/
	/*    private        */
	/*********************/
	
	//-----------------------------------------------------------------------------
	this.init=function()  {
	
		this.timerObj=setInterval(this.onLoadFunction,500);
		
	}

	//-----------------------------------------------------------------------------
	this.onLoadFunction=function() {
		
		// must be defined seperate, otherwise IE5 crashes!
		// use 'machine', not 'this'
		
		if (document.getElementsByTagName('body')[0] && document.getElementsByTagName('body')[0].lastChild) {
		
			clearInterval(machine.timerObj);
		
			machine.checkCookie();
			
		}
		
	}
	
	//-----------------------------------------------------------------------------
	this.checkLoaded=function()  {
		
		return (document.readyState=='complete' ? true : false);
		
	}
		
	//-----------------------------------------------------------------------------
	this.changeStylesSize= function(factor)  {
		
		if(this.currentSize > 1.32 && factor > 0) {
			
			this.currentSize = 1.32;
			factor = 1;
			
			} else if (this.currentSize == 1.32 && factor < 0) {
				
				this.currentSize = 1.32;
				factor = 0.8;
				
				}
			
			/*alert('Faktor: '+factor+' Grösse: '+this.currentSize);*/
	
		if (document.styleSheets && document.styleSheets[0])  {
			
			for (j=0;j<document.styleSheets.length;j++)  {
				
				if(document.styleSheets[j].rules) { //IE
			
					for (i=0;i<document.styleSheets[j].rules.length;i++) {
			
						r=document.styleSheets[j].rules.item(i);
						this.changeStyleSize(r,factor);
					
					}
			
				} else {
								
					try { // gecko throws Exception on accessing stylesheets from diffrent domains
				
						if (document.styleSheets[j].cssRules) { // gecko
				
							for (i=0;i<document.styleSheets[j].cssRules.length;i++)  {
					
								r=document.styleSheets[j].cssRules[i];
								this.changeStyleSize(r,factor);
						
							}
					
						}
				
					} catch (e) {
	
					}
	
				}
			
			}
		
		}
	
	}	
	
	//-----------------------------------------------------------------------------
	this.changeStyleSize= function(rule,factor)  {

		/*if (rule.style.width) {
			
			rule.style.width=this.calcValue(rule.style.width,factor);
									
		}
		
		if (rule.style.height) {
		
			rule.style.height=this.calcValue(rule.style.height,factor);
						
		}*/
				
		if (rule.selectorText.match(/^\w*body\w*$/i)) {	// change fontsize only in body-style
			
			if (rule.style.fontSize) {
							
				rule.style.fontSize=this.calcValue(rule.style.fontSize,factor);
									
			}
			
		}
		
		/*if (rule.style.borderLeftWidth) {
			
			rule.style.borderLeftWidth=this.calcValue(rule.style.borderLeftWidth,factor);
									
		}
		
		if (rule.style.borderRightWidth) {
							
			rule.style.borderRightWidth=this.calcValue(rule.style.borderRightWidth,factor);
									
		}
		
		if (rule.style.borderTopWidth) {
			
			rule.style.borderTopWidth=this.calcValue(rule.style.borderTopWidth,factor);
									
		}
		
		if (rule.style.borderBottomWidth) {
							
			rule.style.borderBottomWidth=this.calcValue(rule.style.borderBottomWidth,factor);
									
		}
		
		if (rule.style.marginLeft) {
			
			rule.style.marginLeft=this.calcValue(rule.style.marginLeft,factor);
									
		}
		
		if (rule.style.marginRight) {
							
			rule.style.marginRight=this.calcValue(rule.style.marginRight,factor);
									
		}
		
		if (rule.style.marginTop) {
			
			rule.style.marginTop=this.calcValue(rule.style.marginTop,factor);
									
		}
		
		if (rule.style.marginBottom) {
							
			rule.style.marginBottom=this.calcValue(rule.style.marginBottom,factor);
									
		}
		
		if (rule.style.paddingLeft) {
			
			rule.style.paddingLeft=this.calcValue(rule.style.paddingLeft,factor);
									
		}
		
		if (rule.style.paddingRight) {
							
			rule.style.paddingRight=this.calcValue(rule.style.paddingRight,factor);
									
		}
		
		if (rule.style.paddingTop) {
			
			rule.style.paddingTop=this.calcValue(rule.style.paddingTop,factor);
									
		}
		
		if (rule.style.paddingBottom) {
							
			rule.style.paddingBottom=this.calcValue(rule.style.paddingBottom,factor);
									
		}
		
		if (rule.style.left) {
			
			rule.style.left=this.calcValue(rule.style.left,factor);
									
		}
		
		if (rule.style.right) {
							
			rule.style.right=this.calcValue(rule.style.right,factor);
									
		}
		
		if (rule.style.top) {
			
			rule.style.top=this.calcValue(rule.style.top,factor);
									
		}
		
		if (rule.style.bottom) {
							
			rule.style.bottom=this.calcValue(rule.style.bottom,factor);
									
		}*/

	}

	//-----------------------------------------------------------------------------
	this.changeImgsSize= function(factor)  {
		
		objs=document.getElementsByTagName('img');
				
		for (i=0;i<objs.length;i++) {
			
			e=objs[i];
			
			//alert(e.offsetWidth+'=>'+String(Math.floor(e.offsetWidth*factor))+'px\n'+e.offsetHeight+'=>'+String(Math.floor(e.offsetHeight*factor))+'px');
			
			e.style.width=String(Math.floor(e.offsetWidth*factor))+'px';
			e.style.height=String(Math.floor(e.offsetHeight*factor))+'px';
			
		}
		
	}
	
	//-----------------------------------------------------------------------------
	this.changeObjectsSize= function(factor)  {
		
		objs=document.getElementsByTagName('object');
				
		for (i=0;i<objs.length;i++) {
			
			e=objs[i];
			
			e.style.width=String(Math.floor(e.offsetWidth*factor))+'px'
			e.style.height=String(Math.floor(e.offsetHeight*factor))+'px'
			
		}
		
	}
	
	//-----------------------------------------------------------------------------
	this.changeTablesSize= function(factor)  {
		
		objs=document.getElementsByTagName('table');
				
		for (i=0;i<objs.length;i++) {
			
			e=objs[i];
			
			if (e.width)  e.width=this.calcIntOrPercent(e.width,factor);
			if (e.height)  e.height=this.calcIntOrPercent(e.height,factor);
			if (e.border)  e.border=this.calcIntOrPercent(e.border,factor);
			if (e.cellPadding)  e.cellPadding=this.calcIntOrPercent(e.cellPadding,factor);
			if (e.cellSpacing)  e.cellSpacing=this.calcIntOrPercent(e.cellSpacing,factor);
			
		}
		
		objs=document.getElementsByTagName('td');
				
		for (i=0;i<objs.length;i++) {
			
			e=objs[i];
						
			if (e.width)  e.width=this.calcIntOrPercent(e.width,factor);
			if (e.height)  e.height=this.calcIntOrPercent(e.height,factor);
									
		}
		
	}
	
	//-----------------------------------------------------------------------------
	this.calcValue= function(value,factor)  {
		
		if (String(value).toLowerCase()=='auto')  {
		
			return 'auto';
		
		} else {
			
			unit=value.match(/[^0-9.-]+/i);
			
			if (String(unit)=='%' ) {

				return value;

			}	 else {
			
				newValue=Math.round(parseFloat(value)*factor*10000)/10000;
		
				if (String(unit).toLowerCase()=='px' || String(unit)=='')  {
			
					if (parseFloat(value)==0)  {
					
						newValue=0;
					
					} else {
					
						newValue=(Math.floor(newValue)==0 ? 1 : Math.floor(newValue));
					
					}
			
				}

				return String(newValue)+unit;
						
			}
		
		}
			
		
	}
	
	//-----------------------------------------------------------------------------
	this.calcIntOrPercent= function(value,factor)  {
				
		if (!isNaN(value)) {
			
			// scale integers	
			if (parseInt(value)==0)  {
					
				newValue=0;
					
			} else {
					
				newValue=(Math.floor(parseInt(value)*factor)==0 ? 1 : Math.floor(parseInt(value)*factor));
					
			}
		
			return newValue;
			
		} else {
			
			// leace percentage alone
			return value;
			
		}
		
	}
	
	//-----------------------------------------------------------------------------
	this.setCookie=function()  {
	
		if (navigator.cookieEnabled==true)	{
	
			window.status='fontSize->set: '+this.currentSize;		
			document.cookie=this.cookieName+'='+this.currentSize+'; path=/; domain='+location.host;	
			
		} else {
			
			alert('Ihr Browser ist so eingestellt, dass er das Setzen eines Cookies nicht zulaesst.\n\nDie Größen-Einstellung kann deshalb nicht dauerhaft gespeichert werden.');
			
		}

	}
	
	//-----------------------------------------------------------------------------
	this.checkCookie=function(id)  {
		
		var cookieStart=document.cookie.indexOf(this.cookieName+'=');

		if (cookieStart>-1) {

			cookieStart+=this.cookieName.length+1;
			var cookies=document.cookie;
			var cookieEnd=cookies.indexOf(';',cookieStart);
			cookieEnd=(cookieEnd>0 ? cookieEnd : cookies.length);
			var cookieSize=cookies.substring(cookieStart,cookieEnd);
			
			window.status='fontSize->'+cookieSize;
							
			if (this.currentSize!=cookieSize) {
				
				this.changeSize((cookieSize-1)*10);
				this.currentSize=cookieSize;
			}
	
		} 
		
	}

	this.init();
	
}
	
fontSize=new fontSizeEngine();
