var contentPage;
var pageNumber;
var page1;
var page2;
var nextPage;
var prevPage;

if (typeof(version) == "undefined") version = 1;
if (typeof(skippedPages) == "undefined") skippedPages = new Array();

//update values when page is loaded --------------
updateCalculatedValues();

if (mode == "content") {

  //clear parent's printable content to prevent conflict with control updating on help page
  parent.setContent("");

  //update controls in parent frame
  parent.updateControls(pageName, zoom, layout, query, email, pdfFile, xlsFile, pdfFileSS);
  
} else {
  
  if (isMSIE) { //detect if browser supports onbeforeprint
    window.onbeforeprint = function() {
      //write inner frame content into outer frame before printing
      setContent(window.contentframe.getContent());
      
      if (contentPage) {
        //reduce image size slightly for cleaner printing
        //calculate new size
        var calculatedImageWidth = (imageWidth*parseFloat(zoom)*0.9);
        if (layout == "double") {
          calculatedImageWidth /= 2.2;
          //resize second page image
          document.getElementById("page2").style.width = Math.round(calculatedImageWidth) + "px";
        }
        //resize first page image
        document.getElementById("page1").style.width = Math.round(calculatedImageWidth) + "px";
      }
    }
  }

}

function onloadAll() {
  //called when page is loaded
  
  if (mode == "controls") { //page is being rendered in controls mode

    //reconfigure controls for additional javascript functionality

    //search box ---------------------------------

    var searchBox = document.getElementById("search-field");

    //add focus/blur functionality
    if (searchBox) {
      searchBox = searchBox.firstChild;
      searchBox.onfocus = function() {if (this.value==searchDefaultText) this.value="";};
      searchBox.onblur = function() {if (this.value=="") this.value=searchDefaultText;};
    }

    //search -------------------------------------

    //prevent reloading of control frame
    setFormTarget("search-form");
    
    //chapter select -----------------------------
    
    //remove go button
    var chapterGoButton = document.getElementById("chapter-button");
    chapterGoButton.style.display="none";
    
   
      
      sel = document.getElementById("chapter");
      
      var markup = '<div class="textfield-left"></div>'
        + '<div id="drop-field" class="textfield"><input title="' + sel.title + '" type="text" readonly="readonly" value="Select Chapter"/></div>'
        + '<a title="' + sel.title + '" class="dropdown-button"></a>';
    
      var markup2 = "";
      for (var i = 0; i < sel.length;i++) {
        var opt = sel.options[i];
        if (opt.value != "") markup2 += '<a href="javascript:document.getElementById(\'chapter\').value=' + opt.value + ';'
          + 'document.getElementById(\'chapter-select-form\').submit();">' + opt.text + '</a>';
      }
      
      var drop = sel.parentNode;
      sel.style.display = "none";
      drop.innerHTML += markup;
      drop.onclick = function (e) {
       
	   if (!e) e = window.event;
        var panel = document.getElementById("dropdown-panel");
        if (panel.style.display=="none") {
		
		if (isFirefox || isSafari || isOpera || isNetscape ) {  
		panel.style.top =  document.getElementById("drop-field").offsetTop + "px";
          panel.style.left =  document.getElementById("drop-field").offsetLeft-2 + "px";
		  }
		  else
		  {
		panel.style.top = 1+ document.getElementById("chapter").offsetParent.offsetParent.offsetParent.offsetTop + "px";
          panel.style.left = 12 + document.getElementById("chapter").offsetParent.offsetParent.offsetLeft + "px";
		  
		 
		  }
		  
          panel.style.display="block";
     
			var t;                       //for closing dropdown incase of mouse out
	 panel.onmouseover=function() {
	  clearTimeout(t);
	  panel.style.display="block";
	  }
	  panel.onmouseout=function()
	  {
if(! isNetscape)	
{
	t=setTimeout("callme()",500);
}	  
	  }

	  panel.onclick=function() {
	 
	 		document.getElementById("dropdown-panel").style.display="none";
	 }
	 panel.parentNode.onclick=function() {
	 
	 	document.getElementById("dropdown-panel").style.display="none";
	 }
	 document.getElementsByTagName("iframe")[0].contentWindow.document.onclick=function()
	 {
	 	document.getElementById("dropdown-panel").style.display="none";
	 
	 }
	 
	 window.onclick = function () {
    
		document.getElementById("dropdown-panel").style.display="none";
           window.onclick = "";
          }
        } else panel.style.display="none";
        e.returnValue = false;
        e.cancelBubble = true;
      }     
      
  
	  window.onload = function() {
	  

	  
        var dropMenu = document.createElement("div");
        dropMenu.id = "dropdown-panel";
        dropMenu.style.display = "none";
        dropMenu.innerHTML = markup2;

    document.getElementById("header-container").parentNode.appendChild(dropMenu);

	}

     

    //prevent reloading of control frame
    setFormTarget("chapter-select-form");

    //page select --------------------------------

    //prevent reloading of control frame
    setFormTarget("page-select-form"); 

    //printing -----------------------------------

    //enable printing
    setButtonState("print-icon", true)
    
    //zooming ------------------------------------
    
    //enable zoom-without-page-reload
    setButtonLink("zoomin-button","javascript:setZoom(zoom * zoomFactor);");
    setButtonLink("zoomout-button","javascript:setZoom(zoom / zoomFactor);");
    setButtonLink("zoom-icon","javascript:setZoom(1.0);");
    
    //arrow key navigation ---------------------------
      
    document.onkeydown = function (e) {
      if (!e) e = event;
      if (e.keyCode == 37) {

        //go back a page
        contentframe.location.href = getButtonLink("back-button");    

      } else if (e.keyCode == 39) {

        //go forward a page
        contentframe.location.href = getButtonLink("forward-button");

      }
    }
    
    //disable keydown events for text fields
    clearTextFieldKeydown("page-field");
    clearTextFieldKeydown("search-field");
    
  } else { //page is being rendered as content only
    
    //update help page control appearance
    if (pageName == "help") {
    
      //remove go button
      var chapterExampleButton = document.getElementById("chapter-button");
      chapterExampleButton.style.display="none";
      
      if (isFirefox && false) { // disabled due to frames problem
      
        //THIS IS DISABLED (see false above) so i'm not adding supersections to it.
        //If you reactivate it look at the other Select Chapter above and copy anything it has.
      
        var markup = '<input type="hidden" id="chapter-example" name="chapter-example" value=""/><div class="textfield-left"></div>'
          + '<div id="drop-field" class="textfield"><input type="text" readonly="readonly" value="Select Chapter"/></div>'
          + '<a class="dropdown-button" ></a><div id="dropdown-panel" ></div>';
      
        var drop = document.getElementById("chapter-example").parentNode;
        drop.innerHTML = markup;
      
      } else {
      
        //widen popup
        var exampleChapterPopup = document.getElementById("chapter-example");
        exampleChapterPopup.style.width = "226px";
      
      }
      
    }
    
    //write inner frame content into outer frame
    if (!isMSIE) { //detect if browser supports onbeforeprint
      parent.setContent(getContent());
    }
    
    //link thumbnail links to associated text links
    for (var i=1;i<=totalPages;i++) {
      var imgId = document.getElementById("thumbimg" + i);
      if (imgId != null) {
      
        //set hover functions for image link
        imgId.onmouseover = new Function("setHover('thumbtxt" + i + "');");
        imgId.onmouseout = new Function("unsetHover('thumbtxt" + i + "');");
        //set links to target inner frame
        imgId.target = "_self";
        imgId.href += "&mode=content";
        
        //set hover functions for text link
        var txtId = document.getElementById("thumbtxt" + i);
        txtId.onmouseover = new Function("setHover('thumbimg" + i + "');");
        txtId.onmouseout = new Function("unsetHover('thumbimg" + i + "');");
        //set links to target inner frame
        txtId.target = "_self";
        txtId.href += "&mode=content";
      }
    }
    
    //arrow key navigation ---------------------------
      
    document.onkeydown = function (e) {
      if (!e) e = event;
      if (e.keyCode == 37) {
      
        //go back a page
        document.location.href = parent.getButtonLink("back-button");    

      } else if (e.keyCode == 39) {

        //go forward a page
        document.location.href = parent.getButtonLink("forward-button");

      }
    }
    
    //disable keydown events for text fields
    if (email == "feedback") {
      clearTextFieldKeydown("from");
      clearTextFieldKeydown("subject");
      clearTextFieldKeydown("body");
    } else if (email == "friend") {
      clearTextFieldKeydown("from");
      clearTextFieldKeydown("address");
    }
    
    if (email == "feedback" || email == "friend") {
      if (document.getElementById("email-form")) document.getElementById("email-form").onsubmit = function () {return validateEmailForm();};
    }
    
  }
}


function callme(obj)
{
 document.getElementById("dropdown-panel").style.display="none";

}
function setHover(id) {
  //set hover state for given element
  document.getElementById(id).className = "hover"; 
}

function unsetHover(id) {
  //remove hover state for given element
  document.getElementById(id).className="";
}

function setToggleButtonState(id, toggled) {
  //set toggle button state
  var button = document.getElementById(id);
  button.childNodes[0].style.display = (toggled)? "none" : "";
  if (button.childNodes[1]) button.childNodes[1].style.display = (toggled)? "" : "none";
}

function setButtonState(id, enabled) {
  //set button state 
  var button = document.getElementById(id);
  button.childNodes[0].style.display = (enabled)? "" : "none";
  if (button.childNodes[1]) button.childNodes[1].style.display = (enabled)? "none" : "";
}

function setButtonLink(id,href) {
  //set button href
  var buttonLink = document.getElementById(id).firstChild;
  buttonLink.href=href;
  //set link target to inner frame
  if (buttonLink.target != "_blank") buttonLink.target = "contentframe";
}

function getButtonLink(id) {
  //set button href
  var buttonLink = document.getElementById(id).firstChild;
  return buttonLink.href;
}

function setFormTarget(id) {
  //set form action to target frame instead of whole page
  var form = document.getElementById(id);
  if (form) {
    form.target = "contentframe";
    form.mode.value = "content";
  }
}

function updateLinks() {
  //update all links to reflect changes in parameters
  
  //update forms
  //search form
  var form = document.getElementById("search-form");
  if (form) {
    form.layout.value = layout;
    form.zoom.value = zoom;
    document.getElementById("search-page-field").value = pageName; //special case as "page" is reserved in ie dom
    form.prevcontentpage.value = prevContentPage;
  }
  //chapter select form
  form = document.getElementById("chapter-select-form");
  form.layout.value = layout;
  form.zoom.value = zoom;
  form.prevpage.value = pageName;
  form.prevcontentpage.value = prevContentPage;
  //page select form
  form = document.getElementById("page-select-form");
  form.layout.value = layout;
  form.zoom.value = zoom;
  form.prevpage.value = pageName;
  form.prevcontentpage.value = prevContentPage;
  
  //update buttons
  setButtonLink("singlepage-icon","?mode=content&page=" + prevContentPage + "&zoom=" + zoom + "&layout=single");
  setButtonLink("doublepage-icon","?mode=content&page=" + prevContentPage + "&zoom=" + zoom + "&layout=double");
  setButtonLink("thumbnails-icon","?mode=content&page=thumbnails&zoom=" + zoom + "&layout=" + layout + "&prevcontentpage=" + prevContentPage);

  setButtonLink("pdf-icon",pdfFile);
  if(pdfFileSS != ""){
    setButtonLink("pdf-ss-icon",pdfFileSS);
  }
  setButtonLink("xls-icon",xlsFile);
  setButtonLink("downloads-icon","?mode=content&page=downloads&zoom=" + zoom + "&layout=" + layout + "&prevcontentpage=" + prevContentPage);
  setButtonLink("feedback-icon","?mode=content&page=" + pageName + "&zoom=" + zoom + "&layout=" + layout + "&prevcontentpage=" + prevContentPage + "&email=feedback");
  setButtonLink("email-icon","?mode=content&page=" + pageName + "&zoom=" + zoom + "&layout=" + layout + "&prevcontentpage=" + prevContentPage + "&email=friend");
  setButtonLink("help-icon","?mode=content&page=help&zoom=" + zoom + "&layout=" + layout + "&prevcontentpage=" + prevContentPage);

  setButtonLink("front-button","?mode=content&page=" + (1-pageOffset) + "&zoom=" + zoom + "&layout=" + layout);
  setButtonLink("back-button","?mode=content&page=" + (prevPage-pageOffset) + "&zoom=" + zoom + "&layout=" + layout);
  setButtonLink("forward-button","?mode=content&page=" + (nextPage-pageOffset) + "&zoom=" + zoom + "&layout=" + layout);
  setButtonLink("end-button","?mode=content&page=" + (totalPages-pageOffset-((version>1 && layout=="double")?1:0)) + "&zoom=" + zoom + "&layout=" + layout);
  
}

function updateControls(newPage, newZoom, newLayout, newQuery, newEmail, newPDFFile, newXLSFile, newPDFFileSS) {
  //update controls
  
  //get updated variables
  pageName = newPage;
  zoom = newZoom;
  layout = newLayout;
  query = newQuery;
  email = newEmail;
  
  pdfFile = newPDFFile;
  pdfFileSS = newPDFFileSS;
  xlsFile = newXLSFile;
  
  //recalculate values
  updateCalculatedValues();
  
  //update page display
  setTextFieldText("page-field",printablePage());
  setTextFieldTitle("page-field","You are viewing " + printablePage());
  
  //update search box
  setTextFieldText("search-field",query);
  
  //update button and form links
  updateLinks();
  
  //update button states
  setToggleButtonState("singlepage-icon",layout == "single" && contentPage);
  setToggleButtonState("doublepage-icon",layout == "double" && contentPage);
  setToggleButtonState("thumbnails-icon",pageName == "thumbnails" && query == searchDefaultText && email == "");

  setButtonState("pdf-icon",contentPage && pdfFile != "");
  //pdfFileSS != "" is not the best check as the button might not be here but it'll do for now.
  if(pdfFileSS != ""){
    setButtonState("pdf-ss-icon",contentPage && pdfFileSS != "");
  }
  setButtonState("xls-icon",contentPage && xlsFile != "");
  setToggleButtonState("downloads-icon",pageName == "downloads" && query == searchDefaultText && email == "");
  setToggleButtonState("feedback-icon",email == "feedback");
  setToggleButtonState("email-icon",email == "friend");
  setToggleButtonState("help-icon",pageName == "help" && query == searchDefaultText && email == "");

  setButtonState("front-button",contentPage && pageNumber != 1 && (version==1 || layout=="single" || pageNumber != totalPages));
  setButtonState("back-button",contentPage && pageNumber != 1 && (version==1 || layout=="single" || pageNumber != totalPages));
  setButtonState("forward-button",contentPage && (pageNumber < totalPages - ((version>1 && layout=="double")?2:0) || (version>1 && layout=="double" && pageNumber == totalPages)));
  setButtonState("end-button",contentPage && (pageNumber < totalPages - ((version>1 && layout=="double")?2:0) || (version>1 && layout=="double" && pageNumber == totalPages)));
  
  setButtonState("zoomin-button",contentPage && zoom < maxZoom - 0.001);
  setButtonState("zoom-icon",contentPage);
  setButtonState("zoomout-button",contentPage && zoom > minZoom + 0.001);
  
}

function setContent(content) {
  //set div content
  document.getElementById("contentdiv").innerHTML = content;
}

function getContent() {
  //get div content
  return document.getElementById("contentdiv").innerHTML;
}

function setZoom(newZoom) {
  //zoom images in content frame without reloading
  
  //update zoom variable;
  zoom = newZoom;
  if (zoom < minZoom) zoom = minZoom;
  if (zoom > maxZoom) zoom = maxZoom;
  
  if (mode == "content") {
  
    //calculate new size
    var calculatedImageWidth = imageWidth * zoom;
    if (layout == "double") {
      calculatedImageWidth /= 2;
      //resize second page image
      document.getElementById("page2").style.width = Math.round(calculatedImageWidth) + "px";
    }
    //resize first page image
    document.getElementById("page1").style.width = Math.round(calculatedImageWidth) + "px";
  
    //update parent frame zoom
    parent.setZoom(zoom)
  
  } else {
  
    //update control links
    updateLinks();
    
    //update zoom states
    setButtonState("zoomin-button",contentPage && zoom < maxZoom - 0.001);
    setButtonState("zoomout-button",contentPage && zoom > minZoom + 0.001);
    setButtonState("zoom-icon",contentPage && zoom != 1.0);
  
  }
}

function setTextFieldText(id, text) {
  //set the contents of a textfield
  var element = document.getElementById(id);
  if (element) element.firstChild.value = text;
}

function getTextFieldText(id) {
  //get the contents of a textfield
  return document.getElementById(id).firstChild.value;
}

function setTextFieldTitle(id, title) {
  //set the contents of a textfield
  document.getElementById(id).firstChild.title = title;
}

function clearTextFieldKeydown(id) {
  //clear the keydown function of the textfield
  if (document.getElementById(id)) document.getElementById(id).firstChild.onkeydown = function (e) {
    if (!e) e = event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
  };
}

function titleCase(text) {
  //return titlecase equivalent of text
  return text.substring(0,1).toUpperCase() + text.substring(1);
}

function printablePage() {
  //return the printable name of the current page(s)
  if (email=="friend") return "Email to a Friend";
  if (email=="feedback") return "Send Feedback";
  if (!query==searchDefaultText) return "Search Results";
  if (pageName=="downloads" || pageName=="thumbnails" || pageName=="help") return titleCase(pageName);
  if (layout=="single") {
    var nameOfPage = namedPages[parseInt(pageName)+pageOffset];
    return (nameOfPage != null)? nameOfPage: "Page " + pageName + " of " + (totalPages - pageOffset);
  } else {
    var nameOfPage1 = namedPages[page1];
    var nameOfPage2 = namedPages[page2];
    if (nameOfPage1 == null) {
      if (nameOfPage2 == null) {
        return "Pages " + (page1-pageOffset) + " & " + (page2-pageOffset);
      } else {
        return "Page " + (page1-pageOffset) + " & " + nameOfPage2;   
      }
    } else {
      if (nameOfPage2 == null) {
        return nameOfPage1 + " & Page " + (page2-pageOffset);
      } else {
        return nameOfPage1 + " & " + nameOfPage2;
      }
    }
  }
}

function arrayContains(array,value) {
  var re = new RegExp('(^|\\s)' + value + '(\\s|$)');
  return re.test(array.join(" "));
}

function updateCalculatedValues() {
  //update values that are calculated from url parameters
  
  contentPage = !(pageName == "downloads" || pageName == "help" || pageName == "thumbnails" || query != searchDefaultText || email != "")
  
  if (contentPage) {
  
    pageNumber = parseInt(pageName)+pageOffset;
    while(arrayContains(skippedPages,pageNumber)) pageNumber ++;
    
    //calculate page numbers for double page spread
    if (pageNumber % 2 == ((version < 1.2 || preservePageSpread)?1:0)) {

      page1 = pageNumber-1;
      while(arrayContains(skippedPages,page1)) page1 --;
      if (page1 < 1) page1 += totalPages;
      page2 = pageNumber;

    } else {

      page1 = pageNumber;
      page2 = pageNumber+1;
      while(arrayContains(skippedPages,page2)) page2 ++;
      if (page2 > totalPages) page2 -= totalPages;

    }
    
    //calculate previous and next pages
    if (layout == "double") {

      prevPage = page1-1;
      while(arrayContains(skippedPages,prevPage)) prevPage --;
      if (prevPage < 1) prevPage += totalPages;
      nextPage = page2+1;
      while(arrayContains(skippedPages,nextPage)) nextPage ++;
      if (nextPage > totalPages) nextPage -= totalPages;

    } else {

      prevPage = pageNumber-1;
      while(arrayContains(skippedPages,prevPage)) prevPage --;
      if (prevPage < 1) prevPage += totalPages;
      nextPage = pageNumber+1;
      while(arrayContains(skippedPages,nextPage)) nextPage ++;
      if (nextPage > totalPages) nextPage -= totalPages;
    
    }
    
    //set previous content page equal to current page
    prevContentPage = pageName;
    
  }
}

function validateEmailForm() {

  if (!validateEmail(getTextFieldText("from")) || getTextFieldText("from") == "your@email.address") {
    
    alert("Please enter a valid email address!");
    return false;
      
  }

  if (email == "feedback") {
    
    if (getTextFieldText("subject") == "") {

      alert("Please enter a subject!");
      return false;
    
    }

    if (getTextFieldText("body") == "") {
    
      alert("Please enter some message text!");
      return false;
        
    }
    
  } else if (email == "friend") {
  
    if (!validateEmail(getTextFieldText("address")) || getTextFieldText("address") == "send@to.address") { 
          
      alert("Please enter a valid send-to address!");
      return false;
          
    }
    
  }

  return true;

}

function validateEmail(address) {

  var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  return (filter.test(address));
  
}