/**
* WinBrowser class
*/
	function Browser()
	{
		// Properties	
		this.version = 0;	
		this.name = '';	
		this.code = '';
		this.os = '';
		this.initialized = this.init();
	}
	
	
/**
* Init method
*/	
	Browser.prototype.init = function () {
	
		//initialization, browser, os detection
		var d, n, nav, nan, nua, pattern, dom, nu='', brow='', ie, ie4, ie5, ie5x, ie6, ie7;
		var ns4, moz, moz_rv_sub, release_date='', moz_brow, moz_brow_nu='', moz_brow_nu_sub='', rv_full=''; 
		var mac, win, old, lin, ie5mac, ie5xwin, konq, saf, op, op4, op5, op6, op7;
		
		d=document;
		n=navigator;
		nav=n.appVersion;
		nan=n.appName;
		nua=n.userAgent;
		old=(nav.substring(0,1)<4);
		mac=(nav.indexOf('Mac')!=-1);
		win=( ( (nav.indexOf('Win')!=-1) || (nav.indexOf('NT')!=-1) ) && !mac)?true:false;
		lin=(nua.indexOf('Linux')!=-1);
		// begin primary dom/ns4 test
		// this is the most important test on the page
		if ( !document.layers )
		{
			dom = ( d.getElementById ) ? d.getElementById : false;
		}
		else { 
			dom = false; 
			ns4 = true;// only netscape 4 supports document layers
		}
		// end main dom/ns4 test
		
		op=(nua.indexOf('Opera')!=-1);
		saf=(nua.indexOf('Safari')!=-1);
		konq=(!saf && (nua.indexOf('Konqueror')!=-1) ) ? true : false;
		moz=( (!saf && !konq ) && ( nua.indexOf('Gecko')!=-1 ) ) ? true : false;
		ie=((nua.indexOf('MSIE')!=-1)&&!op);
		if (op)
		{
			str_pos=nua.indexOf('Opera');
			nu=nua.substr((str_pos+6),4);
			brow = 'Opera';
			this.code = 'OP';
		}
		else if (saf)
		{
			str_pos=nua.indexOf('Safari');
			nu=nua.substr((str_pos+7),5);
			brow = 'Safari';
			this.code = 'MAC';
		}
		else if (konq)
		{
			str_pos=nua.indexOf('Konqueror');
			nu=nua.substr((str_pos+10),3);
			brow = 'Konqueror';
		}
		// this part is complicated a bit, don't mess with it unless you understand regular expressions
		// note, for most comparisons that are practical, compare the 3 digit rv nubmer, that is the output
		// placed into 'nu'.
		else if (moz)
		{
			// regular expression pattern that will be used to extract main version/rv numbers
			pattern = /[(); \n]/;
			// moz type array, add to this if you need to
			var moz_types = new Array( 'Firefox', 'Phoenix', 'Firefox', 'Galeon', 'K-Meleon', 'Camino', 'Epiphany', 
				'Netscape6', 'Netscape', 'MultiZilla', 'Gecko Debian', 'rv' );
			var rv_pos = nua.indexOf( 'rv' );// find 'rv' position in nua string
			rv_full = nua.substr( rv_pos + 3, 6 );// cut out maximum size it can be, eg: 1.8a2, 1.0.0 etc
			// search for occurance of any of characters in pattern, if found get position of that character
			var rv_slice = ( rv_full.search( pattern ) != -1 ) ? rv_full.search( pattern ) : '';
			//check to make sure there was a result, if not do  nothing
			// otherwise slice out the part that you want if there is a slice position
			( rv_slice ) ? rv_full = rv_full.substr( 0, rv_slice ) : '';
			// this is the working id number, 3 digits, you'd use this for 
			// number comparison, like if nu >= 1.3 do something
			nu = rv_full.substr( 0, 3 );
			
			for (var i=0; i < moz_types.length; i++)
			{
				if ( nua.indexOf( moz_types[i]) !=-1 )
				{
					moz_brow = moz_types[i];
					break;
				}
			}
			if ( moz_brow )// if it was found in the array
			{
				var str_pos=nua.indexOf(moz_brow);// extract string position
				moz_brow_nu = nua.substr( (str_pos + moz_brow.length + 1 ) ,3);// slice out working number, 3 digit
				// if you got it, use it, else use nu
				moz_brow_nu = ( isNaN( moz_brow_nu ) ) ? moz_brow_nu = nu: moz_brow_nu;
				moz_brow_nu_sub = nua.substr( (str_pos + moz_brow.length + 1 ), 8);
				// this makes sure that it's only the id number
				var sub_nu_slice = ( moz_brow_nu_sub.search( pattern ) != -1 ) ? moz_brow_nu_sub.search( pattern ) : '';
				//check to make sure there was a result, if not do  nothing
				( sub_nu_slice ) ? moz_brow_nu_sub = moz_brow_nu_sub.substr( 0, sub_nu_slice ) : '';
			}
			if ( moz_brow == 'Netscape6' )
			{
				moz_brow = 'Netscape';
			}
			else if ( moz_brow == 'rv' || moz_brow == '' )// default value if no other gecko name fit
			{
				moz_brow = 'Mozilla';
			} 
			if ( !moz_brow_nu )// use rv number if nothing else is available
			{
				moz_brow_nu = nu;
				moz_brow_nu_sub = nu;
			}
			if (n.productSub)
			{
				release_date = n.productSub;
			}
			brow = moz_brow;
			nu = moz_brow_nu_sub;
			this.code = 'NS';
		}
		else if (ie)
		{
			str_pos=nua.indexOf('MSIE');
			nu=nua.substr((str_pos+5),3);
			brow = 'Microsoft Internet Explorer';
			this.code = 'IE';
		}
		// default to navigator app name
		else 
		{
			brow = nan;
		}
		op5=(op&&(nu.substring(0,1)==5));
		op6=(op&&(nu.substring(0,1)==6));
		op7=(op&&(nu.substring(0,1)==7));
		var op8=(op&&(nu.substring(0,1)==8));
		var op9=(op&&(nu.substring(0,1)==9));
		ie4=(ie&&!dom);
		ie5=(ie&&(nu.substring(0,1)==5));
		ie6=(ie&&(nu.substring(0,1)==6));
		ie7=(ie&&(nu.substring(0,1)==7));
		// default to get number from navigator app version.
		if(!nu) 
		{
			nu = nav.substring(0,1);
		}
		/*ie5x tests only for functionavlity. dom or ie5x would be default settings. 
		Opera will register true in this test if set to identify as IE 5*/
		ie5x=(d.all&&dom);
		ie5mac=(mac&&ie5);
		ie5xwin=(win&&ie5x);	
		
		this.version = nu;	
		this.name = brow;
		
		switch (true) {
			
			case lin: //os is linux
				this.os = 'Linux';
				break;
			case mac: //os is linux
				this.os = 'MacOS';
				break;
			case win: //os is linux
				this.os = 'Windows';
				break;
			default:
				this.os = 'Not Detected';
				break;				
		}
	}
	window.browser = new Browser();
	