// -------------------------------------------------------------------------------
// Dimension Engine main page javascript functions.  (c) 2008 All rights reserved.
// -------------------------------------------------------------------------------


// Global variables
var outHtml = '';
var cursorStartPos = 0;
var cursorEndPos = 0;
var showInstruct = 1;



//---------------------------------------------------------------------------------
// Ajax interface
//---------------------------------------------------------------------------------

//--------------------
// Calculate driver functions 
//--------------------
function calculate() {
  document.getElementById("working").style.display = "";
  ShowOutput();
  ajaxFunction();
  clearText();

}


//--------------------
// Ajax routine 
//--------------------
function ajaxFunction() {
  // Create xmlHttp request object
  var xmlHttp;
  try {   // Firefox, Opera 8.0+, Safari    
    xmlHttp=new XMLHttpRequest();
  } catch (e) {  
    try {   // Internet Explorer
        xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        alert("Your browser does not support AJAX!");
        return false;
      }
    }
  }
  // Process returned string
  xmlHttp.onreadystatechange=function() {
    if(xmlHttp.readyState==4) {  
      str = processString(xmlHttp.responseText);
      document.getElementById("working").style.display = "none";
      displayOutput(str);
    }
  }
  // Process input string
  var inString = escape(parent.frames['inputTextFrame'].document.getElementById('inputText').value); 
  // Encode plus character
  var strArray = inString.split("+");
  inString = strArray.join("%2b");
  inString = "inputText="+inString;
  // replace return char from IE '%0D' with newline '%0A'
  for(var i=0; i <= inString.length; i++) {
  		if (inString.charCodeAt(i) == 37) {
  			if (inString.charCodeAt(i+1) == 48) {
  				if (inString.charCodeAt(i+2) == 68) {
  					inString = setChars(inString,i+2,'A');
  				}
  			}
  		}
 	}
  // Send xmlHttp request
  var url="http://www.dimensionengine.com/cgi-bin/dimeng.cgi";
  xmlHttp.open("POST",url,true);
  xmlHttp.send(inString);
}

//---------------------------------------------------------------------------------
// Input frame functions
//---------------------------------------------------------------------------------



//--------------------
// Insert text into Input tab
//--------------------
function handleAppendRequest(textToInsert) {
	ShowInput();
	var myField=parent.frames['inputTextFrame'].document.getElementById('inputText');
	if (document.selection) { //IE support
    	myField.focus();
    	sel = document.selection.createRange();
    	sel.text = textToInsert;
  	} else if (myField.selectionStart || myField.selectionStart == 0) { //MOZILLA support
      	myField.value = myField.value.substring(0, cursorStartPos)
                  + textToInsert
                  + myField.value.substring(cursorEndPos, myField.value.length);
 	 } else {
   	myField.value += textToInsert;
  	}
}


//--------------------
// Shows initial tab frame
//--------------------
function loadTextExample(){
	noShowExamples = readCookie('examplesPref');
	if (noShowExamples==0) {
		document.getElementById('IntroText').style.display = '';
		// ShowExamp();
		ShowInput();
	} else {
		document.checkBoxForm.showExamplesCheck.checked = true;
		createCookie('examplesPref', 1, 30);
		document.getElementById('IntroText').style.display = 'none';
		ShowInput();
		parent.frames['inputTextFrame'].document.getElementById('inputText').focus();
	}
}

//--------------------
// Clear Input or Output frames
//--------------------
function clearText(){
  if (document.getElementById("inputDiv").style.display == "none") {
    //clear output
    outHtml = "";
    parent.frames['outputText'].document.write(outHtml);
    parent.frames['outputText'].document.close();
  } else {
    //clear input
    parent.frames['inputTextFrame'].document.inputTextForm.inputText.value = "";
	parent.frames['inputTextFrame'].document.getElementById('inputText').focus();
  }
}


//--------------------
// Keep track of cursor location in Input tab
//--------------------
function SetCursorLoc(){
	var myField=parent.frames['inputTextFrame'].document.getElementById('inputText');
	if (myField.selectionStart || myField.selectionStart == 0) { //MOZILLA support}
  		cursorStartPos = myField.selectionStart;
    	cursorEndPos = myField.selectionEnd;
    }
}

//--------------------
// Calculate if Shift-Return entered
//--------------------
function typingInInputError(event) {
	if (event.shiftKey == true) {
		if (checkEnter(event)) {
			calculate();
		}
	}
}

//--------------------
// Returns true if Return key pressed
//--------------------
function checkEnter(e){ //e is event object passed from function invocation
	var characterCode 

	if(e && e.which){ //if which property of event object is supported (NN4)
		e = e
		characterCode = e.which //character code is contained in NN4's which property
	} else	{
		e = event
		characterCode = e.keyCode //character code is contained in IE's keyCode property
	}

	if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
		return true
	} else	{
		return false 
	}
}


//---------------------------------------------------------------------------------
// Output frame functions
//---------------------------------------------------------------------------------

//--------------------
// Writes output 
//--------------------
function displayOutput(str){
  outHtml = "<body onKeyDown='javascript:window.parent.typingInOutputError(event);'>"
  outHtml += "<span style='font-family:Courier; font-size:12px;'>"
  outHtml += str;
  outHtml += "</span>";
  outHtml += "</body>";
  parent.frames['outputText'].document.write(outHtml);
  parent.frames['outputText'].document.close();
}

//--------------------
// Returns error if typing in Output frame
//--------------------
function typingInOutputError(event) {
	modifierKey = false;
	if (event.metaKey == true) modifierKey = true;
	if (event.altKey == true) modifierKey = true;
	if (event.ctrlKey == true) modifierKey = true;
	if (modifierKey == false) {
		alert("Please select the Input tab for editing.");
	}
}

//---------------------------------------------------------------------------------
// Textbook pages functions
//---------------------------------------------------------------------------------

function loadExample() {
	expand('Arrow');
	string = window.parent.frames['ExampFrame'].document.body.innerHTML;
	firstChar = string.indexOf(">") +1;  // Grab text between <pre> tags
	lastChar = string.lastIndexOf("<");
	dataString = string.substring(firstChar, lastChar);
	parent.frames['inputTextFrame'].document.getElementById('inputText').value= dataString;
	ShowInput();
}

function loadChapter() {
	expand('Arrow');
	string = window.parent.frames['ChaptFrame'].document.body.innerHTML;
	firstChar = string.indexOf(">") +1;  // Grab text between <pre> tags
	lastChar = string.lastIndexOf("<");
	dataString = string.substring(firstChar, lastChar);
	parent.frames['inputTextFrame'].document.getElementById('inputText').value= dataString;
	ShowInput();
}

function expand(thistag) {
   document.getElementById(thistag).style.display='';
}

function collapse(thistag) {
   document.getElementById(thistag).style.display='none';
}



//---------------------------------------------------------------------------------
// Report Bug Function
//---------------------------------------------------------------------------------
function ReportBug(){
	reportBugWindow = window.open ("mainpages/reportBug.html","reportBugWindow", "status=1, width=600")
}




//---------------------------------------------------------------------------------
// String Utilities
//---------------------------------------------------------------------------------


//--------------------
// Colorizes output string
//--------------------
function processString(str){
	strArray = str.split("\n");
	outStr="";
	for (var i in strArray){
  		if (strArray[i].charAt(0)=='[') {
			outStr +="<font color='black'>"
     	} else if (strArray[i].indexOf('ERROR') > -1) {
			outStr +="<font color='red'>"
     	} else {
			outStr +="<font color='blue'>&nbsp&nbsp&nbsp&nbsp "
     	};
  		outStr += strArray[i] + "</font><br>";
  	}
	return outStr;
}



//--------------------
// Sets character in string "s" at location "at" to "c"
//--------------------
function setChars (s, at, c) { 
return s.substr(0,at) + c.substr(0,s.length-at) + s.substr(at + c.length);
}


//---------------------------------------------------------------------------------
// Cookie Functions
//---------------------------------------------------------------------------------


function setInstructCookie() {
	checked = document.checkBoxForm.showExamplesCheck.checked;
	if (checked) {
		createCookie('examplesPref', 1, 30);
		document.getElementById('IntroText').style.display = 'none';
	} else {
		createCookie('examplesPref', 0, 30);
		document.getElementById('IntroText').style.display = '';
	}
}


function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return 0;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}



//---------------------------------------------------------------------------------
// Display/Hide Tabs
//---------------------------------------------------------------------------------


//--------------------
// Switch to Input Frame
//--------------------
function ShowInput() {
	document.getElementById('inputTab').className="activeTab";
	document.getElementById('inputTabDiv1').className="active1";
	document.getElementById('inputTabDiv2').className="active2";
	document.getElementById('inputTabDiv3').className="active3";
	document.getElementById('inputButton').className="activeTabText";
    document.getElementById('inputButton').innerHTML="&nbsp;&nbsp;Input&nbsp;&nbsp;";
    document.getElementById("inputDiv").style.display = "";
    
	document.getElementById('outputTab').className="inactiveTab";
	document.getElementById('outputTabDiv1').className="inactive1";
	document.getElementById('outputTabDiv2').className="inactive2";
	document.getElementById('outputTabDiv3').className="inactive3";
	document.getElementById('outputButton').className="inactiveTabText";
    document.getElementById('outputButton').innerHTML="&nbsp;&nbsp;<u>Output</u>&nbsp;&nbsp;";
    document.getElementById("outputDiv").style.display = "none";

    document.getElementById("calculateButton").style.visibility="";
    document.getElementById("clearButton").style.visibility="";
 
  	try {
		document.getElementById('exampTab').className="inactiveTab";
		document.getElementById('exampTabDiv1').className="inactive1";
		document.getElementById('exampTabDiv2').className="inactive2";
		document.getElementById('exampTabDiv3').className="inactive3";
		document.getElementById('exampButton').className="inactiveTabText";
    	document.getElementById('exampButton').innerHTML="&nbsp;&nbsp;<u>Examples</u>&nbsp;&nbsp;";
    	document.getElementById("exampDiv").style.display = "none";

 		document.getElementById('unitsTab').className="inactiveTab";
		document.getElementById('unitsTabDiv1').className="inactive1";
		document.getElementById('unitsTabDiv2').className="inactive2";
		document.getElementById('unitsTabDiv3').className="inactive3";
		document.getElementById('unitsButton').className="inactiveTabText";
    	document.getElementById('unitsButton').innerHTML="&nbsp;&nbsp;<u>Units</u>&nbsp;&nbsp;";
   		document.getElementById("unitsDiv").style.display = "none";

 		document.getElementById('functionsTab').className="inactiveTab";
		document.getElementById('functionsTabDiv1').className="inactive1";
		document.getElementById('functionsTabDiv2').className="inactive2";
		document.getElementById('functionsTabDiv3').className="inactive3";
		document.getElementById('functionsButton').className="inactiveTabText";
    	document.getElementById('functionsButton').innerHTML="&nbsp;&nbsp;<u>Functions</u>&nbsp;&nbsp;";
    	document.getElementById("functionsDiv").style.display = "none";
	} catch(e) {}

	document.getElementById('inputTextFrame').focus();
}

//--------------------
// Switch to Output Frame
//--------------------
function ShowOutput() {
	document.getElementById('inputTab').className="inactiveTab";
	document.getElementById('inputTabDiv1').className="inactive1";
	document.getElementById('inputTabDiv2').className="inactive2";
	document.getElementById('inputTabDiv3').className="inactive3";
	document.getElementById('inputButton').className="inactiveTabText";
    document.getElementById('inputButton').innerHTML="&nbsp;&nbsp;<u>Input</u>&nbsp;&nbsp;";
    document.getElementById("inputDiv").style.display = "none";

	document.getElementById('outputTab').className="activeTabOut";
	document.getElementById('outputTabDiv1').className="active1";
	document.getElementById('outputTabDiv2').className="active2";
	document.getElementById('outputTabDiv3').className="active3";
	document.getElementById('outputButton').className="activeTabText";
    document.getElementById('outputButton').innerHTML="&nbsp;&nbsp;Output&nbsp;&nbsp;";
    document.getElementById("outputDiv").style.display = "";

    document.getElementById("calculateButton").style.visibility="hidden";
    document.getElementById("clearButton").style.visibility="hidden";
     
 	try {
		document.getElementById('exampTab').className="inactiveTab";
		document.getElementById('exampTabDiv1').className="inactive1";
		document.getElementById('exampTabDiv2').className="inactive2";
		document.getElementById('exampTabDiv3').className="inactive3";
		document.getElementById('exampButton').className="inactiveTabText";
    	document.getElementById('exampButton').innerHTML="&nbsp;&nbsp;<u>Examples</u>&nbsp;&nbsp;";
    	document.getElementById("exampDiv").style.display = "none";
    
 		document.getElementById('unitsTab').className="inactiveTab";
		document.getElementById('unitsTabDiv1').className="inactive1";
		document.getElementById('unitsTabDiv2').className="inactive2";
		document.getElementById('unitsTabDiv3').className="inactive3";
		document.getElementById('unitsButton').className="inactiveTabText";
    	document.getElementById('unitsButton').innerHTML="&nbsp;&nbsp;<u>Units</u>&nbsp;&nbsp;";
    	document.getElementById("unitsDiv").style.display = "none";

 		document.getElementById('functionsTab').className="inactiveTab";
		document.getElementById('functionsTabDiv1').className="inactive1";
		document.getElementById('functionsTabDiv2').className="inactive2";
		document.getElementById('functionsTabDiv3').className="inactive3";
		document.getElementById('functionsButton').className="inactiveTabText";
   	 	document.getElementById('functionsButton').innerHTML="&nbsp;&nbsp;<u>Functions</u>&nbsp;&nbsp;";
    	document.getElementById("functionsDiv").style.display = "none";
	} catch(e) {}
	try {
		collapse('Arrow');
	} catch(e) {}


}
 
 
//--------------------
// Switch to Examples Frame
//--------------------
function ShowExamp() {
	document.getElementById('inputTab').className="inactiveTab";
	document.getElementById('inputTabDiv1').className="inactive1";
	document.getElementById('inputTabDiv2').className="inactive2";
	document.getElementById('inputTabDiv3').className="inactive3";
	document.getElementById('inputButton').className="inactiveTabText";
    document.getElementById('inputButton').innerHTML="&nbsp;&nbsp;<u>Input</u>&nbsp;&nbsp;";
    document.getElementById("inputDiv").style.display = "none";

	document.getElementById('outputTab').className="inactiveTab";
	document.getElementById('outputTabDiv1').className="inactive1";
	document.getElementById('outputTabDiv2').className="inactive2";
	document.getElementById('outputTabDiv3').className="inactive3";
	document.getElementById('outputButton').className="inactiveTabText";
    document.getElementById('outputButton').innerHTML="&nbsp;&nbsp;<u>Output</u>&nbsp;&nbsp;";
    document.getElementById("outputDiv").style.display = "none";

    document.getElementById("calculateButton").style.visibility="hidden";
    document.getElementById("clearButton").style.visibility="hidden";

	document.getElementById('exampTab').className="activeTab";
	document.getElementById('exampTabDiv1').className="active1";
	document.getElementById('exampTabDiv2').className="active2";
	document.getElementById('exampTabDiv3').className="active3";
	document.getElementById('exampButton').className="activeTabText";
    document.getElementById('exampButton').innerHTML="&nbsp;&nbsp;Examples&nbsp;&nbsp;";
    document.getElementById("exampDiv").style.display = "";

 	document.getElementById('unitsTab').className="inactiveTab";
	document.getElementById('unitsTabDiv1').className="inactive1";
	document.getElementById('unitsTabDiv2').className="inactive2";
	document.getElementById('unitsTabDiv3').className="inactive3";
	document.getElementById('unitsButton').className="inactiveTabText";
    document.getElementById('unitsButton').innerHTML="&nbsp;&nbsp;<u>Units</u>&nbsp;&nbsp;";
    document.getElementById("unitsDiv").style.display = "none";

 	document.getElementById('functionsTab').className="inactiveTab";
	document.getElementById('functionsTabDiv1').className="inactive1";
	document.getElementById('functionsTabDiv2').className="inactive2";
	document.getElementById('functionsTabDiv3').className="inactive3";
	document.getElementById('functionsButton').className="inactiveTabText";
    document.getElementById('functionsButton').innerHTML="&nbsp;&nbsp;<u>Functions</u>&nbsp;&nbsp;";
    document.getElementById("functionsDiv").style.display = "none";

}

//--------------------
// Switch to Units Frame
//--------------------
function ShowUnits() {
	document.getElementById('inputTab').className="inactiveTab";
	document.getElementById('inputTabDiv1').className="inactive1";
	document.getElementById('inputTabDiv2').className="inactive2";
	document.getElementById('inputTabDiv3').className="inactive3";
	document.getElementById('inputButton').className="inactiveTabText";
    document.getElementById('inputButton').innerHTML="&nbsp;&nbsp;<u>Input</u>&nbsp;&nbsp;";
    document.getElementById("inputDiv").style.display = "none";

	document.getElementById('outputTab').className="inactiveTab";
	document.getElementById('outputTabDiv1').className="inactive1";
	document.getElementById('outputTabDiv2').className="inactive2";
	document.getElementById('outputTabDiv3').className="inactive3";
	document.getElementById('outputButton').className="inactiveTabText";
    document.getElementById('outputButton').innerHTML="&nbsp;&nbsp;<u>Output</u>&nbsp;&nbsp;";
    document.getElementById("outputDiv").style.display = "none";

    document.getElementById("calculateButton").style.visibility="hidden";
    document.getElementById("clearButton").style.visibility="hidden";

	document.getElementById('exampTab').className="inactiveTab";
	document.getElementById('exampTabDiv1').className="inactive1";
	document.getElementById('exampTabDiv2').className="inactive2";
	document.getElementById('exampTabDiv3').className="inactive3";
	document.getElementById('exampButton').className="inactiveTabText";
    document.getElementById('exampButton').innerHTML="&nbsp;&nbsp;<u>Examples</u>&nbsp;&nbsp;";
    document.getElementById("exampDiv").style.display = "none";

 	document.getElementById('unitsTab').className="activeTab";
	document.getElementById('unitsTabDiv1').className="active1";
	document.getElementById('unitsTabDiv2').className="active2";
	document.getElementById('unitsTabDiv3').className="active3";
	document.getElementById('unitsButton').className="activeTabText";
    document.getElementById('unitsButton').innerHTML="&nbsp;&nbsp;Units&nbsp;&nbsp;";
    document.getElementById("unitsDiv").style.display = "";

 	document.getElementById('functionsTab').className="inactiveTab";
	document.getElementById('functionsTabDiv1').className="inactive1";
	document.getElementById('functionsTabDiv2').className="inactive2";
	document.getElementById('functionsTabDiv3').className="inactive3";
	document.getElementById('functionsButton').className="inactiveTabText";
    document.getElementById('functionsButton').innerHTML="&nbsp;&nbsp;<u>Functions</u>&nbsp;&nbsp;";
    document.getElementById("functionsDiv").style.display = "none";

}

//--------------------
// Switch to Functions Frame
//--------------------
function ShowFunctions() {
	document.getElementById('inputTab').className="inactiveTab";
	document.getElementById('inputTabDiv1').className="inactive1";
	document.getElementById('inputTabDiv2').className="inactive2";
	document.getElementById('inputTabDiv3').className="inactive3";
	document.getElementById('inputButton').className="inactiveTabText";
    document.getElementById('inputButton').innerHTML="&nbsp;&nbsp;<u>Input</u>&nbsp;&nbsp;";
    document.getElementById("inputDiv").style.display = "none";

	document.getElementById('outputTab').className="inactiveTab";
	document.getElementById('outputTabDiv1').className="inactive1";
	document.getElementById('outputTabDiv2').className="inactive2";
	document.getElementById('outputTabDiv3').className="inactive3";
	document.getElementById('outputButton').className="inactiveTabText";
    document.getElementById('outputButton').innerHTML="&nbsp;&nbsp;<u>Output</u>&nbsp;&nbsp;";
    document.getElementById("outputDiv").style.display = "none";

    document.getElementById("calculateButton").style.visibility="hidden";
    document.getElementById("clearButton").style.visibility="hidden";

	document.getElementById('exampTab').className="inactiveTab";
	document.getElementById('exampTabDiv1').className="inactive1";
	document.getElementById('exampTabDiv2').className="inactive2";
	document.getElementById('exampTabDiv3').className="inactive3";
	document.getElementById('exampButton').className="inactiveTabText";
    document.getElementById('exampButton').innerHTML="&nbsp;&nbsp;<u>Examples</u>&nbsp;&nbsp;";
    document.getElementById("exampDiv").style.display = "none";

 	document.getElementById('unitsTab').className="inactiveTab";
	document.getElementById('unitsTabDiv1').className="inactive1";
	document.getElementById('unitsTabDiv2').className="inactive2";
	document.getElementById('unitsTabDiv3').className="inactive3";
	document.getElementById('unitsButton').className="inactiveTabText";
    document.getElementById('unitsButton').innerHTML="&nbsp;&nbsp;<u>Units</u>&nbsp;&nbsp;";
    document.getElementById("unitsDiv").style.display = "none";

 	document.getElementById('functionsTab').className="activeTab";
	document.getElementById('functionsTabDiv1').className="active1";
	document.getElementById('functionsTabDiv2').className="active2";
	document.getElementById('functionsTabDiv3').className="active3";
	document.getElementById('functionsButton').className="activeTabText";
    document.getElementById('functionsButton').innerHTML="&nbsp;&nbsp;Functions&nbsp;&nbsp;";
    document.getElementById("functionsDiv").style.display = "";

}
