/* author: Don Kent, eShopHost Ltd */
/* Copyright (C) 2005, eShopHost Ltd. */

/* HISTORY
	1.0, 15/07/05
	1.1, 22/07/05 Enhancements: 1. call with 0 reverts to normal. 2. call with +1 to give proportional increase, similarly with -1. 3. Also finds <font> elements. 4. Also works with relative and absolute fontsizes.
	1.2, 28/09/05 Eliminated use of == undefined, etc. for IE5 Mac
	1.3, 29/09/05 For undocumented problem with IE5 Mac, use regexp.exec() instead of regexp.test() and RegExp.lastMatch. Also, do not limiot result if units ar "%"
	1.4, 01/11/05 C. Uses Inits array for multiple initialisations linked to event window.onload
	1.5, 04/01/10 C. Syntax error when defining function C!
*/

/* CONTENTS of setStyleSize.js (to increment or decrement all font-sizes in the external stylesheets by a number (+ or -) (in whatever unit e.g. px) */

/* Public functions */
/* 1. setStyleSize (x) */

/* Internal functions */
/* A. createCookie(name,value,days) */
/* B. readCookie(name) */
/* C. window.onload initialisation function */
/* D. window.onunload = function (e) */

/* Known PROBLEMS:
1. Does not look for HTML elements with in-line style attributes
2. Should use name space to prevent possible name clashes
*/

/* Global variables - whilst on the page */
var Increment = 0; // Integer
var Mult = 1.0; // The multiplier - Floating
var PerCent = 0.2; // Change per integer
var StyleRules = new Array (); // Memory for original stylesheet sizes
var FontObjSizes = new Array (); // Memory for original font object sizes

function setStyleSize(x) { // 1.
	// 1. Calculate the multiplier or change factor
	x= parseInt(x, 10);
	if (x == 0) { // reset to normal
		Increment = 0;
		Mult = 1.0; // for absolute sizes
		Change = 0.0; // for relative sizes
	} else { // change sizes from where they were last
		Increment = parseInt(Increment, 10) + x;
		Mult = Math.pow(1 + PerCent, Increment);
		Change = Increment;
	}
	// 2. Operate on the external stylesheets
	var sheets = document.styleSheets;
	var ruleList, fontSize;
	var k = -1;
	for (var i = 0; i < sheets.length; i++) {
		if (sheets[i].href && sheets[i].href.indexOf(".css")!=-1) { // Any external style sheet
			ruleList = (typeof sheets[i].cssRules) ? sheets[i].cssRules: ((typeof sheets[i].rules) ? sheets[i].rules : null);
			if (!ruleList) continue;
			for (var j = 0; j < ruleList.length; j++) {
				fontSize = ruleList[j].style.fontSize;
				if (fontSize) {
					k++;
					if (!(StyleRules[k])) {
						StyleRules[k] = fontSize;
					}
					var Units = /\D+/;
					var rArr = Units.exec(StyleRules[k]);
					if (rArr) {
						Units = rArr[0];
					} else Units = "";
					var Digits = /\d+/;
					rArr = Digits.exec(StyleRules[k]);
					if (rArr) { // numerical e.g. 150%, 10 px
						Digits = rArr[0];
						// Apply the multiplier
						Digits = Math.round(parseInt(Digits, 10) * Mult);
						// Limit the result
						if (Digits < 3) {Digits = 3;
						} else if ((Digits > 50) && (Units != "%")) {Digits = 50;
						}
						fontSize = "" + Digits + Units;
					} else { // x-small, etc.
						fontSize =  newFontSize(Units);
					}
					ruleList[j].style.fontSize = fontSize;
				}
			}
		}
	}
	// 3. Operate on <font> elements
	var FontObjs = document.getElementsByTagName("font");
	for (var i = 0; i < FontObjs.length; i++) {
		if (!(FontObjSizes[i])) {
			FontObjSizes[i] = FontObjs[i].size.toString();
		}
		var Size = FontObjSizes[i];
		var Relative = FontObjSizes[i].length;
		if (Size) {
			Size = parseInt(Size, 10);
			var Sign = Size > 0 ? "+" : "-";
			if (Relative == 2) { // relative, having string values of -1 .. -7 or +1 .. +7
				NewSize = Size + Change;
				if (NewSize > 7 ) {
					NewSize = 7;
				} else if (NewSize < -7) {
					NewSize = -7;
				} else if (NewSize == 0) {
					NewSize = Sign == "-" ? 1 : -1;
				}
				Sign = NewSize > 0 ? "+" : "-";
				NewSize = Sign + Math.abs(NewSize).toString();
			} else { // absolute value of 1 .. 7, so limit the computed value
				NewSize = Size + Change;
				if (NewSize > 7 ) {
					NewSize = 7;
				} else if (NewSize < 1) {
					NewSize = 1;
				}
				NewSize = NewSize.toString();
			}
			FontObjs[i].size = NewSize;
		}
	}
	// 4. Operate on Style attributes ...
}

function newFontSize (Size) {
	// Calculates new fontSize from relative or absolute names
	var sizes = new Array("xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "smaller", "larger");
	var FontSize = 1;
	for (var i = 0; i < sizes.length; i++) {
		if (Size == sizes[i]) {
			FontSize += i; // 1 .. 7
			break;
		}
	}
	if (FontSize == 8 ) { // smaller (cf 3)
		FontSize = 2;
	} else if (FontSize == 8 ) { // larger (cf 3)
		FontSize = 4;
	}
	FontSize = Math.round(FontSize * Mult);
//	if (FontSize > 7 ) {
//		FontSize = 7;
//	} else if (FontSize < 1) {
//		FontSize = 1;
//	}
	return sizes[FontSize - 1];
}

function createCookie(name,value,days) { // A.
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}


function readCookie(name) { // B.
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

function setStyleSizeInit () { // C.
	var cookie = readCookie("Increment");
	var Inc = cookie ? cookie : 0;
	setStyleSize(Inc);
}

if (typeof Inits == "object") { // eShopHost standard Array for multiple initialisations on a page
	Inits.push (setStyleSizeInit);
} else {
	window.onload = setStyleSizeInit;
}
//window.onload = function (e) { // C.
//	var cookie = readCookie("Increment");
//	var Inc = cookie ? cookie : 0;
//	setStyleSize(Inc);
//}

window.onunload = function(e) { // D.
  createCookie("Increment", Increment, 365);
};

