/**
 * Same logic as before. Have removed some detection capabilities in an effort
 * to reduce reliance on browser detection in general.
 * 
 * If there is a particualr detection you feel you need please file a ticket
 * with the request or add the detection yourself with the exact reason you
 * need said detection. Hopefully we'll be able to keep the number of
 * detection utility functions to a minimum in favor of behavioral testing.
 * 
 * This may also be the place for very common behavioral functions.
 * 
 */

if (typeof(AC) == "undefined") { AC = {}; }

AC.Detector = {

	getAgent: function() {
		return navigator.userAgent.toLowerCase();
	},
	
	// detect platform
	isMac: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/mac/i);
	},
	
	isWin: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/win/i);
	},
	
	isWin2k: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return this.isWin(agent) && (agent.match(/nt\s*5/i));
	},
	
	isWinVista: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return this.isWin(agent) && (agent.match(/nt\s*6/i));
	},
	
	// detect browser
	isWebKit: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/AppleWebKit/i);
	},
	
	isOpera: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/opera/i);
	},
	
	isIE: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/msie/i);
	},
	
	isIEStrict: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/msie/i) && !this.isOpera(agent);
	},
	
	isFirefox: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/firefox/i);
	},

	isiPhone: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return agent.match(/iPhone/i);
	},
	
	// itunes compabibility
	isiTunesOK: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return this.isMac(agent) || this.isWin2k(agent);
	},
	
	isQTInstalled: function() {
		
		var qtInstalled = false;
		
		if(navigator.plugins && navigator.plugins.length) {
			
			for(var i=0; i < navigator.plugins.length; i++ ) {
				
				var plugin = navigator.plugins[i];
				
				if(plugin.name.indexOf("QuickTime") > -1) { 
					qtInstalled = true; 
				}
			}
		} else {
			qtObj = false; //global variable written to by vbscript for ie
			execScript('on error resume next: qtObj = IsObject(CreateObject("QuickTimeCheckObject.QuickTimeCheck.1"))','VBScript');
			qtInstalled = qtObj;
		}
		
		return qtInstalled;
	},
	
	getQTVersion: function() {
		
		var version = "0";
		
		if (navigator.plugins && navigator.plugins.length) {
			for (var i = 0; i < navigator.plugins.length; i++) {
				
				var plugin = navigator.plugins[i];
				
				//Match: QuickTime Plugin X.Y.Z
				var match = plugin.name.match(/quicktime\D*([\.\d]*)/i);
				if (match && match[1]) {
					version = match[1];
				}
			}
		} else {
			ieQTVersion = null; //global for vbscript to write to
			
			execScript('on error resume next: ieQTVersion = (Hex(CreateObject("QuickTimeCheckObject.QuickTimeCheck.1").QuickTimeVersion)/1000000)','VBScript');

			if (ieQTVersion) {
				//only grab the major version:  7.xyz => 7
				version = (ieQTVersion +"").split(/\./)[0];
			}
		}
		
		return version;
	},
	
	isQTCompatible: function(required, actual) {
		
		function areCompatible(required, actual) {
			
			var requiredValue = parseInt(required[0])
			if (isNaN(requiredValue)) {
				requiredValue = 0;
			}
			
			var actualValue = parseInt(actual[0])
			if (isNaN(actualValue)) {
				actualValue = 0;
			}
			
			if (requiredValue == actualValue) {
				if (required.length > 1) {
					return areCompatible(required.slice(1), actual.slice(1));
				} else {
					return true;
				}
			} else if (requiredValue < actualValue) {
				return true;
			} else {
				return false;
			}
		}

		var expectedVersion = required.split(/\./);
		var actualVersion = actual ? actual.split(/\./) : this.getQTVersion().split(/\./);
		
		return areCompatible(expectedVersion, actualVersion);
		
	},
	
	isValidQTAvailable: function(required) {
		return this.isQTInstalled() && this.isQTCompatible(required)
	}
	
};

