
//
//		-- (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)
{	
}


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);
}




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

// dict is an array of strings present on every page that contains a list of keywords.
// The match algorithm is not a straight string compare.  To allow for spelling errors
// it uses a closeness measure.  It calculates how many A's how many B's etc in each term, and then calculates
// how off this count is.  A perfexct match will yield an error value of zero, a way off compare might produce a number of 12.
// The cutoff for no match is (2+half the length of the shortest argument).

function validateKeyword(arg)

//	Checks 'keyword' against a list	of known good keywords in dict.
//	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);
          //compare returns search distance in errors, this is augmented by diff in arg lengths
		  errors = compare(dmap, smap);
		  if(errors	< bestScore)
			{ bestScore	= errors;
			  closestWordIndex = wordIndex;
			}
		}
   }

   if (bestScore < 3 )	
       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 ="";
   var result;
   if (inSubDir)  prefix ="../";
   
   //split the search into its constituent words
   var arg = document.getElementById("searchArg").value;
   if(arg.length == 0) return;  //do nothing
   var keywordSet = arg.split(" "); 
   
   //Accept the first word that returns a match.
   //Ultimately this should return the closest word or even the one with the fewest hits
   for(var j=0; j<keywordSet.length; j++)
     {  result =	validateKeyword(keywordSet[j]); 
        if(result>=0) 
          { document.location.href = prefix +	"keywordindices/"+dict[result]+".html";
            return;
          }
     }
   
   //none was even close - fail the search.
   document.location.href = prefix +	"common/notfound.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";
}


/*
The search arg may be "isosceles trinagle"  (Second word is misspelled).
split arg into words
for each word
    if it matches or near matches a word in dict
        add it to match list
if match list is empty
    do no match routine
else
    Find the entry in match list that has the fewest entries
    go to it's page
*/



// =================================
//		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=472,height=480,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;
var htmlParams="";  //the POST params in the url  EG ?param=32&p2=john....

function loadFlash(applet, width, height)
{	

//save the request params to page globals
appletLoadRq = applet;
widthLoadRq  = width;
heightLoadRq = height;

//grab the url params and save in htmlParams.  Shift to lower case to make it case insensitive
htmlParams = document.location.search; //the part of the url after any '?' char
if (htmlParams[0]='?')  htmlParams = htmlParams.substr(1, htmlParams.length-1);  // remove the '?' sign if exists
htmlParams = htmlParams.toLowerCase();
htmlParams = htmlParams.replace(/\+/g,'%2B');

	
 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', 'transparent',
			'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 += ' <PARAM NAME=FlashVars VALUE="'+htmlParams+'">';
	str	+= ' </object>';
  }
  else
  {
	str	+= '<embed ';
	for	(var i in embedAttrs)
	{
	  str += i + '="' +	embedAttrs[i] +	'" ';
	}
	str += 'FlashVars="'+htmlParams+'"\n';
	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;
}






function openLarge(params)
{ var viewerPage = "fsview.html?" + params;
  var windowOptions = "toolbar=no,,left=0,top=0,screenX=0,screenY=0,height="+screen.availHeight+",width="+screen.availWidth;
  open(viewerPage , '_blank', windowOptions);
}


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



// ======	
// Alt full screen mode for Flash needs to know window size
// =====
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 );
}


// ======	
// Functions to handle the "save as link" cmd for function grapher
// =====
var tgtAddress;  //saved here so dest page can reach back and get it
var linkwindow;

function makeLink(linkAddress)
 { tgtAddress = linkAddress; //save in page global
   if(typeof(linkwindow)!="undefined") linkwindow.close(); //may be second call
   linkwindow =  window.open('graphlinks.html', 'mywindow', 'width=600,height=450,status=yes,resizable=true,scrollbars=yes,menubar=yes')
}

function done()
{   if(typeof(linkwindow)!="undefined") linkwindow.close();
}


