if(typeof discover === 'undefined') {
	var discover = {};
}

/**
*
*	User agent checking for the site security page.
*
*	Breaks down the user agent string in order to determine the user's
*	operating system, browser and version and display a status message
*	based on the results. 
*/
discover.browserCheck = (function () {
	
	// Store the navigator user agent string for use
	var ua;
	
	// Access the browser APIs here
	var browserAPIs;
	
	// Hold our browser-check div here
	var checkBlock;
	
	// Store the UA's OS here since we'll need to know for the error state
	var os;
	
	/**
	 * Browser check contains our generic browser check functionality
	 * OS Specific actions are processed in seperate APIs
	 */
	var browserCheck = {
		
		browserMessageBlock : document.getElementById('browser-check'),
			
		// Store the browsers we will check against first, grouped by Operating system
		browsers : {			
			'Windows' : {
				'ie' : 7,
				'firefox' : 3,
				'safari' : 4
			},
			
			'Macintosh' : {
				'firefox' : 3,
				'safari' : 4
			}
		},	
			
		init : function () {						
			// Attach our check-trigger event handler to run browser check on click
			var checkTrigger = document.getElementById('check-trigger');
			mcd.event.add(checkTrigger, 'click', function(e){
				mcd.event.preventDefault(e);
				
				browserAPIs = discover.browserCheck;
				ua = navigator.userAgent;			
				browserCheck.parseOS();
			});
			
			// Since JS is obviously enabled, remove the JS only styles
			browserCheck.checkBlock = document.getElementById('browser-check');
			mcd.dom.removeClass(browserCheck.checkBlock, 'js-only');
			mcd.dom.addClass(browserCheck.checkBlock, 'prompt-test');
		},
		
		/**
		 * Takes the UA string and runs an initial parse to
		 * determine the user's OS
		 */
		parseOS : function () {
			var osCheck = /^[A-Za-z]+\/[0-9]+.[0-9] \(([A-Za-z]+)(;)/
			var osResults = osCheck.exec(ua);
			var osName;
						
			if(osResults) {
				osName = osResults[1];
			}
			// If the initial Regex check for OS fails, run an opera os check
			// since Opera's string differs from the others
			else {				
				if( ua.indexOf('Windows') > -1) osName = 'Windows';
				if( ua.indexOf('Macintosh') > -1) osName = 'Macintosh';							
			}			
			
			// Check for valid mobile browser first
			if(osName === 'iPhone' || browserCheck.checkAndroid()) {			
				browserCheck.checkPass();
				return true;
			}
			
			// If it's one of the OS's we're checking against, proceed accordingly			
			if(browserCheck.browsers[osName]) {							
				browserCheck.os = osName;
				// Find out what browser we're running
				browserCheck.checkForBrowser(osName);
			}
			// If the UA returns 'compatible' check if run an IE check right away
			else if(osName === 'compatible') {			
				
				browserCheck.os = 'Windows';
				browserCheck.processIE();
			}else {
				browserCheck.genericFail();
			}
		},
		
		/**
		 * Check browsers based on what OS the user is running
		 */
		checkForBrowser : function (os) {
			var osBrowsers = browserCheck.browsers[os];
			var api;			
			var validBrowser = false;
			
			for(var browser in osBrowsers) {						
				api = browserAPIs[browser + 'Check'];							
				if(api.isBrowser()) {					
					if( api.checkVersion(osBrowsers[browser]) ) {						
						validBrowser = true;
						break;
					}
				}														
			}
			
			if(validBrowser) {
				browserCheck.checkPass();
			} else {
				browserCheck.checkFail();
			}				
		},
		
		/**
		 * Display the message for users who have a good browser
		 */
		checkPass : function () {			
			browserCheck.clearClasses();
			mcd.dom.addClass(browserCheck.checkBlock, 'passed-test');
		},
		
		/**
		 * Display a fail message and options for a user
		 */
		checkFail : function () {
			browserCheck.clearClasses();
			mcd.dom.addClass(browserCheck.checkBlock, 'failed-test');
			mcd.dom.addClass(browserCheck.checkBlock, browserCheck.os.toLowerCase() + '-os');
		},
		
		/**
		 * Display a generic failing message when an unknown OS/Browser is found
		 */
		genericFail : function () {
			browserCheck.clearClasses();
			mcd.dom.addClass(browserCheck.checkBlock, 'failed-generic');
		},
		
		/**
		 * A separate means for determining IE since
		 * it's OS does not show up as Windows, but instead Compatible
		 */
		processIE : function () {
			var validBrowser = false;
			if(ieCheck.isBrowser()) {				
				if(ieCheck.checkVersion(browserCheck.browsers['Windows'].ie)) {					
					browserCheck.checkPass();													
				}
				else{
					browserCheck.checkFail();
				}
			} else {
				browserCheck.genericFail();
			}
			
		},
		
		/**
		 * Clear the block of any classes
		 */
		clearClasses : function () {
			browserCheck.checkBlock.className = '';
		},
		
		/**
		 * Generic Android OS check
		 */
		checkAndroid : function () {
			return ua.indexOf('Android') !== -1;
		}
		
	};
	
	var firefoxCheck = {
		browserReg : new RegExp("([A-Za-z]+/[0-9]+.[0-9]+)", "g"),
		
		// Store the regex results since the same string is used for version checking as well
		regParseResults : null,
		
		isBrowser : function () {
			var regResults = ua.match(firefoxCheck.browserReg)[2];
			
			if(regResults === null || regResults === undefined) return false;
			
			regResults = regResults.split('/');
						
			/*
			 * Only store the results in our firefoxCheck object if
			 * it indeed is the user's browser
			 */			
			if(regResults[0] === 'Firefox') {
				firefoxCheck.regParseResults = regResults;				
				return true;
			}					
		},
		
		checkVersion : function (version) {			
			if(firefoxCheck.regParseResults === null) {
				firefoxCheck.isBrowser();
			}
			
			var versionInfo = firefoxCheck.regParseResults[1];
			var delPosition = versionInfo.indexOf('.');
			versionInfo = versionInfo.slice(0, delPosition);
			
			return versionInfo >= version;
		}
	};
	
	var ieCheck = {
		browserReg : new RegExp("(MSIE [0-9]+.[0-9])", "g"),
		regResults : null,
		
		isBrowser : function () {
			ieCheck.regResults = ua.match(ieCheck.browserReg);
			
			if(ieCheck.regResults === null) return false;
			
			var browserString = ieCheck.regResults[0].split(' ')[0];
			
			return browserString === 'MSIE';
		},
		
		checkVersion : function (version) {
			var versionString = ieCheck.regResults[0].split(' ')[1];
			var delPosition = versionString.indexOf('.');			
			versionString = versionString.slice(0, delPosition);
			
			return versionString >= version;
		}
	};
	
	var safariCheck = {
		browserReg : new RegExp("([A-Za-z]+/[0-9]+.[0-9]+)", "g"),
		regResults : null,
		
		isBrowser : function () {
			safariCheck.regResults = ua.match(safariCheck.browserReg);
			
			if(safariCheck.regResults === null) return false;
			
			// Make sure it passes the initial Safari check before we worry about Chrome
			if(safariCheck.isSafari()) {				
				return safariCheck.notChrome();
			}
			
			return false;					
		},			
		
		checkVersion : function (version) {
			var versionString = safariCheck.regResults[2];
			versionString = versionString.split('/')[1];
			
			var delPosition = versionString.indexOf('.');
			versionString = versionString.slice(0, delPosition);
			
			return versionString >= version;
		},
		
		/**
		 * Generic check for safari browser, we need multiple checks
		 * since Chrome returns a Safari string as well
		 */
		isSafari : function () {			
			var safariString = safariCheck.regResults[3];
			
			// Make sure the index in the array even exists
			if(!safariString) return false;
			
			safariString = safariString.split('/');			
			return safariString[0] === 'Safari';
		},
		
		/**
		 * Since Chrome appears to use a 'Safari' string in it's 
		 * UA string we need to make sure this is really Safari and not Chrome
		 */
		notChrome : function () {
			var safariString = safariCheck.regResults[2];
			safariString = safariString.split('/');
			
			return safariString[0] !== 'Chrome';
		}
	}
		
	// Ready? Go!
	mcd.dom.ready(function () {		
		browserCheck.init();
	});
	
	/**
	 * Public API
	 */
	return {
		'ieCheck' : ieCheck,
		'firefoxCheck' : firefoxCheck,		
		'safariCheck' : safariCheck
	}

})();


