/*
==== Copyright (c) 2006-2007 David R. Martin <dmartin@cs.bc.edu>
==== 
==== All rights reserved.
==== 
==== This copyright notice applies to all HTML, JavaScript, text, and 
==== other content in this file, as well as any content (icons, images,
==== sounds, movies) directly or indirectly referred to by this file 
==== in the same Internet domain.
==== 
==== Permission is denied for any unauthorized use or dissemination of 
==== these materials, including but not limited to use in another 
==== Internet site or computer application.
==== 
==== This copyright notice must accompany any authorized copy of this 
==== file, or any authorized derived copy of this file.
==== 
==== For licencing, contact license@360cities.net.
*/

// Sniff for plugins that can display panoramic images.

// David R. Martin <dmartin@cs.bc.edu>
// Much of this code is based on http://www.devalvr.com/instalacion/detectvr.zip.

var pluginNames = ['Deval','Flash','Quicktime'];

var minVersion = new Array();
minVersion['Quicktime'] = "5.0.0";
minVersion['Deval'] = "0,6,9,15";
minVersion['Flash'] = "9.0.0";


var mimeType = new Array();
mimeType['Quicktime'] = 'video/quicktime';
mimeType['Deval'] = 'application/x-devalvrx';
mimeType['Flash'] = 'application/x-shockwave-flash';


var installedVersion = new Array();
installedVersion['Quicktime'] = "?";
installedVersion['Deval'] = "?";
installedVersion['Flash'] = "?";


function versionCheck(plugin,cvString) 
{
    //alert('versionCheck('+plugin+','+cvString+')');
    installedVersion[plugin] = cvString;
    var cv = cvString.split(/[.,]/);
    var mv = minVersion[plugin].split(/[.,]/);
    var len = Math.max(cv.length,mv.length);
    for (var i = 0; i < len; i++) {
        var mvi = (i >= mv.length) ? 0 : parseInt(mv[i]);
        var cvi = (i >= cv.length) ? 0 : parseInt(cv[i]);
        if (cvi > mvi) { return 1; }
        if (cvi < mvi) { return 0; }
    }
    return 1;
}

// Which platform are we on?
var platform = "Unknown"; // could be Linux
if (navigator.platform.indexOf('Win')!=-1) { platform = "Windows"; }
if (navigator.platform.indexOf('Mac')!=-1 || 
    navigator.platform.indexOf('PowerPC')!=-1) { platform = "Mac"; }

// Which browser are we running?
var browser = "Unknown";
if (navigator.userAgent.indexOf('MSIE')!=-1) { browser = "IE"; }
if (navigator.userAgent.indexOf('Opera')!=-1) { browser = "Opera"; }
if (navigator.userAgent.indexOf('Safari')!=-1) { browser = "Safari"; }
if (navigator.userAgent.indexOf('Firefox')!=-1) { browser = "Firefox"; }
if (navigator.userAgent.indexOf('Camino')!=-1) { browser = "Camino"; }

// Which viewers are installed?
var pluginInstalled = new Array();

// Check for Quicktime.
pluginInstalled["Quicktime"] = 0;
if (browser == 'IE') {
    try {
        var obj = new ActiveXObject(
            'QuickTimeCheckObject.QuickTimeCheck.1');
        if (obj && obj.IsQuickTimeAvailable(0)) {
	    var ver = obj.QuickTimeVersion;
	    var sver = '';
	    var hexDigits = '0123456789abcdef';
	    // remove trailing zeros
	    while (ver > 0 && (ver % 16) == 0) { ver /= 16; }
	    // extract version as sequence of hex digits
	    while (ver > 0) {
		var digit = ver % 16;
		if (sver != '') { sver = '.' + sver; }
		sver = hexDigits.charAt(digit) + sver;
		ver = (ver - digit) / 16;
	    }
	    // just keep first 3 version numbers
	    if (sver.length > 5) { sver = sver.substring(0,5); }
            pluginInstalled["Quicktime"] = versionCheck('Quicktime',sver);
        }
    } catch (e) {}
} else {
    var mt = mimeType['Quicktime'];
    if (navigator.mimeTypes && 
        navigator.mimeTypes[mt] && 
        navigator.mimeTypes[mt].enabledPlugin)
    {
        var plugin = navigator.mimeTypes[mt].enabledPlugin;
        var words = plugin.name.split(" ");
        pluginInstalled['Quicktime'] = (words.length < 3) ||
            versionCheck('Quicktime', words[2]);
    }
}

// Check for Deval.
pluginInstalled["Deval"] = 0;
if (browser == 'IE') {
    try {
	var obj = new ActiveXObject('DevalVRXCtrl.DevalVRXCtrl.1');
        if (obj) {
	    // I don't know how to detect Deval version in MSIE.
            pluginInstalled["Deval"] = 1;
        }
    } catch (e) {}
} else {
    var mt = mimeType['Deval'];
    if (navigator.mimeTypes && 
        navigator.mimeTypes[mt] && 
        navigator.mimeTypes[mt].enabledPlugin) {
        var plugin = navigator.mimeTypes[mt].enabledPlugin;
        var words = plugin.description.split(" ");
        pluginInstalled['Deval'] = versionCheck('Deval',words[3]);
    } 
}

// Check for Flash.
pluginInstalled["Flash"] = 0;
if (browser == 'IE') {
    var ver = 0;
    for (var i=1; i<20; i++) {
	try {
	    var obj = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.'+i);
	    ver = i;
	} catch (e) {}
    }
    pluginInstalled['Flash'] = versionCheck('Flash',''+ver); 
} else {
    var mt = mimeType['Flash'];
    if (navigator.mimeTypes && 
        navigator.mimeTypes[mt] && 
        navigator.mimeTypes[mt].enabledPlugin) {
        var plugin = navigator.mimeTypes[mt].enabledPlugin;
        var words = plugin.description.split(" ");
        pluginInstalled["Flash"] = versionCheck('Flash',words[2]);
    }
}


var sniffShortString = '';
sniffShortString += pluginInstalled['Deval'] ? 'd' : '';
sniffShortString += pluginInstalled['Flash'] ? 'f' : '';
sniffShortString += pluginInstalled['Quicktime'] ? 'q' : '';


// Return a string that concisely specifies which plugins are available.
function sniff() { return sniffShortString; }

// For debugging: Display sniffer results.
if (0) { alert(sniff()); }

