// set this to the max version of flash that you'll ever deal with.
var maxFlashVersionCheck = 10;

// this needs to be global to use in VBScript with IE/Win
var flashVersionInstalled = 0;

// VBScript for IE/Win
if(navigator && navigator.appVersion && navigator.appVersion.toLowerCase().indexOf("msie") != -1 && navigator.appVersion.toLowerCase().indexOf("win") != -1){ 
	document.write(	
		'<scr' + 'ipt language="VBScript">' + '\n' +
		'Dim hasPlayer, playerversion' + '\n' +
		'hasPlayer = false' + '\n' +
		'playerversion = maxFlashVersionCheck' + '\n' +
		'Do While playerversion > 0' + '\n' +
			'On Error Resume Next' + '\n' +
			'hasPlayer = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & playerversion)))' + '\n' +
		        'If hasPlayer = true Then Exit Do' + '\n' +
		        'playerversion = playerversion - 1' + '\n' +
		'Loop' + '\n' +
		'flashVersionInstalled = playerversion' + '\n' +
		'<\/sc' + 'ript>');
}

function getFlashInfo(inputBasicInfo) {
    var basicInfo = isEmpty(inputBasicInfo) ?  getBasicInfo() : inputBasicInfo;
    var flashInfo = new Array();
    
	if(navigator && navigator.appVersion && navigator.appVersion.toLowerCase().indexOf("msie") != -1 && navigator.appVersion.toLowerCase().indexOf("win") != -1){   		
   		if(flashVersionInstalled>0){
    			flashInfo["hasFlash"] = true;
    			flashInfo["version"]  = flashVersionInstalled;
    			return flashInfo;
    	}
    }
     
	if ((basicInfo["engine"]=="gecko") || (basicInfo["engine"]=="opera") || (basicInfo["engine"]=="khtml") || (basicInfo["engine"]=="mozold")) {
    	// Non-IE Flash plug-in detection
		if (navigator.plugins && navigator.plugins.length) {
        	flashPlugin = navigator.plugins["Shockwave Flash"];
        	
        	if (flashPlugin) {
        		flashInfo["hasFlash"] = true;
           		if (flashPlugin.description) {
        			flashPluginDesc = flashPlugin.description;
           			flashInfo["version"] = flashPluginDesc.charAt(flashPluginDesc.indexOf('.')-1);
           		}
        	} else {
           		flashInfo["hasFlash"] = false;
            }
            
            if (navigator.plugins["Shockwave Flash 2.0"]) {
                flashInfo["hasFlash"] = true;
                flashInfo["version"] = 2;
            }
        
        } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
            flashPlugin = navigator.mimeTypes['application/x-shockwave-flash'];
            if (flashPlugin && flashPlugin.enabledPlugin) {
                flashInfo["hasFlash"] = true;
            } else {
                flashInfo["hasFlash"] = false;
            }
        }

   		return flashInfo;

  
	} else if (basicInfo["engine"]=="msie") {
		for(var i=maxFlashVersionCheck; i>0; i--) {
			try {
				var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
            	flashInfo["version"] = i;
               	break;
             	//return;
			} catch(e) { }
		}
		
		if (flashInfo["version"]>0) {
			flashInfo["hasFlash"]=true;
		} else {
			flashInfo["hasFlash"]=false;
		}
		
		return flashInfo;

	} else {
		flashInfo["hasFlash"]="unknown";
    	flashInfo["version"]="unknown";
    	return flashInfo;
 	}
}

function getBasicInfo() {
	var navUserAgent=navigator.userAgent.toLowerCase();
    var basicInfo = new Array();
    
    //init
    basicInfo["name"] = "unknown";
    basicInfo["version"] = "unknown";
    basicInfo["engine"] = "unknown";
    basicInfo["fullversion"] = "unknown";

    if (navUserAgent.search(/omniweb[\/\s]v?(\d+([\.-]\d)*)/) != -1) {
    // Omniweb
        basicInfo["name"]="omniweb";
        basicInfo["version"]=navUserAgent.match(/omniweb[\/\s]v?(\d+([\.-]\d)*)/)[1];
        (basicInfo["version"] > 4.5 ? basicInfo["engine"]="khtml" : basicInfo["engine"]="omniweb");
        (navUserAgent.search(/omniweb[\/\s]((\d+([\.-]\d)*)-)?v(\d+([\.-]\d)*)/) == -1 ?       basicInfo["fullversion"]=navUserAgent.match(/omniweb[\/\s](\d+([\.-]\d)*)/)[1] :        basicInfo["fullversion"]=navUserAgent.match(/omniweb[\/\s]((\d+([\.-]\d)*)-)?v(\d+([\.-]\d)*)/)[4]);
        return basicInfo;
    } else if (navUserAgent.search(/opera[\/\s](\d+(\.?\d)*)/) != -1) {
    // Opera
        basicInfo["name"]="opera";
        basicInfo["version"]=navUserAgent.match(/opera[\/\s](\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="opera";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/crazy\s?browser\s(\d+(\.?\d)*)/) != -1) {
    // Crazy Browser
        basicInfo["name"]="crazy";
        basicInfo["version"]=navUserAgent.match(/crazy\s?browser\s(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="msie";
        basicInfo["fullversion"]=getMSIEVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/myie2/) != -1) {
    // MyIE2
        basicInfo["name"]="myie2";
        basicInfo["engine"]="msie";
        basicInfo["fullversion"]=navUserAgent.match(/msie\s(\d+(\.?\d)*)/)[1];
        return basicInfo;
    } else if (navUserAgent.search(/netcaptor/) != -1) {
    // NetCaptor
        basicInfo["name"]="netcaptor";
        basicInfo["version"]=navUserAgent.match(/netcaptor\s(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="msie";
        basicInfo["fullversion"]=getMSIEVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/avant\sbrowser/) != -1) {
    // Avant Browser
        basicInfo["name"]="avantbrowser";
        basicInfo["version"]=getMSIEVersion(navUserAgent);
        basicInfo["engine"]="msie";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/msn\s(\d+(\.?\d)*)/) != -1) {
    // MSN Explorer
        basicInfo["name"]="msn";
        basicInfo["version"]=navUserAgent.match(/msn\s(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="msie";
        basicInfo["fullversion"]=getMSIEVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/msie\s(\d+(\.?\d)*)/) != -1) {
    // MS Internet Explorer
        basicInfo["name"]="msie";
        basicInfo["version"]=getMSIEVersion(navUserAgent);
        basicInfo["engine"]="msie";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/powermarks\/(\d+(\.?\d)*)/) != -1) {
    // PowerMarks
        basicInfo["name"]="powermarks";
        basicInfo["version"]=navUserAgent.match(/powermarks\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="msie";
        try {
            basicInfo["fullversion"]=getMSIEVersion(navUserAgent);
        } catch (e) { }
        return basicInfo;
	} else if (navUserAgent.search(/konqueror[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Konqueror
        basicInfo["name"]="konqueror";
        basicInfo["version"]=navUserAgent.match(/konqueror[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="khtml";
        return basicInfo;
    } else if (navUserAgent.search(/safari\/(\d)*/) != -1) {
    // Safari
        basicInfo["name"]="safari";
        basicInfo["version"]=navUserAgent.match(/safari\/(\d+(\.?\d*)*)/)[1];
        basicInfo["engine"]="khtml";
        basicInfo["fullversion"]=navUserAgent.match(/applewebkit\/(\d+(\.?\d*)*)/)[1];
        return basicInfo;
    } else if(navUserAgent.search(/zyborg/) != -1) {
    // Zyborg (SSD)
        basicInfo["name"]="zyborg";
        basicInfo["version"]=navUserAgent.match(/zyborg\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="robot";
        basicInfo["fullversion"]="-1"
        return basicInfo;

    } else if (navUserAgent.search(/netscape[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Netscape 
        basicInfo["name"]="netscape";
        basicInfo["version"]=navUserAgent.match(/netscape[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;

    } else if (navUserAgent.search(/netscape6[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Netscape 6.x
        basicInfo["name"]="netscape";
        basicInfo["version"]=navUserAgent.match(/netscape6[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/netscape\/(7\.\d*)/) != -1) {
    // Netscape 7.x
        basicInfo["name"]="netscape";
        basicInfo["version"]=navUserAgent.match(/netscape\/(7\.\d*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/galeon[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Galeon
        basicInfo["name"]="galeon";
        basicInfo["version"]=navUserAgent.match(/galeon[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/nautilus[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Nautilus
        basicInfo["name"]="nautilus";
        basicInfo["version"]=navUserAgent.match(/nautilus[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/firefox[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Firefox
        basicInfo["name"]="firefox";
        basicInfo["version"]=navUserAgent.match(/firefox[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/k-meleon[\/\s](\d+([\.-]\d)*)/) != -1) {
    // K-Meleon
        basicInfo["name"]="kmeleon";
        basicInfo["version"]=navUserAgent.match(/k-meleon[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/firebird[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Firebird
        basicInfo["name"]="firebird";
        basicInfo["version"]=navUserAgent.match(/firebird[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/phoenix[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Phoenix
        basicInfo["name"]="phoenix";
        basicInfo["version"]=navUserAgent.match(/phoenix[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/camino[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Camino
        basicInfo["name"]="camino";
        basicInfo["version"]=navUserAgent.match(/camino[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/epiphany[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Epiphany
        basicInfo["name"]="epiphany";
        basicInfo["version"]=navUserAgent.match(/epiphany[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/chimera[\/\s](\d+([\.-]\d)*)/) != -1) {
    // Chimera
        basicInfo["name"]="chimera";
        basicInfo["version"]=navUserAgent.match(/chimera[\/\s](\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/icab[\s\/]?(\d+(\.?\d)*)/) !=-1) {
    // iCab
        basicInfo["name"]="icab";
        basicInfo["version"]=navUserAgent.match(/icab[\s\/]?(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="icab";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/netfront\/(\d+([\._]\d)*)/) != -1) {
    // NetFront
        basicInfo["name"]="netfront";
        basicInfo["version"]=navUserAgent.match(/netfront\/(\d+([\._]\d)*)/)[1];
        basicInfo["engine"]="netfront";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/netscape4\/(\d+([\.-]\d)*)/) != -1) {
    // Netscape 4.x
        basicInfo["name"]="netscape";
        basicInfo["version"]=navUserAgent.match(/netscape4\/(\d+([\.-]\d)*)/)[1];
        basicInfo["engine"]="mozold";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if ( (navUserAgent.search(/mozilla\/(4.\d*)/) != -1) && (navUserAgent.search(/msie\s(\d+(\.?\d)*)/) == -1) ) {
        basicInfo["name"]="netscape";
        basicInfo["version"]=navUserAgent.match(/mozilla\/(4.\d*)/)[1];
        basicInfo["engine"]="mozold";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if ((navUserAgent.search(/mozilla\/5.0/) != -1) && (navUserAgent.search(/gecko\//) != -1)) {
    // Mozilla Seamonkey
        basicInfo["name"]="mozsea";
        basicInfo["version"]=navUserAgent.match(/rv\x3a(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="gecko";
        basicInfo["fullversion"]=getGeckoVersion(navUserAgent);
        return basicInfo;
    } else if (navUserAgent.search(/elinks/) != -1) {
    // ELinks
        basicInfo["name"]="elinks";
        (navUserAgent.search(/elinks\/(\d+(\.?\d)*)/) == -1 ?
	basicInfo["version"]=navUserAgent.match(/elinks\s\x28(\d+(\.?\d)*)/)[1] :
	basicInfo["version"]=navUserAgent.match(/elinks\/(\d+(\.?\d)*)/)[1]);
        basicInfo["engine"]="elinks";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/w3m\/(\d+(\.?\d)*)/) != -1) {
    // w3m
        basicInfo["name"]="w3m"
        basicInfo["version"]=navUserAgent.match(/(^w3m|\sw3m)\/(\d+(\.?\d)*)/)[2];
        basicInfo["engine"]="w3m";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/links/) != -1) {
    // Links
        basicInfo["name"]="links";
        (navUserAgent.search(/links\/(\d+(\.?\d)*)/) == -1 ? basicInfo["version"]=navUserAgent.match(/links\s\x28(\d+(\.?\d)*)/)[1] : basicInfo["version"]=navUserAgent.match(/links\/(\d+(\.?\d)*)/)[1]);
        basicInfo["engine"]="links";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if (navUserAgent.search(/java[\/\s]?(\d+([\._]\d)*)/) != -1) {
    // Java (as web-browser)
        basicInfo["name"]="java";
        basicInfo["version"]=navUserAgent.match(/java[\/\s]?(\d+([\._]\d)*)/)[1];
        basicInfo["engine"]="java";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if(navUserAgent.search(/lynx/) != -1) {
    // Lynx (SSD)
        basicInfo["name"]="lynx";
        basicInfo["version"]=navUserAgent.match(/lynx\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="libwww-fm";
        basicInfo["fullversion"]=navUserAgent.match(/libwww-fm\/(\d+(\.?\d)*)/)[1];
        return basicInfo;
    } else if(navUserAgent.search(/dillo/) != -1) {
    // Dillo (SSD)
        basicInfo["name"]="dillo";
        basicInfo["version"]=navUserAgent.match(/dillo\s*\/*(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="dillo";
        basicInfo["fullversion"]=basicInfo["version"];
        return basicInfo;
    } else if(navUserAgent.search(/wget/) != -1) {
    // wget (SSD)
        basicInfo["name"]="wget";
        basicInfo["version"]=navUserAgent.match(/wget\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="robot";
        basicInfo["fullversion"]="-1"
        return basicInfo;
    } else if(navUserAgent.search(/googlebot\-image/) != -1) {
    // GoogleBot-Image (SSD)
        basicInfo["name"]="googlebotimg";
        basicInfo["version"]=navUserAgent.match(/googlebot\-image\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="robot";
        basicInfo["fullversion"]="-1"
        return basicInfo;
    } else if(navUserAgent.search(/googlebot/) != -1) {
    // GoogleBot (SSD)
        basicInfo["name"]="googlebot";
        basicInfo["version"]=navUserAgent.match(/googlebot\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="robot";
        basicInfo["fullversion"]="-1"
        return basicInfo;
    } else if(navUserAgent.search(/msnbot/) != -1) {
    // MSNBot (SSD)
        basicInfo["name"]="msnbot";
        basicInfo["version"]=navUserAgent.match(/msnbot\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="robot";
        basicInfo["fullversion"]="-1"
        return basicInfo;
    } else if(navUserAgent.search(/turnitinbot/) != -1) {
    // Turnitin (SSD)
        basicInfo["name"]="turnitinbot";
        basicInfo["version"]=navUserAgent.match(/turnitinbot\/(\d+(\.?\d)*)/)[1];
        basicInfo["engine"]="robot";
        basicInfo["fullversion"]="-1"
        return basicInfo;
    } else {
        basicInfo["name"]="unknown";
        return basicInfo;
    }
}

// Return Gecko version
function getGeckoVersion(navUserAgent) {
    return navUserAgent.match(/gecko\/([0-9]+)/)[1];
}

// Return MSIE version
function getMSIEVersion(navUserAgent) {
    return navUserAgent.match(/msie\s(\d+(\.?\d)*)/)[1];
}

function isEmpty(input) {
    return (input==null || input =="")
}

function setMaxFlashVersionCheck(inputMaxFlashVersionCheck){
	maxFlashVersionCheck = inputMaxFlashVersionCheck;
}