
//	====================================================================================================
//	...oakObject.js - additional javascript functions for oak v3.6java...
//		-	(c)2004 by Glimage - written by J.C.Valks
//	====================================================================================================

//	====================================================================================================
//	...function 'newEvent' - returns the event-object...
//	====================================================================================================
	newEvent=function() {
	//	...create the local object...
		var _=new Object();
	//	...method 'init'...
		_.init=function() {
		//	...add reload-object to document...
			document.oak.event=this;
		//	...run through data...
			var delay=0;
			for (var id in this.data) {
				delay+=this.data[id].time;
				window.setTimeout(this.data[id].action,delay);
			}
		}
	//	...return the object...
		return _
	}

//	====================================================================================================
//	...function 'newReload' - returns the reload-object...
//	====================================================================================================
	newReload=function(location,delay) {
	//	...create the local object...
		var _=new Object();
	//	...property 'location' 'delay'...
		_.location=location;
		_.delay=delay;
	//	...method 'init'...
		_.init=function() {
		//	...add reload-object to document...
			document.oak.reload=this;
		//	...install the reload-engine...
			window.setTimeout(reload,this.delay);
	  	//	...the reload function...
			function reload() {
			//	...overwrite location ...
				document.location=document.oak.reload.location;
			}
		}
	//	...return the object...
		return _
	}

//	====================================================================================================
//	...function 'newClock' - returns the clock-object...
//	====================================================================================================
	newClock=function(elementName,format$) {
	//	...create the local object...
		var _=new Object();
	//	...property 'elementName' 'format$'...
		_.elementName=elementName;
		_.format$=format$;
	//	...method 'init'...
		_.init=function() {
		//	...add clock-object to document...
			document.oak.clock=this;
		//	...install the clock-engine...
			window.setInterval(step,1000);
	  	//	...the step function...
			function step() {
			//	...write clock to element...
				writeHTML(document.oak.clock.elementName,format(document.oak.clock.format$,{dayse:dt2dayse()}));
			}
		}
	//	...return the object...
		return _
	}

//	----------------------------------------------------------------------------------------------------
//	...function: 'newMenu' - returns the menu-object...
//	----------------------------------------------------------------------------------------------------
	function newMenu(elementName) {
	//	...create object...
		var _=new Object();
	//	...property 'elementName'...
		_.elementName=elementName;
	//	...method 'init'...
		_.init=function() {
			this.update()
		}
	//	...method 'update'...
		_.update=function() {
			writeHTML(this.elementName,this.menu2HTML());
		}
	//	...method 'menu2HTML'...
		_.menu2HTML=function() {
		//	...create HTML...
			var aMenu=new Array();
		//	...define menu'...
			var menu=ALL(this,'data','menu');
		//	...run through menu...
			for (var ID in menu) {
				var item=menu[ID];
				if (typeof(item)=='string') aMenu[aMenu.length]=item;
				if (typeof(item)=='object') {
					var id=item.id||ALL(this,'data','id'),target=item.target||ALL(this,'data','target'),attr=item.attr,A=newA();
					for (var i in attr) A.attr.push(i,attr[i])
					if (id) A.attr.push('id',format('{id}~{ID}',{id:id,ID:ID}));
					A.attr.push('target',target);
					for (var i in attr) A.attr.push(i,attr[i])
					if (item.href) A.attr.push('href',item.href);
					A.$+=item.text||ID;
					aMenu[aMenu.length]=A
				}
			}
		//	...return HTML...
			return aMenu.join(' ');
		}
	//	...return object...
		return _
	}

//	----------------------------------------------------------------------------------------------------
//	...function: 'newFrame' - returns the frame-object...
//	----------------------------------------------------------------------------------------------------
	function newFrame(elementName,frameName,location) {
	//	...create object...
		var _=new Object();
	//	...property 'elementName' - 'frameName' - 'location'...
		_.elementName=elementName;
		_.frameName=frameName;
		_.location=location;
	//	...method 'init'...
		_.init=function() {
			var FRAME=newFRAME();
			FRAME.attr.push('name',this.frameName);
			FRAME.attr.push('scrolling','no');
			FRAME.attr.push('frameBorder','no');
			writeHTML(this.elementName,FRAME);
			this.load();
		}
	//	...method 'load'...
		_.load=function(location) {
			if (!location||this.location!=location) {
				if (location) this.location=location;
				var frameDocument=ALL(document.frames,this.frameName,'document');
				if (frameDocument) frameDocument.location=this.location
			}
		}
	//	...return object...
		return _
	}

//	====================================================================================================
//	...function 'newSmooth' - returns the smooth-object...
//	====================================================================================================
	newSmooth=function(interval) {
	//	...create new object...
		var _=new Object();
	//	...property 'interval'...
		_.interval=interval;
	//	...propery 'elements' - contains the active document-elements for the smooth-engine...
		_.elements=new Object();
	//	...property 'data' - contains the id of document-elements that activate the smooth-engine...
		_.data=new Object();
	//	...method 'init'...
		_.init=function() {
		//	...add smooth-object to the document...
			document.oak.smooth=this;
		//	...install the mouse-over handler...
			document.onmouseover=mouseover;
		//	...install the mouse-over handler...
			document.onmouseout=mouseout;
		//	...install the smooth-engine...
			window.setInterval(step,this.interval);
		//	...the mouse-over function...
			function mouseover() {
				document.oak.smooth.addElement(ALL(event,'srcElement','id'),0);
			}
		//	...the mouse-over function...
			function mouseout() {
				document.oak.smooth.addElement(ALL(event,'srcElement','id'),1);
			}
	  	//	...the step function...
			function step() {
				document.oak.smooth.step()
			}
		}
	//	...method 'step'...
		_.step=function() {
		//	...run through all active elements...
			for (var id in this.elements) {
			//	...smooth-path finished?...
				if (this.elements[id].n==0) {
				//	...remove element if blured...
					if (this.elements[id].F==1) delete(this.elements[id])
				} else with (this.elements[id]) {
				//	...do next step The magical formula!!!!...
					n--;F+=H-G-b;G+=3*b-2*H;H-=3*b;
				//	...smooth-path finished; modify 'F'...
					if (n==0) F=-1&(1.9*F);//(F<0.5)?0:1;
				//	...find $id...
					var $id=this.elements[id].$id;
				//	...find element...
					var element=document.all[id];
				//	...find 'Blur' and 'Focus'...
					var Blur=ALL(this.data,$id,'Blur');
					var Focus=ALL(this.data,$id,'Focus');
				//	...'element', 'Blur' and 'Focus' exists? --> run through 'Blur' and 'Focus'...
					if (element&&Blur&&Focus) for (var id in Blur) if (Focus[id]) {
					//	...check element.length; in case defined, then more document-elements with same name!...
						if (element.length) {
						//	...modify all document-elements...
							var i=element.length;
							while (i-->0) element[i].style[id]=this.mix(F,Blur[id],Focus[id])
						} else
						//	...single element...
							element.style[id]=this.mix(F,Blur[id],Focus[id])
					}
				}
			}
		}
		_.mix=function(F,Blur,Focus) {
		//	...split the style for 'Blur' and 'Focus' using numbers as seperator...
			var tBlur=Blur.split(/[0-9]+/);
			var tFocus=Focus.split(/[0-9]+/);
		//	...same style for 'Blur' and 'Focus'?...
			if (tBlur.join('')==tFocus.join('')) {
			//	...split the style for 'Blur' and 'Focus' using numbers only...
				var nBlur=Blur.match(/[0-9]+/g);
				var nFocus=Focus.match(/[0-9]+/g);
			//	...create 'Mix'...
				var Mix=new Array();
				k=(tBlur.length==nBlur.length)?1:0;
				F=(F<0)?0:(F>1)?1:F;
				for (var i in tBlur) Mix[2*i+k]=tBlur[i]
				for (var i in nBlur) Mix[2*i+1-k]=-1&(F*nBlur[i]+(1-F)*nFocus[i]);
			//	...return 'Mix'...
				return Mix.join('')
			} else return (F<0.5)?Focus:Blur
		}
		_.addElement=function(id,_F) {
		//	...define local variables...
			var $id,RE=/^([^~]*)~/;
		//	...split the id...
			if (RE.test(id)) $id=RegExp.$1;
		//	..style is defined?...
			if (this.data[$id]) {
				var _n=-1&(ALL(this.data,$id,(_F>0.5)?'toBlur':'toFocus')||200)/this.interval;
				if (!this.elements[id]) this.elements[id]={n:0,F:1,G:0,H:0,b:0,'$id':$id}
				with (this.elements[id]) {n=_n;H=(2*n*G-3*(F-_F))/(n*n);b=(n*G-2*(F-_F))/(n*n*n)}
			}
		}
	//	...return the object...
		return _;
	}

//	====================================================================================================
//	...function 'newLanguage' - returns the language-object...
//	====================================================================================================
	newLanguage=function() {
	//	...find language-object in parent...
		var _=ALL(document.parentWindow.top.document,'oak','language');
	//	...return parental object - if found...
		if (_) {return document.oak.language=_}
	//	...create new object...
		var _=new Object();
	//	...property 'data' - information about languages...
		_.data={
        	english:{
        		Month$:'January,February,March,April,May,June,July,August,September,October,November,December'.split(','),
        		Day$:'Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday'.split(','),
        		Cardinal$:'Zero,One,Two,Three,Four,Five,Six,Seven,Eight,Nine'.split(','),
        		Ordinal$:'Zeroth,First,Second,Third,Fourth,Fifth,Sixth,Seventh,Eighth,Ninth'.split(','),
        		Ordinal:{'^0$':'th','[^123]$':'th','1$':'st','2$':'nd','3$':'rd','':'th'}
        	},
        	dutch:{
        		Month$:'Januari,Februari,Maart,April,Mei,Juni,Juli,Augustus,September,Oktober,November,December'.split(','),
        		Day$:'Maandag,Dinsdag,Woensdag,Donderdag,Vrijdag,Zaterdag,Zondag'.split(','),
        		Cardinal$:'Nul,Eén,Twee,Drie,Vier,Vijf,Zes,Zeven,Acht,Negen'.split(','),
        		Ordinal$:'Nulde,Eerste,Tweede,Derde,Vierde,Vijfde,Zesde,Zevende,Achtste,Negende'.split(','),
        		Ordinal:{'^[^18]$':'de','0[^018]$':'de','1[0-9]$':'de','':'ste'}
        	},
        	french:{
        		Month$:'Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Aoűt,Septembre,Octobre,Novembre,Décembre'.split(','),
        		Day$:'Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche'.split(','),
        		Cardinal$:'Zéro,Un,Deux,Trois,Quatre,Cinq,Six,Sept,Huit,Neuf'.split(','),
        		Ordinal$:'Zéro,Premiers,Deuxičmes,Troisičmes,Quatričmes,Cinquičmes,Sixičmes,Septičmes,Huitičmes,Neuvičmes'.split(','),
        		Ordinal:{'':'o'}
        	},
        	german:{
        		Month$:'Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember'.split(','),
        		Day$:'Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag'.split(','),
        		Cardinal$:'Null,Eins,Zwei,Drei,Vier,Fünf,Sechs,Sieben,Acht,Neun'.split(','),
        		Ordinal$:'Nullte,Ersten,Zweite,Dritte,Vierte,Fünfte,Sechste,Siebte,Achte,Neunte'.split(','),
        		Ordinal:{'^1?[0-9]$':'te','':'ste'}
        	},
        	italian:{
        		Month$:'Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre'.split(','),
        		Day$:'Lunedě,Martedě,Mercoledě,Giovedě,Venerdě,Sabato,Domenica'.split(','),
        		Cardinal$:'Zero,Uno,Due,Tre,Quattro,Cinque,Sei,Sette,Otto,Nove'.split(','),
        		Ordinal$:'Zero,Primi,Secondi,Terzi,Quarti,Quinti,Sesti,Settimi,Ottavi,Noni'.split(','),
        		Ordinal:{'':'o'}
        	},
        	portuguese:{
        		Month$:'Janeiro,Fevereiro,Março,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro'.split(','),
        		Day$:'Segunda-feira,Terça-feira,Quarta-feira,Quinta-feira,Sexta-feira,Sábado,Domingo'.split(','),
        		Cardinal$:'Zero,Um,Dois,Tręs,Quatro,Cinco,Seis,Sete,Oito,Nove'.split(','),
        		Ordinal$:'Zero,Primeiros,Segundos,Terceiros,Quartos,Quintos,Sexto,Sétimos,Oitavo,Nono'.split(','),
        		Ordinal:{'':'o'}
        	},
        	spanish:{
        		Month$:'Enero,Febrero,Marcha,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre'.split(','),
        		Day$:'Lunes,Martes,Miércoles,Jueves,Viernes,Sábado,Domingo'.split(','),
        		Cardinal$:'Cero,Uno,Dos,Tres,Cuatro,Cinco,Seises,Siete,Ocho,Nueve'.split(','),
        		Ordinal$:'Cero,Primeros,Segundos,Terceros,Cuartos,Quintos,Sextos,Séptimos,Octavos,Novenos'.split(','),
        		Ordinal:{'':'o'}
        	}

/*        	danish:{
        		Month$:'Januar,Februar,Marts,April,Mĺ,Juni,Juli,August,September,Oktober,November,December',
        		Day$:'Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lřrdag,Sřndag',
        		Cardinal$:Array('Nulpunkt,Sig,To,Tretal,Fire,Fem,Seks,Syv,Otte,Ni').split(','),
        		Ordinal$:Array('').split(','),
        		Ordinal:{'':'?'}
        	},
        	finnish:{
        		Month$:'Tammikuu,Helmikuu,Marssia,Huhtikuu,Toukokuu,Kesäkuu,Heinäkuu,Korkea,Syyskuu,Lokakuu,Marraskuu,Joulukuu',
        		Day$:'Maanantai,Tiistai,Keskiviikko,Torstai,Perjantai,Lauantai,Pyhä',
        		Cardinal$:Array('Nollata,Ainoa,Kakkonen,Kolme,Neljä,Viisi,Kuusi,Seitsemän,Kahdeksan,Yhdeksikkö').split(','),
        		Ordinal$:Array('').split(','),
        		Ordinal:{'':'?'}
        	},
        	icelandic:{
        		Month$:'Janúar,Febrúar,Herganga,Apríl,Mega,Júní,Júlí,Tignarlegur,September,Október,Nóvember,Desember',
        		Day$:'Mánudagur,Ţriđjudagur,Miđvikudagur,Fimmtudagur,Föstudagur,Laugardagur,Sunnudagur',
        		Cardinal$:Array('Núll,Einn,Tveir,Ţrír,Fjórir,Fimm,Sex,Sjö,Átta,Níu').split(','),
        		Ordinal$:Array('').split(','),
        		Ordinal:{'':'?'}
        	},
        	norwegian:{
        		Month$:'Januar,Februar,Mars,Aprilmĺned,Mai,Juni,Juli,AugustmĺnedSeptember,IoktoberNovemberDecember',
        		Day$:'Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lřrdag,Sřndag',
        		Cardinal$:Array('Null,Ettall,To,Tre,Fire,Fem,Seks,Syv,Ĺtte,Ni').split(','),
        		Ordinal$:Array('').split(','),
        		Ordinal:{'':'?'}
        	},
        	swedish:{
        		Month$:'Januari,Februari,Marschen,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December',
        		Day$:'Mĺndagen,Tisdagen,Onsdagen,Torsdagen,Fredagen,Lördagen,Söndagen',
        		Cardinal$:Array('Noll,En,Tvĺ,Tre,Fyra,Fem,Sexa,Sjua,Ĺtta,Nio').split(','),
        		Ordinal$:Array('').split(','),
        		Ordinal:{'':'?'}
        	}
*/
        }
	//	...method 'init'...
		_.init=function() {forest.language=this}
	//	...
		_.select$=function() {
		}
	//	...several language methods...
		_.get=function() {return this.language}
		_.set=function(language) {return (this.data[language])?this.language=language:this.language}
		_.Month$=function(i) {return this.objectI$('Month$',i-1)||'?'}
		_.Day$=function(i) {return this.objectI$('Day$',i-1)||'?'}
		_.M$=function(i) {return this.objectI$('M$',i-1)||'?'}
		_.D$=function(i) {return this.objectI$('D$',i-1)||'?'}
		_.Style$=function(id) {return this.objectI$('Style$',id)}
		_.Cardinal$=function(n) {return this.objectI$('Cardinal$',n)||n}
		_.Ordinal$=function(n) {return this.objectI$('Ordinal$',n)||this.Ordinal(n)}
		_.Ordinal=function(n) {
			var n=String(n),appendix,Ordinal=this.object$('Ordinal')
			for (var pattern in Ordinal) if (RegExp(pattern).test(n)) {appendix=Ordinal[pattern];break}
			return appendix?n+appendix:n;
		}
		_.objectI$=function(name,I) {return ALL(this.data,this.language,name,I)}
		_.object$=function(name) {return ALL(this.data,this.language,name)}
	//	...return the object...
		return _;
	}


