/**
* Stellt die Funktionalität für Schriftvergrößerung/Verkleinerung zur Verfügung
*
* @package madChickSize
* @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="madChickSize.class.js" />
*
* Steuer-Panel einbinden:
* =======================
* <a href="javascript:madChickSize.changeSize(2);">größer</a>&nbsp;
* <a href="javascript:madChickSize.changeSize(0);">reset</a>&nbsp;
* <a href="javascript:madChickSize.changeSize(-2);">kleiner</a>
*
*/

function madChickSizeEngine()  {

	var machine=this;

	this.cookieName='madChickSize';
	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 verfügbar.');

			}

		}


	}

	/*********************/
	/*    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 (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.fontSize) {

			unit=rule.style.fontSize.match(/[^0-9.-]+/i);

			if (String(unit).toLowerCase()=='px' ) {

				rule.style.fontSize=this.calcValue(rule.style.fontSize,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='madChickSize->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 zuläßt.\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='madChickSize->'+cookieSize;

			if (this.currentSize!=cookieSize) {

				this.changeSize((cookieSize-1)*10);
				this.currentSize=cookieSize;
			}

		}

	}

	this.init();

}

madChickSize=new madChickSizeEngine();
