﻿	function FontMgr(useCookie, expires, id){
		this.useCookie = useCookie && window.navigator.cookieEnabled;
		this.expires = expires || false;
		this.id	= id || 'font';
		this.font = new Object();
		this.fnodes = new Object();
	}
	
	FontMgr.prototype = {
		font_length:function(){
			var cnt = 0;
			for(var i in this.font)cnt++;
			return cnt;
		},
		
		fnodes_length:function(){
			var cnt=0;
			for(var i in this.fnodes)cnt++;
			return cnt;
		},

		put:function(className, tag, def, m, L, S, fnodes){
			if(!this.font[className])this.font[className] = new Object();
			this.font[className].className	= className;
			this.font[className].tag		= tag;
			this.font[className].def		= def;
			this.font[className].m			= m;
			this.font[className].L			= L;
			this.font[className].S = (S == 'auto') ? parseFloat(def) / (parseFloat(def) * L) : S;

			if(fnodes){
				this.fnodes[className] = fnodes; 
				return true;
			}

			var els = document.getElementsByTagName(tag);
			if(!els[0])return false;
			if(this.fnodes[className])this.fnodes[className] = null;
			this.fnodes[className] = new Array();
			for(var i=0; i<els.length; i++){
				var cn = els[i].className || els[i].getAttribute('class');
				var id = els[i].getAttribute('id');
				if(className != cn && className != id)continue;
				this.fnodes[className].push(els[i]);
			}
			this.chone('def', className);
		},
	
		load:function(){
			if(!this.font_length())return false;
			for(var className in this.font){
				var els = document.getElementsByTagName(this.font[className]['tag']);
				if(!els){alert('not loaded'); return false;}
				if(!this.fnodes[className]){this.fnodes[className] = new Array();}
				for(var i=0; i<els.length; i++){
					var cn = els[i].className || els[i].getAttribute('class');
					var id = els[i].getAttribute('id');
					if(className != cn && className != id)continue;
					this.fnodes[className].push(els[i]);
				}
			}

			if(!this.useCookie || !document.cookie){this.def(); return true;}
			var re = new RegExp(this.id+'=([^;]*)');
			re.exec(document.cookie);
			if(!RegExp.$1){this.def();return true;}
			aCookie = decodeURIComponent(RegExp.$1).split("\n");
			for(var i=0; i<aCookie.length; i++){
				aP = aCookie[i].split(',');
				this.font[aP[0]]['tag'] = aP[1];
				this.font[aP[0]]['current'] = aP[2];
			}
			this.ch('current');

		},
		
		save:function(){
			var aCookie = new Array();
			for(var cn in this.font){
				var aP = new Array();
				aP.push(cn);
				aP.push(this.font[cn]['tag']);
				aP.push(this.font[cn]['current']);
				
				aCookie.push(aP.join(','));
			}

			var strTo = this.id+'='+encodeURIComponent(aCookie.join("\n"))+';';
			if(this.expires)strTo += 'expires='+this.expires+';';
			document.cookie = strTo;
		},
		
		large:function(){this.ch('large');},
		small:function(){this.ch('small');},
		def:function(){this.ch('def');},
		
		chone:function (mode, className){
			switch(mode){
			case 'def':
				this.font[className].current = this.font[className].def + this.font[className].m;
				break;
			case 'large':
				var newSize = Math.floor(parseFloat(this.font[className].current)*this.font[className].L, 10);
				this.font[className].current = newSize + this.font[className].m;
				break;
			case 'small':
				var newSize = Math.ceil(parseFloat(this.font[className].current)*this.font[className].S, 10);
				this.font[className].current = newSize + this.font[className].m;
			default:
				break;
			}

			for(var i=0; i<this.fnodes[className].length; i++)
				this.fnodes[className][i].style.fontSize = this.font[className]['current'];
		},
		
		ch:function (mode){
			if(!this.fnodes_length())return false;

			for(var className in this.font)this.chone(mode, className);
			if(this.useCookie)this.save();
		}
	} 
