/**
 * 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) {
        if(this._isWebKit === undefined) {
            var agent = userAgent || this.getAgent();
            this._isWebKit =  !!agent.match(/AppleWebKit/i);
            this.isWebKit = function() {return this._isWebKit};
        }
        return this._isWebKit;
	},
    
	isSafari2: function(userAgent) {
        if(this._isSafari2 === undefined) {
            if(!this.isWebKit()) this._isSafari2 = false;
            else {
                var ua = navigator.userAgent.toLowerCase(); 
               var version= parseInt(parseFloat( ua.substring( ua.lastIndexOf('safari/index.html') + 7 ) ));
                this._isSafari2 = (version >= 419);
            }
            this.isSafari2 = function() {return this._isSafari2};
        }
        return this._isSafari2;
	},
	
	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);
	},

	//deprecated, use isMobile
	isiPhone: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return this.isMobile(agent);
	},
	
	isMobile: function(userAgent) {
		var agent = userAgent || this.getAgent();
		return this.isWebKit(agent) && agent.match(/Mobile/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 if (typeof(execScript) != 'undefined') {
			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 if (typeof(execScript) != 'undefined') {
			ieQTVersion=null;

			execScript('on error resume next: ieQTVersion = CreateObject("QuickTimeCheckObject.QuickTimeCheck.1").QuickTimeVersion','VBScript');

			if(ieQTVersion){
			    version = (ieQTVersion >> 24).toString(16);
			}
		}
		
		return version;
	},
	
	isQTCompatible: function(required, actual) {
		
		function areCompatible(required, actual) {
			
			var requiredValue = parseInt(required[0], 10);
			if (isNaN(requiredValue)) {
				requiredValue = 0;
			}
			
			var actualValue = parseInt(actual[0], 10);
			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);
	}
	
};
