/**
 * The MediaDevice class represents the Media Device Management Services.
 * An object of this class can't be created.
 * This would be static class and hence using the class name all properties of this class can be accesible.
 *
 * @author jitendra.shrivastava@rsystems.com
 * @version 0.1
 */

 /**
  * The class is used to represent the Media Device Management Services
  * @param {void}
  */


 function SystemInfo(){

 }// End of SystemInfo Class

/**
 * Represents the structure for software and hardware details.
 * @type Json Structure
 */
SystemInfo.userSystemDetail = {};

/**
 * This holds the browser category. For all IE browser, the value would be 'IE'
 * and for other browser like mozilla, netscape etc, the value would be 'Non-IE'
 * @type String
 */
SystemInfo.browserCategory = null;

SystemInfo.javaVersion = null;
SystemInfo.osName = null;
SystemInfo.osVersion = null;

SystemInfo.supprtedOS = new Array();

SystemInfo.supprtedOS[0] ='Microsoft Windows';
SystemInfo.supprtedOS[1] ='MacOS';
//SystemInfo.supprtedOS[2] ='Linux';
//SystemInfo.supprtedOS[3] ='UNIX';


var rows = 7; // define the size of SystemInfo.supprtedBrowser array
var cols = 2;

SystemInfo.supprtedBrowser = new Array(cols);

for (var i = 0; i < rows; i++)
	SystemInfo.supprtedBrowser[i] = new Array(cols);

SystemInfo.supprtedBrowser[0]['name'] ='Internet Explorer';
SystemInfo.supprtedBrowser[0]['version'] ='6'; 

SystemInfo.supprtedBrowser[1]['name'] ='Internet Explorer';
SystemInfo.supprtedBrowser[1]['version'] ='7'; 

SystemInfo.supprtedBrowser[2]['name'] ='Firefox';
SystemInfo.supprtedBrowser[2]['version'] ='3.5';

SystemInfo.supprtedBrowser[3]['name'] ='Mozilla';
SystemInfo.supprtedBrowser[3]['version'] ='';

SystemInfo.supprtedBrowser[4]['name'] ='Internet Explorer';
SystemInfo.supprtedBrowser[4]['version'] ='8';

SystemInfo.supprtedBrowser[5]['name'] ='Safari';
SystemInfo.supprtedBrowser[5]['version'] ='';
/*
SystemInfo.supprtedBrowser[6]['name'] ='Netscape';
SystemInfo.supprtedBrowser[6]['version'] ='';

SystemInfo.supprtedBrowser[7]['name'] ='Opera';
SystemInfo.supprtedBrowser[7]['version'] ='';
*/


/**
 * The method is used to get the Browser name of client machine
 * @param {void)
 * @reutrn {String} -  Browser Name
 */
SystemInfo.getBrowserName = function(){


	var browserName = BrowserDetect.browser;

	if(browserName == "Internet Explorer"){
		SystemInfo.browserCategory = "IE";
	}
	else{
		SystemInfo.browserCategory = "Non-IE";
	}
	
	// new check added for google chorme
	var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
	if(is_chrome){
		browserName = "Google Chrome";
	}

	return browserName;
}

/**
 * The method is used to get the Browser Version of client machine
 * @param {void)
 * @reutrn {String} -  Browser version
 */
SystemInfo.getBrowserVersion = function(){

	var browserVersion = BrowserDetect.version;
	return browserVersion;
}

SystemInfo.setOSVersion = function(osversion){
	SystemInfo.osVersion = osversion;
}

SystemInfo.setOSName = function(osname){
	SystemInfo.osName = osname;
}

/**
 * The method is used to get the Operating system name of client machine
 * @param {void)
 * @reutrn {String} -  OS verson
 */
SystemInfo.getOSVersion = function(){
	return SystemInfo.osVersion;
}

/**
 * The method is used to get the Operating system name of client machine
 * @param {void)
 * @reutrn {String} -  OS name
 */
SystemInfo.getOSName = function(){
	return SystemInfo.osName;
}

SystemInfo.setJavaVersion = function(javaversion){
	SystemInfo.javaVersion = javaversion;
}

/**
 * The method is used to get the Java version of client machine
 * @param {void)
 * @reutrn {String} -  Java version
 */
SystemInfo.getJavaVersion = function(){

	return SystemInfo.javaVersion;
}

/**
 * The method is used to check if java is enabled on client machine
 * @param {void)
 * @reutrn {Boolean} -  true if java is enable otherwise false
 */
SystemInfo.checkJavaEnabled = function(){

	var isJavaEnable = window.navigator.javaEnabled();
	return isJavaEnable;
}


/**
 * The method is used to get the Resources details of client machine
 * @param {String) - userType
 * @reutrn {JSON Structure} -  userSystemDetail
 */
SystemInfo.getResourcesDetails = function(){

	var browserName = SystemInfo.getBrowserName();
	var browserVersion = SystemInfo.getBrowserVersion();
	var osName = SystemInfo.getOSName();
	var osVersion = SystemInfo.getOSVersion();
	//var javaVersion = SystemInfo.getJavaVersion();


	var jsonStr = "";

	jsonStr = "userSystemDetail : [{";
	//jsonStr += "userType: '"+ userType + "',";
	jsonStr += "browserName: '" + browserName + "',";
	jsonStr += "browserVersion: '"+ browserVersion + "',";
	jsonStr += "osName: '"+ osName + "',";
	jsonStr += "osVersion: '"+ osVersion + "'";
	///jsonStr += "javaVersion: '"+ javaVersion + "'";
	jsonStr += "}]";

	SystemInfo.userSystemDetail = eval(jsonStr);
	return SystemInfo.userSystemDetail;
}

var BrowserDetect = {

	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "unknown version";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1) {
					this.identity = data[i].identity;
					return data[i].identity;
				}
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		var dat = "";
		if(this.identity=="Safari") {
			dat = dataString.substring((index+this.versionSearchString.length));
			var index1 = dat.indexOf(" ");
			dat = dat.substring(0,index1);
			return dat;
		}
		else {
			dat= dataString.substring(index+this.versionSearchString.length+1);
			var index1 = dat.indexOf(" ");
			if(index1>-1)
				dat = dat.substring(0,index1);
			dat = stripAlphaChars(dat);
			return dat;
		}
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			versionSearch: "Version/",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Internet Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	]
};


SystemInfo.getMaxValue = function(arrPass){

	var cnt = 0;
	for(var i=0;i<arrPass.length;i++){
		if(arrPass[i]>arrPass[cnt])
		cnt=i;
	}
	return arrPass[cnt];
}


SystemInfo.init = function (){
	// set browser info
	BrowserDetect.init();
	var OSName = "Unknown OS";
	// set os info

	if (navigator.appVersion.indexOf("Win")!=-1 || navigator.platform.indexOf("Win")!=-1) OSName="Microsoft Windows";
	if (navigator.appVersion.indexOf("Mac")!=-1 || navigator.platform.indexOf("Mac")!=-1) OSName="MacOS";
	if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
	if (navigator.appVersion.indexOf("Linux")!=-1 || navigator.platform.indexOf("Linux")!=-1) OSName="Linux";

	SystemInfo.setOSName(OSName);
	//SystemInfo.setOSVersion();
}

SystemInfo.isAppSupport = function (){

	var isSupport = false;
	var browserName = SystemInfo.getBrowserName();
	var browserVersion = SystemInfo.getBrowserVersion();
	var OSName = SystemInfo.getOSName();
	var OSVersion = SystemInfo.getOSName();
	var isOS = false;
	var isBrowser = false;

	/**
	 * special check for MAC/Firefox
	 */	
	
	if (OSName=='MacOS'){				
		if (browserName == 'Firefox'){
			return false;
		}else if (navigator.appVersion.indexOf("10_5") == -1 && navigator.appVersion.indexOf("10_6") == -1){
			return false;			
		}
	}
	
	// check for OS
	for (var i=0; i<SystemInfo.supprtedOS.length; i++){

		if(SystemInfo.supprtedOS[i] == OSName){
			isOS = true;
		}
		if(isOS == true)
			break;
	}

	// check for browser
	for (var i=0; i<SystemInfo.supprtedBrowser.length; i++){
		if(browserName == 'Internet Explorer') {
				if(typeof(SystemInfo.supprtedBrowser[i]['name']) != 'undefined' && SystemInfo.supprtedBrowser[i]['name'] == browserName && typeof(SystemInfo.supprtedBrowser[i]['version']) != 'undefined' && SystemInfo.supprtedBrowser[i]['version'] == parseFloat(browserVersion)){
					isBrowser = true;
				}
		}
		else if(browserName=="Firefox") {
			if(SystemInfo.supprtedBrowser[i]['name'] == browserName) {
				var res = SystemInfo.CompareVersions(browserVersion, SystemInfo.supprtedBrowser[i]['version']);
				if(res==1) {
					isBrowser = true;
				}
			}
		}
		else if(browserName=="Safari") {
			isBrowser = true;
		}
		else
			isBrowser = false;
	}

	if(isOS == true && isBrowser == true)
		isSupport = true;
	else
		isSupport = false;

	return isSupport;

}

SystemInfo.isBrowserSupport = function (){

	var browserName = SystemInfo.getBrowserName();
	var browserVersion = SystemInfo.getBrowserVersion();
	var OSName = SystemInfo.getOSName();
	var isBrowser = false;

	/**
	 * special check for MAC/Firefox
	 */	
	
	// check for browser
	for (var i=0; i<SystemInfo.supprtedBrowser.length; i++){
		if(browserName == 'Internet Explorer') {
				if(typeof(SystemInfo.supprtedBrowser[i]['name']) != 'undefined' && SystemInfo.supprtedBrowser[i]['name'] == browserName && typeof(SystemInfo.supprtedBrowser[i]['version']) != 'undefined' && SystemInfo.supprtedBrowser[i]['version'] == parseFloat(browserVersion)){
					isBrowser = true;
				}
		}
		else if(browserName=="Firefox" && OSName!='MacOS') {
			if(SystemInfo.supprtedBrowser[i]['name'] == browserName) {
				var res = SystemInfo.CompareVersions(browserVersion, SystemInfo.supprtedBrowser[i]['version']);
				if(res==1) {
					isBrowser = true;
				}
			}
		}
		else if(browserName=="Safari") {
			isBrowser = true;
		}
		else{
			isBrowser = false;
			break;
		}
	}

	return isBrowser;

}


SystemInfo.isOSSupport = function (){

	var OSName = SystemInfo.getOSName();
	var OSVersion = SystemInfo.getOSName();
	var isOS = false;

	/**
	 * special check for MAC/Firefox
	 */

	if (OSName=='MacOS'){
		//if (browserName == 'Firefox'){
		
		if (this.getBrowserName() == 'Firefox'){
			if(navigator.userAgent.indexOf("Mac OS X 10.5") == -1 && navigator.userAgent.indexOf("Mac OS X 10.6") == -1)
				return false;
		}else if (navigator.appVersion.indexOf("10_5") == -1 && navigator.appVersion.indexOf("10_6") == -1){
			return false;			
		}
	}
	
	// check for OS
	for (var i=0; i<SystemInfo.supprtedOS.length; i++){

		if(SystemInfo.supprtedOS[i] == OSName){
			isOS = true;
		}
		if(isOS == true)
			break;
	}

	return isOS;
}

SystemInfo.CompareVersions = function (firstVersion, secondVersion){

}
// returns 1 if firstVersion>= secondVersion else returns 0.
SystemInfo.CompareVersions = function (firstVersion, secondVersion){
	fVersionArr = firstVersion.split(".");
	sVersionArr = secondVersion.split(".");
	
	var l = Math.min(fVersionArr.length, sVersionArr.length);
	var firstGreater = 1;
	if(sVersionArr.length>l)
		firstGreater = 1;

	for(var i=l-1; i>=0;i--) {
		if((parseFloat(fVersionArr[i])>parseFloat(sVersionArr[i])) || (parseFloat(fVersionArr[i])==parseFloat(sVersionArr[i]) && firstGreater == 1)) {
			firstGreater = 1;
		}
		else {
			firstGreater = 0;
		}


	}
	return firstGreater;
}

SystemInfo.isCookieSupport = function (){
	var cookieEnabled=(navigator.cookieEnabled)? true : false;
    //if navigator,cookieEnabled is not supported
    if (typeof navigator.cookieEnabled=="undefined" && !cookieEnabled){
        document.cookie="testcookie";
        cookieEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false;
    }
    if (cookieEnabled)
		return true;
	else
		return false;
}


// initialize the class to fecth the details
SystemInfo.init();
