/* **** This file permanently resides at <http://mikaels.net/archives/public/application/javascript/ua/v3.3/ua.3_3_4_1.js>
  
 *	(C) Lars P M <larspeemm@netscape.net>

 * This script source file is *derivative* work upon the file located at
 * <http://devedge-temp.mozilla.org/toolbox/examples/2002/xb/ua/ua.js> WHICH IS LICENSED (MPL 1.1/GPL 2.0/LGPL 2.1)
 
 * This script version (3.3.4) was first published 2008-04-25. It corrects the navigator.prettyVersion for Safari 
 * (from version 3) while adding usable navigator.rversion numbers to all browsers. See
 * <http://mikaels.net/records/sitever3.3/strict/meta/ua/> for documentation.
 * The latest script version is named /ua.js/ and located in this directory.

 * The script should be safe with all known versions of JavaScript (1.0 and later). 
 * **** */

function getVersionLimit(sPV){
//NOTE: This function requires JS1.1
//deciding on the end of a version string
var L = new Array(';',')',' ','(');
   for (var l=0;l<4;l++){
    var q=L[l];
    if (sPV.indexOf(q) > -1){sPV=sPV.substring(0, sPV.indexOf(q))}
    }
return sPV;
}

function getVersion(sPV){
//NOTE: This function requires JS1.1
//deciding on the end of a version string
var L = new Array(';',')',' ','(');
   for (var l=0;l<4;l++){
    var q=L[l];
    if (sPV.indexOf(q) > -1){sPV=sPV.substring(0, sPV.indexOf(q))}
    }
//conversion from a version string to a numeric version
var Z = 0 , R = new Array('.','_',',','-');
   for (var j=0;j<4;j++){
    var x=R[j];
    if (sPV.indexOf(x) > -1){sPV=sPV.split(x);break}
    else sPV=sPV+'-'
    }
    	var exp     = 1;
   for (var k = 0; k < sPV.length; k++){
    var val = parseInt(sPV[k]);
    if (isNaN(val)) break;
    else {
      	Z += val / exp;
      	exp *= 100;
    	}
    	}
return Math.round(Z*1000000)/1000000;
}

function xbDetectBrowser()
{
  var rv ='', JScript ='', nVersion =0.01, sPVersion ='0.01', sPName =window.navigator.appCodeName;  
  //shorthands
   var uAg = window.navigator.userAgent;
  var appV = window.navigator.appVersion;
  var appN = window.navigator.appName;
  var ua = uAg.toLowerCase();
  
  //fallbacks and decision on the browser kinship
  navigator['engine'] = sPName.toLowerCase();
  navigator['version'] = parseFloat('0'+appV, 10);
  navigator['rversion'] = 0; navigator['prettyVersion'] = ''; 
  var h=uAg.indexOf('/'); if (h>-1){ 
  	sPName = uAg.substring(0,h); 
  	var sb = uAg.substring(h+1)+' ';
	navigator.prettyVersion=sb.substring(0, sb.indexOf(' '))
  	}
  if (appN == 'Microsoft Internet Explorer') appN = 'MSIE';
  navigator['kin'] = appN+'/'+parseInt(appV, 10); 

  //identifying JS1.0 browsers
  var nav_js = 0; if (!Array('test')) nav_js = 1.0

  //preliminary decision on the browser engine, trying to use navigator.product
  if (navigator.product) navigator.engine = navigator.product.toLowerCase() 
  if (navigator.productSub) navigator.version = parseFloat(navigator.productSub.substring(0,8), 10);

  var nav_family; //detecting the families and preparing for pretty names and versions 
  if (ua.indexOf("khtml") != -1 || ua.indexOf("konqueror") != -1 || ua.indexOf("applewebkit") != -1){
  	nav_family='kde'; //KDE products
  	if( ua.indexOf("konqueror") != -1 )
    	{ //Konqueror
          i = ua.indexOf('konqueror');
          sPName = 'konqueror'; 
    	  sPVersion = ua.substring(i+10);
    	}
    	else if( ua.indexOf("omniweb") != -1 )
    	{ //OmniWeb
        sPName = 'omniWeb';
        sPVersion = ua.substring(ua.lastIndexOf('/')+2); 
    	}
    	else if( ua.indexOf('safari/') != -1 )
    	{ //Safari
        sPName = 'safari';
        sPVersion = ua.substring(ua.lastIndexOf('/')+1); 
    	}
    }
  else if (navigator.engine == 'gecko'){
  	nav_family='gecko'; //Gecko products
    	if (ua.indexOf("galeon") != -1 )
    	{ //Galeon
        sPName = 'galeon';
        sPVersion = ua.substring(ua.indexOf('galeon') + 7);
    	}
    	//according to the proposal at http://www.mozilla.org/build/revised-user-agent-strings.html
    	else if (ua.indexOf('mozilla') != -1 && ua.lastIndexOf('/')-5 != ua.indexOf('gecko') && ua.lastIndexOf('/')-7 != 0)
    	{ //branded browsers based on Mozilla
          var gecko_r = uAg.substring(ua.indexOf('gecko')+6);
          var nPName_begins=getVersionLimit(gecko_r).length;
          sPName = gecko_r.substring(nPName_begins+1,gecko_r.indexOf('/'));
          sPVersion = gecko_r.substring(gecko_r.indexOf('/')+1);
          if (gecko_r.indexOf('/') != gecko_r.lastIndexOf('/') && gecko_r.indexOf('Firefox')!=-1)
	  { //grabbing the second vendor name if 'Firefox' is in the ua
	    var svendor = gecko_r.substring(gecko_r.indexOf('/')+1);
            var nvendor_begins=getVersionLimit(svendor).length;
            if (svendor.charAt(nvendor_begins+1)=='(' && svendor.indexOf(')')>0)
	    	{ // if a VendorComment is applied
	    	  nvendor_begins=svendor.indexOf(')');
	    	}
            sPName = svendor.substring(nvendor_begins+1,svendor.indexOf('/'));
            sPVersion = svendor.substring(svendor.indexOf('/')+1); 
	  }
    	} 
	else if (ua.indexOf("msie") != -1) 
	{ //making version number spoof friendly if the real vendor is unavailable 	
	navigator.prettyVersion=ua.substring(ua.indexOf("msie") + 5, ua.indexOf("msie") + 8)
	} 
  	}
  else if (ua.indexOf('opera') != -1){ //Opera products
  	nav_family='opera'; i = ua.indexOf('opera');
    	sPName    = 'opera';
    	sPVersion = ua.substring(i+6);
    	}
  else if (ua.indexOf('compatible') != -1 && ua.indexOf('msie') != -1 && !navigator.language){
  	nav_family='ie'; i = ua.indexOf('msie'); //Internet Explorer and the Trident engine
    	sPName = 'internet Explorer'; 
    	sPVersion = ua.substring(i+5);
  	//detecting JScript
    	if (navigator.version < 4)
    	{ //IE 3
   	  if(nav_js > 0) JScript = '1.0';
    	  else JScript = '2.0';
    	}
    	else
    	{ //IE 4
	  JScript = '3.0';
	  if (typeof(ScriptEngine) =='function'){
	  JScript = ScriptEngineMajorVersion() + ".";
	  JScript += ScriptEngineMinorVersion();
	  }
   	if 	(ua.indexOf('netscape') != -1) 
    		{ //Netscape Browser
      		sPName = 'netscape'; 
      		sPVersion = ua.substring(ua.indexOf('netscape')+9);
      		}
    	else if (ua.indexOf('america online browser') != -1)
    		{ //AOL
    		sPName = 'aOL Explorer';
    		sPVersion = ua.substring(ua.indexOf('rev')+3);
    		}
      	}
  	}
  else if (ua.indexOf("icab") != -1 ){
    	sPName = " iCab";
    	sPVersion = ua.substring(ua.indexOf("icab") + 5);
  	}
  else if (ua.indexOf('java') != -1 ){ //java browsers
    	if (ua.indexOf('ice') != -1 )
    	{ // ICEbrowser
    	  sPName = appN;
    	  sPVersion = ua.substring(ua.indexOf('/') + 2);
    	}
    	else if (ua.indexOf('hotjava') != -1 )
    	{ // HotJava
    	  sPName = 'hotJava';
    	}
  	}
  else if (appN == 'Netscape' && (ua.indexOf('spoofer')==-1) && (ua.indexOf('compatible')==-1) && (ua.indexOf('webtv')==-1) && (ua.indexOf('gecko')==-1)){
  	nav_family='nn'; i = ua.lastIndexOf('/'); //Netscape Navigator and Communicator
    	sPName = 'netscape';
    	sPVersion = ua.substring(i+1);
  	}

  //We need to convert version strings into numbers and a pretty look, thereby calling predefined functions. 
  if (nav_js != 1.0){
	nVersion= getVersion(sPVersion);
	if (nVersion != 0.01){
	  navigator.prettyVersion = getVersionLimit(sPVersion);
	  navigator.rversion = nVersion;
	  }
  	//detecting engines and versions
      	if (nav_family=='kde' && ua.indexOf('applewebkit') != -1 )
    	{ //OmniWeb and Safari use the AppleWebKit engine
          i = ua.indexOf('applewebkit');
          navigator.engine = 'applewebkit'; 
    	  //the version property is the AppleWebKit build version converted to double floating points
          navigator.version = getVersion(ua.substring(i+12,ua.indexOf('(khtml')-1))
	  //correcting the prettyVersion property for Safari 3
	  i = ua.indexOf("version/");
	  if (i != -1) navigator.prettyVersion=getVersionLimit(ua.substring(i+8));
    	}
    	else if (nav_family=='gecko' && ua.indexOf("rv:") != -1)
    	{
    	  var rvStart = ua.indexOf('rv:');
    	  var rvEnd   = ua.indexOf(')', rvStart);
    	  rv = ua.substring(rvStart+3, rvEnd);
    	  //the rversion property is the /rv/ converted to double floating points (e.g. 1.090001)
    	  navigator.rversion = getVersion(rv);
    	}
    	else if (nav_family=='opera' && parseFloat('0' + sPVersion) >= 7)
    	{
     	  navigator.engine = 'presto';
     	  navigator.version  = parseFloat('0' + sPVersion);
    	}
  	else if (nav_family=='ie' && window.clientInformation)
  	{
      	  navigator.engine = 'trident';
    	  navigator.version  = parseFloat('0' + JScript);
    	}
}  //end of not js1.0 clause

  //decision on the pretty name
  var prettyfirst=sPName.charAt(0).toUpperCase();
  navigator['prettyName'] = prettyfirst+sPName.substring(1);

  //final decision on the pretty name and version
  if (nVersion == 0.01 && navigator.engine=='gecko')
	{ //correcting pretty names and versions
	if (rv.length > 0){navigator.prettyVersion = rv}
 	else if (ua.indexOf("msie") != -1){navigator.prettyName='Internet Explorer'}
 	}
} //function ends
xbDetectBrowser(); //function call

