var sniffer = {
	//get browser
    'browser' : function(){
    	var t = this;
    	BrowserDetect.init();
    	var browserName = BrowserDetect.browser;
    	var browserVer = BrowserDetect.version;
    	var browserPass=false;  
    	
    	//Just update this json while updating browser supportability
    	var browserSupportJson =	{
    		'Internet Explorer' : 8,
    		'Firefox' : 6,
    		'Safari' : 5,
    		'Chrome' : 14
    	}
    	//supporting logic
    	for (var browser in browserSupportJson)	{
    		if ( browserName.indexOf(browser) != -1 && browserVer >= browserSupportJson[browser] )	{
    			browserPass = true;  
    		} 
    	}
	    return {
	      pass : browserPass,
	      info : browserName + " " + browserVer
	    }
    },
  //test cookies
  'cookie' : function(){
    var cookiePass = false;
    $.cookie("sniffer","foo");
    if ($.cookie("sniffer")){
      cookiePass = true;
    }
    $.cookie("sniffer",null);
    return {
      pass : cookiePass
    }
  },

  //test flash
  'flash' : function(){
    var flashPass = false;
    var playerVersion = swfobject.getFlashPlayerVersion();
    flashPass = (playerVersion.major >= 10);
    var flashVer = playerVersion.major + "." + playerVersion.minor + "." + playerVersion.release;
    return {
      pass : flashPass,
      info : flashVer
    }
  },

  //test java
  'java' : function(){
    var javaPass = false;
    javaPass = ( PluginDetect.isMinVersion('Java','1.4.2.15') >= 0 );
    var javaVer = PluginDetect.getVersion('Java');
    //javaPass = navigator.javaEnabled();
    javaVer = (javaVer != null) ? javaVer.replace(/,/g,".") : ""

    return {
      pass : javaPass,
      info : javaVer
    }
  },

  //test OS
  'OS' : function(){
    var OSPass = false;
    var ua = navigator.userAgent;
    if (ua.indexOf('Windows NT 6.1') > -1) {
      OSPass = true;
      thisOS = "Windows 7";
    } else	if (ua.indexOf('Windows NT 6.0') > -1) {
      OSPass = true;
      thisOS = "Windows Vista";
    } else if (ua.indexOf('Windows NT 5.2') > -1) {
      OSPass = true;
      thisOS = "Windows Server 2003 or Windows XP x64 Edition";
    } else if (ua.indexOf('Windows NT 5.1') > -1) {
      OSPass = true;
      thisOS = "Windows XP";
    } else if (ua.indexOf('Windows NT 5.01') > -1) {
      thisOS = "Windows 2000, Service Pack 1";
    } else if (ua.indexOf('Windows NT 5.0') > -1) {
      thisOS = "Windows 2000";
    } else if (ua.indexOf('Windows NT 4.0') > -1) {
      thisOS = "Windows NT 4.0";
    } else if (ua.indexOf('Win 9x 4.90') > -1) {
      thisOS = "Windows Me";
    } else if (ua.indexOf('Windows 98') > -1) {
      thisOS = "Windows 98";
    } else if (ua.indexOf('Windows 95') > -1) {
      thisOS = "Windows 95";
    } else if (ua.indexOf('Windows CE') > -1) {
      thisOS = "Windows CE";
    } else if (ua.indexOf('Mac OS X') > -1) {
      var macVer = ua.slice(ua.indexOf('Mac OS X')+8);
      macVer = macVer.slice(0,macVer.indexOf(';'));
      macVer = macVer.replace(/_/g,'.');
      var version = "";
      if(macVer.indexOf("10.6")){
        version = "Snow Leopard 10.6";
        OSPass = true;
      }else if(macVer.indexOf("10.7")){
          version = "Lion 10.7";
          OSPass = true;
      }else{
        version = macVer;
      }
      thisOS = macVer.length > 2 ? "Macintosh OS X " + version : "Macintosh OS X";
    } else if (ua.indexOf('Linux') > -1) {
      thisOS = "Linux";
    } else if (ua.indexOf('Unix') > -1) {
      thisOS = "Unix";
    } else {
      thisOS = "Unsupported Operating System";
    }

    return {
      pass : OSPass,
      info : thisOS
    }
  },

  //test popups
  'popup' : function(){
    var popupPass=false;
    var testPop = window.open("about:blank","","width=100,height=100");
    try {
      testPop.close();
      popupPass=true;
    }
    catch (e) {}
    return {
      pass : popupPass
    }
  },

  //text screen
  'screen' : function(){
    var sW = screen.width;
    var sH = screen.height;
    var screenInfo = sW + " x " + sH + " pixels"
    var screenPass = (sW >= 1024 && sH >=768);
    return {
      pass : screenPass,
      w : sW,
      h : sH,
      info : screenInfo
    }
  },
  
  'custom1' : function(){
	  var custompass = true;
	  BrowserDetect.init();
	  var browserName = BrowserDetect.browser;
	  var browserVer = BrowserDetect.version;
	  if(browserName=='Internet Explorer' && browserVer=='9' && PluginDetect.isMinVersion('Java','1.6.0.25')<=0 )	{
		  custompass = false;
	  }
	  return {
	      pass : custompass
	  }
  }

}

function fullSniff (idArr) {
  $("table.snifferResults tr").removeClass("warning");
  var primaryFail, secondaryFail = false;
  for (var i=0;i<idArr.length;i++) {
    var currSniff = idArr[i];
    var sniffResult = sniffer[currSniff]();
    var statusHTML;
    var $info = $("#" + currSniff + "Result td.sniffReturn");

    if (typeof sniffResult.info != 'undefined'){
      $("#" + currSniff + "Result td.sniffReturn").html(sniffResult.info);
    }

    if (sniffResult.pass) {
      statusHTML = "<span class='sniffPass'>Yes</span>";
      switch(currSniff) {
        case 'browser' :
          if (sniffResult.info.match(/Safari/)) {
            $(".ieHelp, .ffHelp").hide();
          }
          if (sniffResult.info.match(/Explorer/)) {
            $(".saHelp, .ffHelp").hide();
          }
          if (sniffResult.info.match(/Firefox/)) {
            $(".saHelp, .ieHelp").hide();
          }
          break;
        case 'cookie' :
          $info.html("Cookies accepted");
          break;
        case 'popup' :
          $info.html("Pop-up windows allowed");
          break;
        case 'flash' :
          $info.html("Installed (Version " + sniffResult.info + ")");
          break;
        case 'java' :
          if (sniffResult.info.length > 0) {
            $info.html("Installed (Version " + sniffResult.info + ")");
          }
          else {
            $info.html("Installed");
          }
          break;
        case 'OS' :
          if (sniffResult.info.match(/Mac/)) {
            $("li.ieLink").hide();
          }
          break;
        case 'screen' :
          $info.html(sniffResult.w + " x " + sniffResult.h + " pixels");
          break;
      }
    }
    else {
      statusHTML = "<span class='sniffFail'>No <a href='#" + currSniff + "Help'>More info</a></span>";
      $("#" + currSniff + "Result").addClass("warning");
      $("#" + currSniff + "Help").css("display","block");
      switch(currSniff) {
        case 'browser' :
          primaryFail = true;
          break;
        case 'cookie' :
          $info.html("Does not allow cookies");
          primaryFail = true;
          break;
        case 'popup' :
          $info.html("Pop-up windows disabled");
          break;
        case 'flash' :
          $info.html("Not installed");
          break;
        case 'java' :
          $info.html("Not installed");
          break;
      }
      secondaryFail = true;
    }
    $("#" + currSniff + "Result td.sniffStatus").html(statusHTML);
  }
  //notification
  $("#sniffNotify").css("display","block");
  if (primaryFail) {
    $("#sniffNotify").html("<h5>Your computer needs to be adjusted to use this site.</h5><p>Click More Info below to address the problems. In a lab? Get help from an administrator.</p>").addClass("notifyFail");
  } else if (secondaryFail) {
    $("#sniffNotify").html("<h5>You can still use this site, but some features may not work correctly.</h5><p>Click More Info below to address the problems. In a lab? Get help from an administrator.</p>").addClass("notifyWarn");
  } else  {
    $("#sniffNotify").html("<h5>Your computer is fully compatible.</h5><p>You can use this site without any changes.</p>").addClass("notifyPass");
  }

  //add curvy corners for r3a
  if ($("#sniffNotify .notifyInner").length < 1) {
    $("#sniffNotify").wrapInner("<div class='notifyInner'></div>").corner({
      tl: { radius: 7 },
      tr: { radius: 7 },
      bl: { radius: 7 },
      br: { radius: 7 },
      antiAlias: true,
      autoPad: false,
      validTags: ["div"]
    });
  }

}

function quickSniff(idArr) {
  var sniffPass=true;
  var warningHTML = "";
  var hasClose=false;
  //clear cookie if new login
  if($('#showSnifferOnce').val() == 'true')	{
	  snifferCache.clearSnifferCookie();
  }
  for (var i=0;i<idArr.length;i++) {
    var currSniff = idArr[i];
    //var sniffResult = sniffer[currSniff]();
    var sniffResult = snifferCache.getSnifferResult(currSniff);

    if (!sniffResult.pass) {
      switch(currSniff) {
        case 'browser' :
          warningHTML += "<p class='notfline'><span class='notfHeader'>Please use a supported browser.</span>";
          if(!hasClose){warningHTML+='<span class="notfClose" onclick="javascript:$(\'#sniffNotify\').hide();">close this message</span>';hasClose=true;}
          warningHTML+="</p>";
          break;
        case 'cookie' :
          warningHTML += "<p class='notfline'><span class='notfHeader'>Make sure your browser accepts cookies.</span>";
          if(!hasClose){warningHTML+='<span class="notfClose" onclick="javascript:$(\'#sniffNotify\').hide();">close this message</span>';hasClose=true;}
          warningHTML+="</p>";
          break;
        case 'flash' :
          warningHTML += "<p class='notfline'><span class='notfHeader'>Please update your Flash plug-in.</span>";
          if(!hasClose){warningHTML+='<span class="notfClose" onclick="javascript:$(\'#sniffNotify\').hide();">close this message</span>';hasClose=true;}
          warningHTML+="</p>";
          break;
        case 'popup' :
          warningHTML += "<p class='notfline'><span class='notfHeader'>Make sure your pop-up blocker is turned off.</span>";
          if(!hasClose){warningHTML+='<span class="notfClose" onclick="javascript:$(\'#sniffNotify\').hide();">close this message</span>';hasClose=true;}
          warningHTML+="</p>";
          break;
        case 'java' :
          warningHTML += "<p class='notfline'><span class='notfHeader'>Please update your Java plug-in.</span>";
          if(!hasClose){warningHTML+='<span class="notfClose" onclick="javascript:$(\'#sniffNotify\').hide();">close this message</span>';hasClose=true;}
          warningHTML+="</p>";
          break;
        case 'custom1' :
        	var str = "<p class='notfline'><span class='notfHeader @@CLASS@@'>If you are planning on using the Question Editor, please make sure that you are using Internet Explorer 9 and the latest version of Java. You can download the latest version of Java <a class='notfHighlighter' target='_blank' href='http://www.java.com/en/download/manual.jsp'>here</a>.</span>";
            if(!hasClose){str=str.replace('@@CLASS@@','snfmsgfix');str+='<span class="notfClose" onclick="javascript:$(\'#sniffNotify\').hide();">close this message</span>';hasClose=true;}
            else{str=str.replace('@@CLASS@@','');}
            str+="</p>";warningHTML+=str;
            break;
      }
      sniffPass=false;
    }
  }
  if (warningHTML != "") {
    if ( $("#sniffNotify").hasClass('notifyWarn') ) {
      $("#sniffNotify").show().find(".notfContent").prepend(warningHTML);
    } else {
      $("#sniffNotify").show().find(".notfContent").prepend(warningHTML);
    }
  }
  return sniffPass;
}

$(document).ready(function(){

  $('a.refreshCheck').click(function() {
	snifferCache.clearSnifferCookie();
    document.location.reload(true);
    return false;
  });

  //Re-direct (moved to in-line html)
  /*
  if ($("#pageWrap").length != 0) {
    var redirect=quickSniff(["browser","cookie"]);
    if (redirect){
      document.location.replace('instructor2.html')
    }
  }
  */

  //Course List - Moved to inline
  /*if ($("#mycourses").length != 0) {
    quickSniff(["flash","popup","java"]);

  }*/

  //Assignment List Moved to inline
  /*if( ( $('#studentAssignments').length != 0 ) && ( $('#instructorViewToggle').length == 0 ) ) {
    quickSniff(["flash","popup"]);
  }*/

  //Full troubleshooting
  if ($("#primarySniff").length != 0) {
    var timeout = setTimeout(function(){
      if (window.opener && !window.opener.closed) {
          window.opener.blur();
      }
      window.focus();
    },1000);
    $("div.helpBlock, #resultsWrap").css("display","none");
    $("#sniffLoading,#header p.closeButton").css("display","block");

    $("a.testAgain").click(function(){
      if (window.opener && !window.opener.closed) {
          window.opener.document.location.reload(true);
      }
      document.location.reload(true);
      return false;
    });

    //var fullSniff = ["browser","cookie","flash","java","OS","popup","screen"];
    //fullStatus(fullSniff);

    //add curvy corners for r3a
    $(".reSniff").corner({
      tl: { radius: 7 },
      tr: { radius: 7 },
      bl: { radius: 7 },
      br: { radius: 7 },
      antiAlias: true,
      autoPad: true,
      validTags: ["div"]
    });

  }
 // displayBannerMessageSecHome();
});

$(window).load(function(){
  if ($("#primarySniff").length != 0) {
    fullSniff(["browser","cookie","flash","java","OS","popup","screen"]);
    $("#sniffLoading").css("display","none");
    $("#resultsWrap").css("display","block");
  }
});
/* Changes specially made for banner advertisement on various login pages. To Be removed in future : START */
function displayBannerMessageSecHome() {
 var html = "<div class='notificationInfo_msg clearfix' id='bannerAdv'><div class='notfTop_msg'><div class='notfTopInner_msg'></div></div><div class='notfCenter_msg'>";
 html = html + "<div class='newsWrapper'><p class='notificationclose'><a href='javascript:;' onclick='javascript:$(\"#bannerAdv\").hide();'>Close this message</a></p><p class='newsIcon'>";
 html = html + "NEWSFLASH! McGraw-Hill and Blackboard Announce Partnership for Deeper Integration. <a href='javascript:;' onclick='window.open(\"http://www.prnewswire.com/news-releases/blackboard-and-mcgraw-hill-partner-to-integrate-mcgraw-hill-digital-content--tools-into-blackboards-learning-management-systems-98445079.html\");'>Read press release.";
 html = html + "</a></p></div></div><div class='notfBottom_msg'><div class='notfBottomInner_msg'></div></div></div>";
 $("#hintBlock").after(html);
}
/* Changes specially made for banner advertisement on various login pages. To Be removed in future : END */


var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	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)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			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"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]
};

var snifferCache = {
	'getSnifferResult' : function(toSniff)	{
		var t = this;		
		//check in cookie
		var result = t.getSnifferCache(toSniff);
		//boolean result says either cookie not present or value in cookie not present. so get value & update cookie
		if(typeof result == 'boolean' && !result)	{
			result = sniffer[toSniff]();
			t.updateSnifferCache(toSniff,result);			
		}
		//value presents in cookie. convert it into appropriate json, backward compatibility
		else	{
			result = (result == 'true') ? true : false;
			result = {
				'pass' : result,
				'info' : ''
			}
		}
		return result;
	},
	'getSnifferCache' : function(toSniff)	{
		var t = this;
		var result = false;
		var cookieValue = t.getSnifferCookie();
		if(cookieValue != 'false')	{		
			var sniff_arr = cookieValue.split(',');
			for(var i=0;i<sniff_arr.length;i++)	{
				if(sniff_arr[i].indexOf(toSniff) != -1)	{
					result = sniff_arr[i].split('~')[1];
				}
			}
		}
		return result;
	},
	'updateSnifferCache' : function(toSniff,result)	{
		var t = this;
		var cookieValue = t.getSnifferCookie();
		var sniff_val = toSniff + '~' + result.pass;
		if(cookieValue == 'false')	{		
			t.setSnifferCookie(sniff_val);
		}
		else	{
			var new_sniff_arr = new Array();
			var old_sniff_arr = cookieValue.split(',');
			for(var i=0;i<old_sniff_arr.length;i++)	{
				if(old_sniff_arr[i].indexOf(toSniff) == -1 && old_sniff_arr[i] != '')	{
					new_sniff_arr.push(old_sniff_arr[i]);
				}
			}
			new_sniff_arr.push(sniff_val);
			t.setSnifferCookie(new_sniff_arr.toString());
		}
	},
	'setSnifferCookie' : function(cookieValue)	{
		var cookieName = 'SNIFFER';
		document.cookie = escape(cookieName) + "=" + escape(cookieValue) + "; path=/";
	},
	'getSnifferCookie' : function()	{
		var cookieName = 'SNIFFER';
		var cookieValue = 'false'; //cookie returns string
		var exp = new RegExp (escape(cookieName) + "=([^;]+)");
		if (exp.test (document.cookie + ";")) {
			exp.exec (document.cookie + ";");
			cookieValue = unescape(RegExp.$1);
		}
		return cookieValue;
	},
	'clearSnifferCookie' : function()	{
		var cookieName = 'SNIFFER';
		document.cookie = escape(cookieName) + "=; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/";
	}
}
