
var PlatFork = {

	version: 200811080945,

	platform: {
		code: null,
		version: null,
		language: null,
		cookies: null,
		java: null,
		flash: null
	},

	enviroment: {
		session: null,
		language: null
	},

	init: function(jsdir, cssdir, ondetect, onfailure, session, language)
	{
		var intern = PlatFork.intern;
		var cfg = intern.cfg;

		cfg.jsdir = jsdir;
		cfg.cssdir = cssdir;
		cfg.ondetect = ondetect;
		cfg.onfailure = onfailure;

		PlatFork.enviroment.session = session;
		PlatFork.enviroment.language = cfg.lc = language;

		intern.process = { func:null, codes:null }
		intern.loadCSS(intern.cfg.jsdir +'platfork/PlatFork.css');
		intern.loadJS(intern.cfg.jsdir +'platfork/messages.js');
		intern.loadJS(intern.cfg.jsdir +'platfork/drivers.js');
	},

	load: function(fns)
	{
		var intern = PlatFork.intern;

		var batch = intern.createBatch(fns);
		
		if(intern.process){
			intern.batches.push(batch);
		}else{
			intern.process = batch;
			PlatFork.next();
		}
	},

	next: function()
	{
		var intern = PlatFork.intern;

		var proc, code, fn;

		proc = intern.process;
		code = PlatFork.platform.code;

		if(!(
			(proc.cmnCSS.length) ||
			(proc.pltCSS.length && code) ||
			(proc.cmnJS.length) ||
			(proc.pltJS.length)
			)){
			if(intern.batches.length){
				intern.process = intern.batches.shift();
				proc = intern.process;
			}else{
				intern.process = null;
				return;
			}
		}

		while(proc.cmnCSS.length){
			intern.loadCSS(proc.cmnCSS.shift());
		}

		while(proc.pltCSS.length && code){
			fn = proc.pltCSS.shift();
			intern.loadCSS(fn.replace('%', code));
		}

		if(proc.cmnJS.length){

			intern.loadJS(proc.cmnJS.shift());

		}else if(proc.pltJS.length && code){

			fn = proc.pltJS.shift();
			intern.loadJS(fn.replace('%', code));
		}
	},

	detected: function(codes)
	{
		PlatFork.detected.codes = codes;
		return (codes.indexOf(PlatFork.platform.code) != -1) ? true : false;
	},

	requires: function(forcentry)
	{
		var codes = PlatFork.detected.codes;
		PlatFork.intern.driverTable(codes, true, forcentry, false);
	},

	message: function(name, choices/*, ... choices*/)
	{
		var intern = PlatFork.intern;
		var lc, msg, ttl, txt, rpl, fms;
		var length, i, chs, chi, rgx;

		lc = intern.lc();
		msg = intern.messages[name][lc];
		ttl = msg[0];
		txt = msg[1];
		rpl = msg[2];

		fms = intern.messages.cfg['fmsMsg'];
		chs = PlatFork.message.ellipsis(1);
		if(chs && rpl){
			length = Math.min(chs.length, rpl.length);
			i = 0;
			while(i < length){
				chi = chs[i];
				txt = txt.replace(new RegExp('%'+i, 'g'), rpl[i][chi]);
				i++;
			}
		}
		fms = fms.replace('%TITLE%', ttl);
		txt = txt.replace(/\n/g, '<BR>');
		fms = fms.replace('%CONTENT%', txt);

		document.write(fms);
	},

	forcentryResetLink: function()
	{
		var intern = PlatFork.intern;
		var code, lc, tlbl, pc, label;
		
		code = intern.cookie('forcentry');
		if(!code){ document.write('&nbsp;'); return; }

		lc = intern.lc();
		tlbl = intern.messages.drvtblbl[lc];
		pc = intern.parseCode(code);

		label = tlbl[5] +' '+ tlbl[3] +' '+ tlbl[4] +': '+ pc.system +' '+ pc.browser +' '+ pc.version;

		document.write('<A class="pf" onclick="PlatFork.intern.dropforce()" href="">'+ label +'</A>');
	},

	intern: {

		cfg: {
			lc: null,
			jsdir: '',
			cssdir: '',
			ondetect: null,
			onfailure: null
		},

		lc: function()
		{
			var pf = PlatFork.platform;
			var intern = PlatFork.intern;
			var cfg = intern.cfg;
			var msg = intern.messages;

			var lc;

			while(!cfg.lc){
				if(lc = pf.language){
					lc = lc.substr(0,2);
					if(msg.cfg.lcs.indexOf(lc) != -1){
						cfg.lc = lc;
						break;
					}
				}
				cfg.lc = msg.cfg.lcs.substr(0,2);
			}
			return cfg.lc;
		},

		loadJS: function(url)
		{
			document.write('<SCRIPT src="'+ url +'" language="JavaScript" type="text/javascript"><\/SCRIPT>');
		},

		loadCSS: function(url)
		{
			document.write('<LINK href="'+ url +'" rel="styleSheet" type="text/css">');
		},

		drivers: null,

		messages: null,

		process: null,
		batches: [],

		createBatch: function(fns)
		{
			var intern = PlatFork.intern;
			var cfg = intern.cfg;

			var length, i, fn, b_cmn, b_css, b_ldn, dn;
			var queue, cmnCSS=[], cmnJS=[], pltCSS=[], pltJS=[];

			fns = fns.split(',');
			length = fns.length;
			i = 0;
			while(i < length){

				fn = fns[i];

				b_cmn = (fn.indexOf('%') == -1) ? true : false;
				b_css = (fn.substr(fn.lastIndexOf('.') + 1) == 'css') ? true : false;
				b_ldn = ((fn.charAt(0) != '/') && (fn.substr(0,4) != 'http')) ? true : false;

				queue = (b_cmn) ? ((b_css) ? cmnCSS : cmnJS) : ((b_css) ? pltCSS : pltJS);
				dn = (b_ldn) ? ((b_css) ? cfg.cssdir : cfg.jsdir) : '';
				queue.push(dn + fn);
				i++;
			}

			return {
				cmnCSS: cmnCSS,
				cmnJS: cmnJS,
				pltCSS: pltCSS,
				pltJS: pltJS
			}
		},

		detectNext: function()
		{
			var intern = PlatFork.intern;
			var cfg = intern.cfg;

			var platform, detect_call, fn, code, pc;

			function processBatches()
			{
				var intern = PlatFork.intern;

				if(intern.batches.length){
					intern.process = intern.batches.shift();
					PlatFork.next();
				}else{
					intern.process = null;
				}
			}

			if(!intern.process.func){//(0)

				if(code = intern.cookie('forcentry')){
					pc = intern.parseCode(code);

					PlatFork.platform = {
						code: pc.code,
						version: pc.version,
						language: intern.lc(),
						cookies: 1,
						java: 1,
						flash: Flash(9,0,124,0)
					}
					processBatches();
					return;
				}

				intern.process.codes = intern.drivers.codes.split(',');

			}else{//(1)
				detect_call = eval(intern.process.func);

				if(platform = detect_call()){//(2)

					PlatFork.platform = platform;

					if(cfg.ondetect){ cfg.ondetect(); }

					processBatches();

					return;
				}
			}

			if(intern.process.codes.length){

				intern.process.func = 'detect_'+ intern.process.codes.shift();
				fn = intern.cfg.jsdir +'platfork/'+ intern.process.func +'.js';
				intern.loadJS(fn);
				
			}else{

				if(intern.cfg.onfailure){
					intern.cfg.onfailure();
				}

				processBatches();
			}
			/*
			0	first call to detectNext, at the end of drivers.js;
				no detect func/file name was set/loaded
			1	a detect file finished loading, prepare to ake detect call
			2	a platform has been detected; set facts where they belong;
				continue with loading user scripts and exit.
			*/
		},

		driverTable: function(codes, download, forcentry, bret)
		{
			var intern = PlatFork.intern;
			var lc, tlbl, drv, lut, ps;
			var buffer, length, i, pc;

			lc = intern.lc();
			tlbl = intern.messages.drvtblbl[lc];
			drv = intern.drivers;
			lut = drv.lookup;


			buffer = ''
			+'<TABLE class="pftbl" width=400 cellspacing=0 cellpadding=0 border=0>\n'
			+'<TR>\n'
			+'<TH class="pftbl">'+ tlbl[0] +'</TH>\n'
			+'<TH class="pftbl">'+ tlbl[1] +'</TH>\n'
			+((download) ? ('<TH class="pftbl">'+ tlbl[2] +'</TH>\n') : '')
			+((forcentry) ? ('<TH class="pftbl">'+ tlbl[3] +'</TH>\n') : '')
			+'</TR>\n';

			ps = '';
			if(!codes){ codes = drv.codes; }
			codes = codes.split(',');
			length = codes.length;
			i = 0;
			while(i < length){

				pc = intern.parseCode(codes[i]);

				buffer += ''
				+'<TR>\n'
				+'<TD class="pftbl">'+ ((pc.os != ps) ? pc.system : '&nbsp;') +'</TD>\n'
				+'<TD class="pftbl">'+ pc.browser +' '+ pc.version +'</TD>\n'
				+((download) ? ('<TD class="pftbl"><a class="pf" href="'+ pc.dnldurl +'" target="_blank">download</a></TD>\n') : '')
				+((forcentry) ? ('<TD class="pftbl"><a class="pf" onclick="PlatFork.intern.forcentry(\''+ pc.code +'\')" href="">'+ tlbl[4] +'</a></TD>\n') : '')
				+'</TR>\n';

				ps = pc.os;

				i++;
			}

			buffer += ''
			+'</TABLE>\n';


			if(bret){
				return buffer;
			}else{
				document.write(buffer);
			}
		},

		forcentry: function(code)
		{
			var intern = PlatFork.intern;
			intern.cookie('forcentry', code);
		},
		
		dropforce: function()
		{
			var intern = PlatFork.intern;
			intern.cookie(null, 'forcentry');
		},
		
		parseCode: function(code)
		{
			var intern = PlatFork.intern;

			if(!intern.parseCode.cache){ intern.parseCode.cache = { } }
			if(!intern.parseCode.cache[code]){

				var drv, lut, os, bw, vs;
				var system, browser, dnldurl;

				drv = intern.drivers;
				lut = drv.lookup;

				os = code.charAt(0);
				bw = code.substr(1,2);
				vs = parseInt((code.charAt(3) != '0') ? code.substr(3) : code.substr(4));

				system = lut.osystem[os];
				browser = lut.browser[bw][0];
				dnldurl = lut.browser[bw][1];

				intern.parseCode.cache[code] = {
					code:code,
					os:os,
					bw:bw,
					vs:vs,
					system:system,
					browser:browser,
					version:vs,
					dnldurl:dnldurl
				}
			}

			return intern.parseCode.cache[code];
		},

		cookie: function(n, v)
		{
			function get(n)
			{
				var lines, length, i, parts, nvp;

				lines = document.cookie.split('; ');
				length = lines.length;
				i = 0;
				while(i < length){
					parts = lines[i].split(';');
					nvp = parts[0].split('=');
					if(nvp[0] == n){ return nvp[1]; }
					i++;
				}
				return null;
			}

			if(n){
				if(v == null){
					return get(n);
				}else{
					document.cookie = n +'='+ v;
				}
			}else{
				if(v){
					var d;
					n = v;
					v = get(n);
					d = new Date();
					document.cookie = n +'='+ v +'; expires=' + d.toGMTString();
				}else{
					document.write('document.cookie = \''+ document.cookie +'\'<BR>');
				}
			}
		},

		navigator: function()
		{
			document.write('<PRE>'
			+'appCodeName     = '+ navigator.appCodeName +'\n'
			+'appMinorVersion = '+ navigator.appMinorVersion +'\n'
			+'appName         = '+ navigator.appName +'\n'
			+'appVersion      = '+ navigator.appVersion +'\n'
			+'cookieEnabled   = '+ navigator.cookieEnabled +'\n'
			+'language        = '+ navigator.language +'\n'
			+'mimeTypes       = '+ navigator.mimeTypes +'\n'
			+'onLine          = '+ navigator.onLine +'\n'
			+'oscpu           = '+ navigator.oscpu +'\n'
			+'platform        = '+ navigator.platform +'\n'
			+'plugins         = '+ navigator.plugins +'\n'
			+'product         = '+ navigator.product +'\n'
			+'productSub      = '+ navigator.productSub +'\n'
			+'securityPolicy  = '+ navigator.securityPolicy +'\n'
			+'systemLanguage  = '+ navigator.systemLanguage +'\n'
			+'userAgent       = '+ navigator.userAgent +'\n'
			+'userLanguage    = '+ navigator.userLanguage +'\n'
			+'userProfile     = '+ navigator.userProfile +'\n'
			+'vendor          = '+ navigator.vendor +'\n'
			+'vendorSub       = '+ navigator.vendorSub +'\n'
			+'preference      = '+ navigator.preference +'\n'
			+'javaEnabled     = '+ navigator.javaEnabled() +'\n'
//			+'taintEnabled    = '+ navigator.taintEnabled() +'\n'
			+'<PRE>');
		}
	}
}



function Flash(maj, min, rev, bld)
{
	function INSTANCE(maj, min, rev, bld)
	{
		this.maj = parseInt(maj);
		this.min = parseInt(min);
		this.rev = parseInt(rev);
		this.bld = parseInt(bld);

		this._float = function()
		{
			return parseFloat(maj +'.'+ min);
		}

		this._string = function(sep)
		{
			return maj +','+ min +','+ rev +','+ bld;
		}

		this.isLessThan = function(flash)
		{
			if(maj < flash.maj){
				return true;
			}else if(maj == flash.maj){
				if(min < flash.min){
					return true;
				}else if(min == flash.min){
					if(rev < flash.rev){
						return true;
					}else if(rev == flash.rev){
						if(bld < flash.bld){
							return true;
						}
					}
				}
			}

			return false;
		}
	}

	return new INSTANCE(maj, min, rev, bld);
}
