
//	====================================================================================================
//	...oak.js - javascript functions for the oak v3.6java - engine...
//		-	(c)2004 by Glimage - written by J.C.Valks
//	====================================================================================================

//	...create the property 'document.oak'...
	document.oak=new Object();

//	...define the object 'oak'...
	var oak=document.oak;

//	...define the object 'forest'...
	var forest=document.parentWindow.top.document.oak;

//	----------------------------------------------------------------------------------------------------
//	...function: 'init' - initializes 'oak'...
//	----------------------------------------------------------------------------------------------------
	init=function() {for (var id in oak) if (oak[id].init) oak[id].init()}

//	----------------------------------------------------------------------------------------------------
//	...function: 'kill' - kills 'oak'...
//	----------------------------------------------------------------------------------------------------
	kill=function() {for (var id in oak) if (oak[id].kill) oak[id].kill()}

//	----------------------------------------------------------------------------------------------------
//	...function 'ALL'...
//	----------------------------------------------------------------------------------------------------
	ALL=function(object) {
		var i=1;
		while (object&&(i<arguments.length)) object=object[arguments[i++]]
		return object
	}

//	----------------------------------------------------------------------------------------------------
//	...function 'NEW'...
//	----------------------------------------------------------------------------------------------------
	NEW=function(object) {
  		var i=1;
		while (object&&(i+1<arguments.length)) object=object[arguments[i++]]
		if (object) {return object[arguments[i]]=new Object()} else return new Object()
	}

//	----------------------------------------------------------------------------------------------------
//	...function 'forcedNEW'...
//	----------------------------------------------------------------------------------------------------
	forcedNEW=function(object) {
		var i=1;
		while (object&&(i+1<arguments.length)) object=object[arguments[i++]]
		if (object) {return object[arguments[i]]=new Object()} else return new Object()
	}

//	----------------------------------------------------------------------------------------------------
//	...function 'VAR'...
//	----------------------------------------------------------------------------------------------------
	VAR=function(object) {
		var i=1;
		while (object&&(i+2<arguments.length)) object=object[arguments[i++]]
		if (object) return object[arguments[i++]]=arguments[i]
	}

//	----------------------------------------------------------------------------------------------------
//	...function 'forcedVAR'...
//	----------------------------------------------------------------------------------------------------
	forcedVAR=function(object) {
		var i=1;
		while (object&&(i+2<arguments.length)) object=object[arguments[i]]?object[arguments[i++]]:object[arguments[i++]]=new Object();
		if (object) return object[arguments[i++]]=arguments[i]
	}

//	----------------------------------------------------------------------------------------------------
//	...function 'DELETE'...
//	----------------------------------------------------------------------------------------------------
	DELETE=function(object) {
		var i=1;
		while (object&&(i+2<arguments.length)) object=object[arguments[i++]]
		if (object) delete(object[arguments[i]])
	}

//	----------------------------------------------------------------------------------------------------
//	...function 'format' - formats a text...
//	----------------------------------------------------------------------------------------------------
//	...formats a string using a filter and braced variables...
//	...braced variables...
//	'...{name}...' or '...{name:filter#1,filter#2,...}...'...
//		o	*pattern - use pattern to fill variable, starting right - ignore pattern if exceeds...
//		o	pattern* - use pattern to fill variable, starting left - ignore pattern if exceeds...
//		o	|pattern - use pattern to fill variable, starting right - cut value if exceeds...
//		o	pattern| - use pattern to fill variable, starting right - cut value if exceeds...
//		o	Car$ - convert value to cardinal text...
//		o	Ord$ - convert value to ordinal text...
//		o	Ord - convert value to ordinal number...
//		o	lowerCase - convert value to lowerCase...
//		o	upperCase - convert value to upperCase...
//		o	Year - convert value to Year...
//		o	Month - convert value to Month...
//		o	Day - convert value to Day...
//		o	Day_week - convert value to Day_week...
//		o	Week - convert value to Week...
//		o	Day_week$ - convert value to Day_week$...
//		o	Hours12 - convert value to Hours12...
//		o	xM - convert value to xM...
//		o	Hours - convert value to Hours...
//		o	Minutes - convert value to Minutes...
//		o	Seconds - convert value to Seconds...
//		o	'style' - convert value to language style...
//			- date - 14-10-1939...
//			- date.Fixed - 01-01-1984...
//			- date.Month$ - 1 May 1984...
//			- date.Day&Month$ - Seven October 2003...
//			- date.Full$ - Monday, Oktober 11th 2004...
//			- time.12h - 12:34pm...
//			- time.24h - 23:12...
//			- time.12hs - 1:21,39am...
//			- time.24hs - 6:34,12...
//			- date&time - Monday, Oktober 11th 2004 6:34,12...
//	...the filter...
//	'filter#1,filter#2,...¦...' where folowing filters are allowed:
//		LINE(S) - convert lines to upperCase...
//		o	LINE(S) - only one line...
//		o	LINE(S)* - all lines...
//		o	LINE(S)n - only the first n lines...
//		WORD(S) - convert words to upperCase...
//		o	WORD(S) - only one word...
//		o	WORD(S)* - all words...
//		o	WORD(S)n - only the first n words...
//		x2y - convert words 'x' to 'y'...
//		o	x=text - use only words in lowerCase...
//		o	x=Text - use only words starting with upperCase the rest lowerCase...
//		o	x=TExt - use only words containg upperCase and lowerCase, but starting with upperCase... 
//		o	x=tEXt - use only words containg upperCase and lowerCase, but starting with lowerCase... 
//		o	x=TEXT - use only words in upperCase...
//		o	y=text - convert to wors in lowerCase...
//		o	y=Text - convert to words starting with upperCase the rest lowerCase...
//		o	y=TEXT - convert to words in upperCase...
//	Line(s) - convert line such that they start with upperCase...

//	...function 'format' - formats a text...
	format=function(text,object) {
		var language=ALL(forest,'language');
		if (!language) {
			language=newLanguage();
			language.set('english');
		}
		var RE=/{(\w+):?([^}]*)}/;
		while (RE.test(text)) {
			var value=String(object[RegExp.$1]),args=RegExp.$2.split(','),l;
			for (var i in args) {
				var arg=args[i];
				var date,time;if (value) {date=dayse2date(value);time=dayse2time(value)}
				value=String(value);
				if (/^\*([^*|]+)$/.test(arg)) if ((l=RegExp.$1.length-value.length)>0) value=RegExp.$1.substr(0,l)+value
				if (/^([^*|]+)\*$/.test(arg)) if (RegExp.$1.length-value.length>0) value=value+RegExp.$1.substr(value.length)
				if (/^\|([^*|]+)$/.test(arg)) value=(l=RegExp.$1.length-value.length)>0?RegExp.$1.substr(0,l)+value:value.substr(-l)
				if (/^([^*|]+)\|$/.test(arg)) value=RegExp.$1.length-value.length>0?value+RegExp.$1.substr(value.length):value.substr(0,RegExp.$1.length)
				if (arg=='Car$') value=language.Cardinal$(value);
				if (arg=='Ord$') value=language.Ordinal$(value);
				if (arg=='Ord') value=language.Ordinal(value);
				if (arg=='lowerCase') value=value.toLowerCase();
				if (arg=='upperCase') value=value.toUpperCase();
				if (date&&time) {
					if (arg=='Year') value=date.year;
					if (arg=='Month') value=date.month;
					if (arg=='Day') value=date.day;
					if (arg=='Day_week') value=date.day_week;
					if (arg=='Week') value=date.week_year;
					if (arg=='Month$') value=language.Month$(date.month);
					if (arg=='Day_week$') value=language.Day$(date.day_week);
					if (arg=='Hours12') value=time.hours12;
					if (arg=='xM') value=time.xM;
					if (arg=='Hours') value=time.hours;
					if (arg=='Minutes') value=time.minutes;
					if (arg=='Seconds') value=time.seconds;
					var Style$;
					if (Style$=language.Style$(arg)) value=format(Style$,{dt:value})
				}
			}
			text=text.replace(RE,value)
		}
		if (/^(([^:]+)::)?(.*)/.test(text)) {
			var args=RegExp.$2.split(','),text=RegExp.$3;
			for (var i in args) {
				var arg=args[i];
				if (/^WORDS([*2-9]|[1-9][0-9]*)?$/.test(arg)) text=text.replace(RegExp('([^\\s]+\\s*)$'.replace('$',(c=RegExp.$1)>0?'{$}'.replace('$',c):c)),function($) {return $.toUpperCase()});
				if (/^LINES([*2-9]|[1-9][0-9]*)?$/.test(arg)) text=text.replace(RegExp('^(([.!?¡¿]?[^.!?¡¿\\s]+\\s*)*[.!?¡¿]\\s*)$'.replace('$',(c=RegExp.$1)>0?'{$}'.replace('$',c):c)),function($) {return $.toUpperCase()});
				if (/^Lines$/.test(arg)) text=text.replace(/([.!?¡¿]?[^.!?¡¿\s]+\s*)*[.!?¡¿]\s*/g,function($){return $.substr(0,1).toUpperCase()+$.substr(1)});
				if (/^(text|Text|TExt|tEXt|TEXT)2(text|Text|TEXT)$/.test(arg))
					text=text.replace(
						{text:/(^[a-z]|\s[a-z])([a-z]*)/g,Text:/(^[A-Z]|\s[A-Z])([a-z]*)/g,TExt:/(^[A-Z]|\s[A-Z])([a-z]*[A-Z]+[a-zA-Z]*)/g,tEXt:/(^[a-z]|\s[a-z])([a-z]*[A-Z]+[a-zA-Z]*)/g,TEXT:/(^[A-Z]|\s[A-Z])([A-Z]*)/g}[RegExp.$1],
						{text:function($){return $.toLowerCase()},Text:function($,$1,$2){return $1.toUpperCase()+$2.toLowerCase()},TEXT:function($){return $.toUpperCase()}}[RegExp.$2]
					)
			}
		}
		return text;
	}

//	----------------------------------------------------------------------------------------------------
//	...function 'expand' - expands a text using a format$...
//	----------------------------------------------------------------------------------------------------
	expand=function(format$,text) {
		var values=RegExp(format$.replace(/{\w+}/g,"(\\w+)")).exec(text);
		var names=RegExp(format$.replace(/{\w+}/g,"{(\\w+)}")).exec(format$);
		var object=new Object();
		if (values) for (var i=1;i<names.length;i++) object[names[i]]=values[i];
		return object;
	}

