/**
 * Navigator properties:
 * -name (Opera, Google Chrome, Mozilla Firefox...)
 * -codeName (opera, chrome, firefox...)
 * -basicName (op, ch, ff...)
 * -version (5.0.3.12...)
 * -basicVersion (5)
 * -mobile (true, false)
 * -platform (windows 7, Linux, Machintosh...)
 * @author Rbrt
 * @version 1.6.2
 * @returns Navigator object
 */
function Navigator() {
	
	this.fullName = getName(false);
	this.name = getName(true);
	this.code = getCodeName(this.name);
	this.fullVersion = getVersion(this.name);
	this.version = getBasicVersion(this.fullVersion);
	this.mobile = isMobile(navigator.userAgent);
	this.width = screen.width;
	this.height = screen.height;
	this.platform = getPlatform(navigator.userAgent);
	
	
	function getName(bool, so) { //operative system, is an auxiliary var, for special-cases
		var name = 'unknow';
		var navsCode = new Array();
		var navs = new Array();
		
		//the first var is the string that will be found in userAgent. the Second var is the common name
		// IMPORTANT NOTE: define new navigators BEFORE firefox, chrome and safari
		navsCode[0] = 'Opera Mobi';	navs[0] = 'Opera Mobile';
		navsCode[1] = 'Opera Mini';	navs[1] = 'Opera Mini';
		navsCode[2] = 'Opera';			navs[2] = 'Opera'; 
		navsCode[3] = 'MSIE';				navs[3] = 'Microsoft Internet Explorer';
		navsCode[4] = 'BlackBerry';	navs[4] = 'BlackBerry Navigator';
		navsCode[5] = 'BrowserNG';	navs[5] = 'Nokia Navigator';
		navsCode[6] = 'Midori';			navs[6] = 'Midori';
		navsCode[7] = 'Kazehakase';	navs[7] = 'Kazehakase';
		navsCode[8] = 'Chromium';	navs[8] = 'Chromium';
		navsCode[9] = 'Flock';			navs[9] = 'Flock';
		navsCode[10] = 'Galeon';		navs[10] = 'Galeon';
		navsCode[11] = 'RockMelt';	navs[11] = 'RockMelt';
		navsCode[12] = 'Fennec';		navs[12] = 'Fennec';
		navsCode[13] = 'Konqueror';	navs[13] = 'Konqueror';
		navsCode[14] = 'Arora';			navs[14] = 'Arora';
		navsCode[15] = 'Swiftfox';		navs[15] = 'SwiftFox';
		navsCode[16] = 'Maxthon';		navs[16] = 'Maxthon';
		//navsCode[] = '';	navs[] = '';
		//navsCode[] = '';	navs[] = '';
		//navsCode[] = '';	navs[] = '';
		
		navsCode[17] = 'Firefox';		navs[17] = 'Mozilla Firefox';
		navsCode[18] = 'Chrome';		navs[18] = 'Google Chrome';
		navsCode[19] = 'Safari';			navs[19] = 'Apple Safari';
		
		
		for (i=0; i<navs.length; i++) { 
			if ( isThis(navsCode[i]) ) {	
				var name = (bool) ? navsCode[i].toLowerCase() : navs[i]; //the name alwas be lowercase
				if (name=='msie') name='iexplorer';
				if (name=='opera mobi') name='opera';
				if (name=='opera mini') name='opera';
				i=navs.length; //when found it, stops reading
			}//if
		}//for
		
		//manual filter, when is so hard to define the navigator type
		if (name=='safari' && so=='Linux') name = 'unknow';
		
		return name;
	}//function
	
		function isThis(nav) {
			var result = (searchString(navigator.userAgent, nav)>=0) ? true : false; 
			return result;
		}//function
		
		function searchString(cadOriginal, cadBuscar) { 
			if (!cadOriginal.length>0) return -1;
			if (!cadBuscar.length>0) return -1;
			return cadOriginal.indexOf(cadBuscar); //returs -1 on failure
		}//function
	
	function getCodeName(basic) {
		if (basic=='opera') 		basic = 'op';
		if (basic=='firefox') 		basic = 'ff';
		if (basic=='chrome') 	basic = 'ch';
		if (basic=='safari') 		basic = 'sf';
		if (basic=='iexplorer') 	basic = 'ie';
		return basic;
	}//function
		
	function getVersion(name) {
		var pre = 'unknow'; //string that precedes the string version
		var final = '';
		if (name=='opera') 			pre = 'Version/';
		if (name=='firefox') 			pre = 'Firefox/';
		if (name=='chrome') 		pre = 'Chrome/';
		if (name=='safari') 			pre = 'Version/';
		if (name=='iexplorer') 		pre = 'MSIE '; 
		if (name=='rockmelt') 	pre = 'RockMelt/';
		if (name=='kazehakase') pre = 'Kazehakase/';
		if (name=='chromium') 	pre = 'Chromium/';
		if (name=='flock') 			pre = 'Flock/';
		if (name=='galeon') 		pre = 'Galeon/';
		if (name=='blackberry') 	pre = '/';
		if (name=='browserng') 	pre = 'BrowserNG/';	
		if (name=='midori') 		pre = 'Midori/';
		if (name=='fennec') 		pre = 'Fennec/';
		if (name=='konqueror') 	pre = 'Konqueror/';
		if (name=='arora') 			pre = 'Arora/';
		if (name=='swiftfox') 		pre = 'Firefox/';
		if (name=='maxthon') 	pre = 'Maxthon/';
		//if (name=='') pre = '/';
		//if (name=='') pre = '/';
		//if (name=='') pre = '/';
		
		var cadena = navigator.userAgent;
		var index = searchString(cadena, pre);
		if (index>=0) { 
			indexVersion = index + pre.length;
			for (i=indexVersion; i<cadena.length; i++) {
				n = cadena.charCodeAt(i); 
				if ((n>=48 && n<=57) || n==46) //looking for numbers and dots
					final += cadena.charAt(i);
				else i=cadena.length;
			}//for
		}//if 
		
		var v = (final.length>0) ? final : 'unknow';
		return v;
	}//function
	
	function getBasicVersion(vers) {
		var basic = 0;
		if (vers.length>0) {
			var dot = 0;
			var num = "";
			for (var i=0; i<vers.length; i++) { 
				if (vers.charAt(i) == '.') dot++;
				if (dot<2) num += vers.charAt(i);
				else break;
			}//foreach
			basic = num;
		} return parseFloat(basic);
	}//function
	
	function getPlatform(cad) {
		var plat = navigator.platform;
		if (plat == 'Win32' || plat == 'Win64') plat = 'Windows';
		if (cad.indexOf('NT 5.1') !=-1) 	plat = 'Windows XP';		
		if (cad.indexOf('NT 6') !=-1) 		plat = 'Windows Vista';
		if (cad.indexOf('NT 6.1') !=-1) 	plat = 'Windows 7';
		if (cad.indexOf('Mac') !=-1) 		plat = 'Macintosh';
		if (cad.indexOf('Linux') !=-1) 		plat = 'Linux';
		if (cad.indexOf('iPhone') !=-1) 	plat = 'iOS iPhone';
		if (cad.indexOf('iPod') !=-1) 		plat = 'iOS iPod';
		if (cad.indexOf('iPad') !=-1) 		plat = 'iOS iPad';
		if (cad.indexOf('Android') !=-1) 	plat = 'Android';
		return plat;
	}//function
	
	function isMobile(agent, w, h) {
		agent = agent.toLowerCase();
		var mobiles = ['mobi', 'mobile', 'mini', 'iphone', 'ipod', 'ipad', 'android', 'blackberry'];
		for (var i in mobiles) {
			if (agent.indexOf(mobiles[i])>-1) return true;
		}//foreach	
		if (w<700 || h<600) return true;
		return false;
	}//function
	
}//class Navigator

function getNavigatorProperties() { 
	document.write("Navigator <b>appCodeName</b>: " + navigator.appCodeName + "<br>"); 
	document.write("Navigator <b>appName</b>: " + navigator.appName + "<br>"); 
	document.write("Navigator <b>appVersion</b>: " + navigator.appVersion + "<br>"); 
	document.write("Navigator <b>language</b>: " + navigator.language + "<br>"); 
	document.write("Navigator <b>platform</b>: " + navigator.platform + "<br>"); 
	document.write("Navigator <b>userAgent</b>: " + navigator.userAgent + "<br>"); 
	
	mime = navigator.mimeTypes;
	document.write("<table border='1'>");
	document.write("<tr> <th colspan='2'>Total: "+mime.length+"</th> </tr>");
	document.write("<tr> <th>Suffixes</th> <th>Type</th> </tr>");
	for (i=1; i<mime.length; i++) {
		document.write("<tr>");
		n = 1;
		for (var property in mime[i]) {
			if (n>2) document.write("<td>"+mime[i][property]+"</td>");
			n++;
		}//foreach
		document.write("</tr>");
	}//for
	document.write("</table>");
}//function
