
//
//		-- (c)	Copyright John Page	2007 --	
//



// =================================
//		Browser	detect
// =================================
function browserIsIE()
{  var browserName=navigator.appName; 
   var res=  (browserName=="Microsoft Internet Explorer")
   return res;
}



// =======================================================================
//		Initialize the page.  Called from the onload handler of	most pages
// =======================================================================
function initPage(param)
{	if( isHosted() ) turnon();
	return;	 //disabled.  No longer	used

//On IE, install the two bookmarking commands on the second	command	line
if(browserIsIE() &&	isHosted() ) //only	IE has this	I believe
  {	var	cmdDiv = document.getElementById('commandRow2');  //name of	second command row
	if(cmdDiv) //fail safe if it happens to	be missing
	  {	cmdDiv.innerHTML +=	"<a	 class='navCmd3' href='javascript:bookmarkPageIE()'>Bookmark this page</a>";
		cmdDiv.innerHTML +=	"<a	 class='navCmd3' href='javascript:bookmarkSiteIE()'>Bookmark this site</a>";
	  }
  }
}


function isHosted()
// returns true	if the site	is hosted on a web server.	False if it	is hosted on
// a file system.
{  var loc = location.href.toLowerCase(); 
   return (loc.substring(0,4) == "http");
}


function myUrl()
// returns the url of this page
{ return (window.location.href);
}


function turnoff()
{ document.getElementById("support2").style.color="blue";
  setTimeout("turnon()", 3000);
}


function turnon()
{
  document.getElementById("support2").style.color="yellow";
  setTimeout("turnoff()", 3000);
}






// =================================
//		Search Engine routines
// =================================

function validateKeyword(arg)

//	Checks 'keyword' against a list	of known good keywords.
//	If it matches or nearly	matches	one	of them, the index of the keyword is returned.
//	Otherwise -1 is	returned.

{  var keyword = arg.toLowerCase();
   var smap	= mapOf(keyword); 
   var dmap, closestWordIndex, bestScore=999, thisWord;

   for (var	wordIndex=0;  wordIndex<dict.length;  wordIndex++)
   {  thisWord = dict[wordIndex];
	  if (thisWord == keyword)	
		 return	wordIndex;
	  else
		{ dmap = mapOf(thisWord);
		  errors = compare(dmap, smap);
		  if(errors	< bestScore)
			{ bestScore	= errors;
			  closestWordIndex = wordIndex;
			}
		}
   }
   var shortest	= Math.min(keyword.length ,	dict[closestWordIndex].length);
   var allowableError =	2 +	shortest/2;	
   if (bestScore < allowableError )	return closestWordIndex; else return -1;
}


function mapOf(s)
  {	var	c,	map	= new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
	for	( var i=0; i<s.length; i++)
	  {	c=s.charCodeAt(i);
		if(c>=97 &&	c<=122)	 //	a ..z
			map[c-97]++; 
	  }
	return map;
  }


function compare(dmap, smap)
{ var errors=0;
  for (var i=0;	i<26; i++)
	{  errors += Math.abs(dmap[i]-smap[i]);
	}
  return errors;
}


function doSearch()
{  var inSubDir	= document.getElementById('subdir');
   var prefix ="";
   if (inSubDir)  prefix ="../";
   
   var arg = document.getElementById("searchArg").value;
   var result =	validateKeyword(arg);
   if (result == -1)  
	  document.location.href = prefix +	"common/notfound.html?"+arg;
   else
	  document.location.href = prefix +	"keywordindices/"+dict[result]+".html?"+arg;
}


function createTitle(dest)
// Stuff title into	missing	search page
{
	var	urlStr = window.location.href;
	var	paramLoc = urlStr.indexOf("?");
	if(paramLoc>0)
	  var searchStr	= urlStr.substr(urlStr.indexOf("?")+1);
	else
	  var searchStr	= "??";
	document.getElementById(dest).innerHTML	= "Search for <span	class='searchWord'>" +searchStr+ "</span>&nbsp;	found no entries";
}






// =================================
//		Nav	bar	helpers
// =================================


function checkForEnterKey(e)
   { var key = window.event	? e.keyCode	: e.which;
	 if(key==13) doSearch();
   }


function bookmarkPageIE()
// IE only:	create a bookmark for this page
{ if( window.external )	// it's	IE
	 {	window.external.AddFavorite(document.location, document.title);	
	 }	
}


function bookmarkSiteIE()
// IE only:	create a bookmark for this site
{ if( window.external )	// it's	IE
	 {	window.external.AddFavorite("http://www.mathopenref.com", "Math	Open Reference"); 
	 }	
}




// =================================
//		Question hide/reveal
// =================================

function reveal(obj)
{  document.getElementById(obj).style.visibility='visible';
}


function swap(me, obj)
{ me.style.display="none";
  document.getElementById(obj).style.display="inline";
}



// =================================
//		 Timer functions
// =================================


function millisecTimeStamp()
//returns a	new	millsecond time	stamp
{  var t = new Date();
   return t.getTime();
}





// =================================
//		 Pop up	calculator
// =================================

function startCalc()
{ //
  // disabled until	we figure out the focus	problems
  window.open('calculator2.html', 'mywindow', 'width=380,height=400,status=no,resizable=no,scrollbars=no')
 // location.href="calculator.html";
}


function calcRollon(obj)
//when mouse rolls on
{ obj.style.textDecoration='underline';	
  obj.style.color='blue' 
}


function calcRolloff(obj)
{ obj.style.textDecoration='none'; 
  obj.style.color='#966'
}



// ===============================
// Flash loader
// ===============================

var appletLoadRq;
var widthLoadRq;
var heightLoadRq;

function loadFlash(applet, width, height)
{	

//save the request params to page globals
appletLoadRq = applet;
widthLoadRq  = width;
heightLoadRq = height;
	
 AC_FL_RunContent(
			'codebase',	'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
			'width', width,
			'height', height,
		//	'src', 'simple3d_1',
			'quality', 'high',
			'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
			'align', 'middle',
			'play',	'true',
			'loop',	'true',
			'scale', 'showall',
			'wmode', 'window',
			'devicefont', 'false',
			'id', 'flashapplet',
			'bgcolor', '#ffffff',
			'name',	'flashapplet',
			'menu',	'true',
			'allowFullScreen', 'true',
			'allowScriptAccess','always',
			'movie', 'flash/'+applet,
			'salign', ''
			); //end AC	code
}



// The following was generated by Adobe	Flash CS3 package and is 
// included	in this	file to	reduce the total number	of js files

//v1.7
// Flash Player	Version	Detection
// Detect Client Browser type
// Copyright 2005-2007 Adobe Systems Incorporated.	All	rights reserved.
var	isIE  =	(navigator.appVersion.indexOf("MSIE") != -1) ? true	: false;
var	isWin =	(navigator.appVersion.toLowerCase().indexOf("win") != -1) ?	true : false;
var	isOpera	= (navigator.userAgent.indexOf("Opera")	!= -1) ? true :	false;

function ControlVersion()
{
	var	version;
	var	axo;
	var	e;

	// NOTE	: new ActiveXObject(strFoo)	throws an exception	if strFoo isn't	in the registry

	try	{
		// version will	be set for 7.X or greater players
		axo	= new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version	= axo.GetVariable("$version");
	} catch	(e)	{
	}

	if (!version)
	{
		try	{
			// version will	be set for 6.X players only
			axo	= new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			
			// installed player	is some	revision of	6.0
			// GetVariable("$version") crashes for versions	6.0.22 through 6.0.29,
			// so we have to be	careful. 
			
			// default to the first	public version
			version	= "WIN 6,0,21,0";

			// throws if AllowScripAccess does not exist (introduced in	6.0r47)		
			axo.AllowScriptAccess =	"always";

			// safe	to call	for	6.0r47 or greater
			version	= axo.GetVariable("$version");

		} catch	(e)	{
		}
	}

	if (!version)
	{
		try	{
			// version will	be set for 4.X or 5.X player
			axo	= new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version	= axo.GetVariable("$version");
		} catch	(e)	{
		}
	}

	if (!version)
	{
		try	{
			// version will	be set for 3.X player
			axo	= new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version	= "WIN 3,0,18,0";
		} catch	(e)	{
		}
	}

	if (!version)
	{
		try	{
			// version will	be set for 2.X player
			axo	= new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version	= "WIN 2,0,0,11";
		} catch	(e)	{
			version	= -1;
		}
	}
	
	return version;
}



// JavaScript helper required to detect	Flash Player PlugIn	version	information
function GetSwfVer(){
	// NS/Opera	version	>= 3 check for Flash plugin	in plugin array
	var	flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length >	0) {
		if (navigator.plugins["Shockwave Flash 2.0"] ||	navigator.plugins["Shockwave Flash"]) {
			var	swVer2 = navigator.plugins["Shockwave Flash	2.0"] ?	" 2.0" : "";
			var	flashDescription = navigator.plugins["Shockwave	Flash" + swVer2].description;
			var	descArray =	flashDescription.split(" ");
			var	tempArrayMajor = descArray[2].split(".");			
			var	versionMajor = tempArrayMajor[0];
			var	versionMinor = tempArrayMajor[1];
			var	versionRevision	= descArray[3];
			if (versionRevision	== "") {
				versionRevision	= descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision	= versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision	= versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision	= versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			}
			var	flashVer = versionMajor	+ "." +	versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash	4
	else if	(navigator.userAgent.toLowerCase().indexOf("webtv/2.6")	!= -1) flashVer	= 4;
	// WebTV 2.5 supports Flash	3
	else if	(navigator.userAgent.toLowerCase().indexOf("webtv/2.5")	!= -1) flashVer	= 3;
	// older WebTV supports	Flash 2
	else if	(navigator.userAgent.toLowerCase().indexOf("webtv")	!= -1) flashVer	= 2;
	else if	( isIE && isWin	&& !isOpera	) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}



// When	called with	reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0)	{
		if(isIE	&& isWin &&	!isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray		  =	versionStr.split(" ");	// ["WIN", "2,0,0,11"]
			tempString		  =	tempArray[1];			// "2,0,0,11"
			versionArray	  =	tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray	  =	versionStr.split(".");
		}
		var	versionMajor	  =	versionArray[0];
		var	versionMinor	  =	versionArray[1];
		var	versionRevision	  =	versionArray[2];

			// is the major.revision >=	requested major.revision AND the minor version >= requested	minor
		if (versionMajor > parseFloat(reqMajorVer))	{
			return true;
		} else if (versionMajor	== parseFloat(reqMajorVer))	{
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if	(versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision	>= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}



function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
	return src.replace(/\?/, ext+'?'); 
  else
	return src + ext;
}



function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
  var str =	'';
  if (isIE && isWin	&& !isOpera)
  {
	str	+= '<object	';
	for	(var i in objAttrs)
	{
	  str += i + '="' +	objAttrs[i]	+ '" ';
	}
	str	+= '>';
	for	(var i in params)
	{
	  str += '<param name="' + i + '" value="' + params[i] + '"	/> ';
	}
	str	+= '</object>';
  }
  else
  {
	str	+= '<embed ';
	for	(var i in embedAttrs)
	{
	  str += i + '="' +	embedAttrs[i] +	'" ';
	}
	str	+= '> </embed>'; 
  }

  document.write(str);
}


function AC_FL_RunContent()
{
var	ret	=  AC_GetArgs (arguments, ".swf" , "movie" , "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ,	"application/x-shockwave-flash"	);
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}



function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret =	new	Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0;	i <	args.length; i=i+2){
	var	currArg	= args[i].toLowerCase();	

	switch (currArg){	
	  case "classid":
		break;
	  case "pluginspage":
		ret.embedAttrs[args[i]]	= args[i+1];
		break;
	  case "src":
	  case "movie":	
		args[i+1] =	AC_AddExtension(args[i+1], ext);
		ret.embedAttrs["src"] =	args[i+1];
		ret.params[srcParamName] = args[i+1];
		break;
	  case "onafterupdate":
	  case "onbeforeupdate":
	  case "onblur":
	  case "oncellchange":
	  case "onclick":
	  case "ondblclick":
	  case "ondrag":
	  case "ondragend":
	  case "ondragenter":
	  case "ondragleave":
	  case "ondragover":
	  case "ondrop":
	  case "onfinish":
	  case "onfocus":
	  case "onhelp":
	  case "onmousedown":
	  case "onmouseup":
	  case "onmouseover":
	  case "onmousemove":
	  case "onmouseout":
	  case "onkeypress":
	  case "onkeydown":
	  case "onkeyup":
	  case "onload":
	  case "onlosecapture":
	  case "onpropertychange":
	  case "onreadystatechange":
	  case "onrowsdelete":
	  case "onrowenter":
	  case "onrowexit":
	  case "onrowsinserted":
	  case "onstart":
	  case "onscroll":
	  case "onbeforeeditfocus":
	  case "onactivate":
	  case "onbeforedeactivate":
	  case "ondeactivate":
	  case "type":
	  case "codebase":
	  case "id":
		ret.objAttrs[args[i]] =	args[i+1];
		break;
	  case "width":
	  case "height":
	  case "align":
	  case "vspace": 
	  case "hspace":
	  case "class":
	  case "title":
	  case "accesskey":
	  case "name":
	  case "tabindex":
		ret.embedAttrs[args[i]]	= ret.objAttrs[args[i]]	= args[i+1];
		break;
	  default:
		ret.embedAttrs[args[i]]	= ret.params[args[i]] =	args[i+1];
	}
  }
  ret.objAttrs["classid"] =	classid;
  if (mimeType)	ret.embedAttrs["type"] = mimeType;
  return ret;
}



// ======	
// Alt full screen mode for Flash needs to know window size
// =====

function openLarge()
{
  var windowOptions = "toolbar=no,,left=0,top=0,screenX=0,screenY=0,height="+screen.availHeight+",width="+screen.availWidth;
  open('http://www.mathopenref.com/fsview.html' , '_blank', windowOptions);
}


function closeLarge()
{  window.close();
}


var winWidth = 0, winHeight = 0;

function getWindowSize() {
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    winWidth = window.innerWidth;
    winHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    winWidth = document.documentElement.clientWidth;
    winHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    winWidth = document.body.clientWidth;
    winHeight = document.body.clientHeight;
  }
  //window.alert( 'Width = ' + winWidth );
  //window.alert( 'Height = ' + winHeight );
}
