//******************************************************************************
//*                                                                            *
//*                     SIFLAJ JavaScript Book Functions                       *
//*                                                                            *
//*                          Copyright 2006 SIFLAJ                             *
//*                                                                            *
//******************************************************************************

//******************************************************************************
//*                                                                            *
//*                              Global Variables                              *
//*                                                                            *
//******************************************************************************

// Page Number Formats
// -------------------
var cnstNumNone = 0;
var cnstNumPersion = 1;
var cnstNumRomanLow = 2;
var cnstNumRomanCap = 3;

// Page Types
// ----------
var cnstPgeNorm = 0;		// Normal
var cnstPgeCvr = 1;			// Cover
var cnstPgeNtc = 2;			// Notice
var cnstPgePref = 3;		// Preface
var cnstPgeCont = 4;		// Contents
var cnstPgePref = 5;		// Preface
var cnstPgeGls = 6;			// Glossary
var cnstPgeIndx = 7;		// Index

// Navigation Button Tag Creation Strings
// --------------------------------------

var strBtn1 = "<div class=\"";
var	strBtn2 = "\" id=\"divNvBtn";
var	strBtn3 = "\"><a id=\"aNvBtn";
var	strBtn4 = "\" href=\"javascript:void(0);\" value=";
var	strBtn5 = " onmouseout=\"BtnNormNav(this)\" onmouseover=\"BtnHoverNav(this)\" onclick=\"pageChange(this.value)\"><img id=\"imgNvBtn";
var	strBtn6 = "\" src=\"";
var	strBtn7 = "\"><span id=\"spanNvBtn";
var	strBtn8 = "\">"
var	strBtn9 = "<\/span><\/a><\/div>"

//******************************************************************************
//*                                                                            *
//*                                    Objects                                 *
//*                                                                            *
//******************************************************************************

//******************************************************************************
//*                              SIFLAJ Book Object                            *
//******************************************************************************
//
function objBook(bkTitle, bkPath, pgePrefix, pgeGrp, pgeFirst)
{
	var Found;

//	debugger;
//
// Constants
// ---------
	this.Title = bkTitle;				// Book title
	this.Path = bkPath;					// Book path
	this.pgePrefix = pgePrefix;			// Page prefix
	this.pgeGrp = pgeGrp;				// Page group array
										// Last page
	this.pgeLast = pgeGrp[pgeGrp.length-1].End;
	this.pgeFirst = pgeFirst;			// First page to be displayed

//
// Variables
// ---------
	this.coverNum = 0;					// Default is no cover or contents
	this.contentsNum = 0;

	Found = 0;							// Search for Cover and Contents page numbers
	for (i = 0; i < this.pgeGrp.length; i++)
	{									// If we found cover
		if (!this.coverNum && this.pgeGrp[i].Type == cnstPgeCvr)
		{								// Set cover
			this.coverNum = this.pgeGrp[i].Start;
			Found++;					// Inc found count
		}
										// Else if we found contents
		else if (!this.contentsNum && this.pgeGrp[i].Type == cnstPgeCont)
		{								// Set contents page number
			this.contentsNum = this.pgeGrp[i].Start;
			Found++;					// Inc found count
		}
		if (Found == 2)					// If we found everything, exit
			break;
	}
}

//******************************************************************************
//*                          SIFLAJ Book Library Object                        *
//******************************************************************************
//
function objBkLib(bkLibrary, imgPath, imgLogo, imgPageBackground, homeURL, navMax, objBk)
{
	var Found;

//	debugger;
//
// Constants
// ---------
	this.Library = bkLibrary;			// Book library
	this.imgPath = imgPath;				// Book images path
	this.imgLogo = imgLogo;				// Book header logo image
	this.homeURL = homeURL;				// Logo home URL hyperlink
										// Book page background
	this.imgPageBackground = imgPageBackground;
	this.navMax = navMax;				// Maximum navigation buttons to display
	this.bkDesc = objBk;				// Book object
	this.pgeNum = objBk.pgeFirst;		// Page number

//
// Variables
// ---------
	this.navFirst = 0;					// Set redraw navigation buttons code
	this.pgeGrpIdx = 0;					// Page group index
}

//******************************************************************************
//*                     SIFLAJ Book Page Group Structure                       *
//******************************************************************************
//
function objPageGroup(Name, Start, End, NumOffs, NumFormat, Type)
{
	this.Name = Name;					// Page group name
	this.Start = Start;					// Physical starting page number
	this.End = End;						// Physical ending page number
	this.NumOffs = NumOffs;				// Page number offset
	this.NumFormat = NumFormat;			// Page number format
	this.Type = Type;					// Page type
}

//******************************************************************************
//*                                                                            *
//*                                  Functions                                 *
//*                                                                            *
//******************************************************************************

//******************************************************************************
//*                                  Book Load                                 *
//******************************************************************************
//
function bookLoad()
{
//	debugger;
	var libDesc;
	var bkDesc;
	
	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;
											// Set web page header logo hyperlink
	document.getElementById('aHdrLogoHyper').href = libDesc.homeURL;
											// Set web page header logo image
	document.getElementById('imgHdrLogo').src = libDesc.imgPath + libDesc.imgLogo;
											// Set page background
	document.getElementById('imgBkPageBkgrnd').src = libDesc.imgPageBackground;
											// Set header book section text
	document.getElementById('pHdrTxtSec').innerHTML = libDesc.Library;
											// Set header book title
	document.getElementById('pHdrTxtTitle').innerHTML = bkDesc.Title;
											// Set total pages
	document.getElementById('pTotalPages').innerHTML = bkDesc.pgeLast;

	pageLoad(bkDesc.pgeFirst);				// Load first book page
	navUpdate();							// Update navigation bar
}

//******************************************************************************
//*                                 Page Load                                  *
//******************************************************************************
//
function pageLoad(pgeNum)
{
//	debugger;
	var libDesc;
	var bkDesc;

	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;
	libDesc.pgeNum = parseInt(pgeNum);		// Set page number
											// Set current page group index
	libDesc.pgeGrpIdx = getPgeGrpIdx(bkDesc, pgeNum);
											// Set header text
	document.getElementById('pBookPageHdrTxt').innerHTML = getBookTitleDisp();
											// Set footer text
	document.getElementById('pBookPageFtrTxt').innerHTML = getPageNameDisp();
											// Set footer page number
	document.getElementById('pBookPageFtrNum').innerHTML = getPageNumDisp();
	parent.document.title = getBookWebPageTitle();
											// Set book page
	document.getElementById('pageFrame').src = bkDesc.Path + bkDesc.pgePrefix +
														libDesc.pgeNum + ".htm";
}

//******************************************************************************
//*                               Change Book Page                             *
//******************************************************************************
//
function pageChange(pageNum)
{
//	debugger;

	pageLoad(pageNum);					// Load new book page
	navUpdate();						// Update navigation bar
}

//******************************************************************************
//*                             Button Normal Handler                          *
//******************************************************************************
//
function BtnNormNav(objBtn)
{
	var libDesc;

	libDesc = parent.frames.bkData.libDesc;

	if (objBtn.value != libDesc.pgeNum)
	{
		BtnNorm(objBtn);
	}
}

//******************************************************************************
//*                              Button Hover Handler                          *
//******************************************************************************
//
function BtnHoverNav(objBtn)
{
	var libDesc;

	libDesc = parent.frames.bkData.libDesc;

	if (objBtn.value != libDesc.pgeNum)
	{
		BtnHover(objBtn);
	}
}

//******************************************************************************
//*                          Get Book Web Page Title                           *
//******************************************************************************
//
function getBookWebPageTitle()
{
	return (getBookTitle() + " - " + getPageGroupName());
}

//******************************************************************************
//*                               Get Book Title                               *
//******************************************************************************
//
function getBookTitle()
{
	return (parent.frames.bkData.libDesc.bkDesc.Title);
}

//******************************************************************************
//*                           Get Book Display Title                           *
//******************************************************************************
//
function getBookTitleDisp()
{
	var libDesc;
	var bkDesc;
	var strTmp = "";
											
	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;
											// If this isn't cover page;
	if (bkDesc.pgeGrp[libDesc.pgeGrpIdx].Type != cnstPgeCvr)
		strTmp = getBookTitle();			// Return book title

	return(strTmp);
}

//******************************************************************************
//*                             Get Page Group Name                            *
//******************************************************************************
//
function getPageGroupName()
{
	var libDesc;
	var bkDesc;
											
	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;

	return (bkDesc.pgeGrp[libDesc.pgeGrpIdx].Name);
}

//******************************************************************************
//*                             Get Page Display Name                          *
//******************************************************************************
//
function getPageNameDisp()
{
	var libDesc;
	var bkDesc;
	var i;
	var strTmp = "";
											
	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;
	i = libDesc.pgeGrpIdx;

	if (bkDesc.pgeGrp[i].Type != cnstPgeCvr)	// If this isn't cover page;
		strTmp = bkDesc.pgeGrp[i].Name;			// Return page group name

	return(strTmp);
}

//******************************************************************************
//*                            Get Page Display Number                         *
//******************************************************************************
//
function getPageNumDisp()
{
	var libDesc;
	var bkDesc;
	var strTmp = "";

	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;
											// If this isn't cover page
	if (bkDesc.pgeGrp[libDesc.pgeGrpIdx].Type != cnstPgeCvr)
		strTmp = getPageNumStr()			// Get page number

	return(strTmp);
}

//******************************************************************************
//*                             Get Page Number String                         *
//******************************************************************************
//
function getPageNumStr()
{
	var libDesc;

	libDesc = parent.frames.bkData.libDesc;
	return(convertPageNum(libDesc.pgeNum, libDesc.pgeGrpIdx));
}

//******************************************************************************
//*                        Convert Page Number to String                       *
//******************************************************************************
//

function convertPageNum(intPage, pgeGrpIdx)
{
	var bkDesc;
	var strTmp = "";
	var strPage = "";

	bkDesc = parent.frames.bkData.libDesc.bkDesc;

	strPage = "" + (intPage - bkDesc.pgeGrp[pgeGrpIdx].NumOffs);

	switch (bkDesc.pgeGrp[pgeGrpIdx].NumFormat)
	{
		case cnstNumPersion:
			strTmp = strPage;
		break
		
		case cnstNumRomanLow:	
			strTmp = (convertRoman(strPage)).toLowerCase();
		break

		case cnstNumRomanCap:	
			strTmp = convertRoman(strPage);
		break
	}
	
	if (strTmp.length < 2)
		strTmp = " " + strTmp;
	return(strTmp);
}

//******************************************************************************
//*                          Create Book Navigation Panel                      *
//******************************************************************************
//
function navCreate()
{
	var libDesc;
	var bkDesc;
	var i;
	var btnNum;
	var strOut;
	var pgeGrp;

//	debugger;
											// Try to get library descriptor
	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;
	pgeGrp = bkDesc.pgeGrp;
	btnNum = 0;
											// If less pages than max nav
	if (libDesc.navMax > pgeGrp[pgeGrp.length-1].End)
											// Max nav is max pages
		libDesc.navMax = pgeGrp[pgeGrp.length-1].End

											// Write initial button class table and row tags
	strOut = "<div class=\"BookNavPanel FloatContainer\" id=\"divBookNavPanel\" name=\"divBookNavPanel\">\n";
	strOut += "<div class=\"BookNavBtns\" id=\"divBookNavBtns\" name=\"divBookNavBtns\">\n";
	strOut += "<div class=\"UniBtns NavPanel\">\n";

											// Write previous page button	
	strOut += strBtn1 + "BtnArrow" + strBtn2 + btnNum + strBtn3 + btnNum + 
		strBtn4 + "0" + strBtn5 + btnNum + strBtn6 + libDesc.imgPath + "SimpleArrow1_L-65px.gif" +
													strBtn7 + btnNum++ + strBtn8 + "Prev" + strBtn9;

	if (bkDesc.coverNum != 0)				// If Cover button enabled
											// Write Cover button
		strOut += strBtn1 + "BtnCover" + strBtn2 + btnNum + strBtn3 + btnNum + 
			strBtn4 + bkDesc.coverNum + strBtn5 + btnNum + strBtn6 + libDesc.imgPath + "GlowRectangle1-42px.jpg" +
													strBtn7 + btnNum++ + strBtn8 + "Cover" + strBtn9;

	if (bkDesc.contentsNum!= 0)				// If Contents button enabled
											// Write Contents button
		strOut += strBtn1 + "BtnContents" + strBtn2 + btnNum + strBtn3 + btnNum + 
			strBtn4 + bkDesc.contentsNum + strBtn5 + btnNum + strBtn6 + libDesc.imgPath + "GlowRectangle1-65px.jpg" +
													strBtn7 + btnNum++ + strBtn8 + "Contents" + strBtn9;

	for (i = 0; i < libDesc.navMax; i++)			// Write page buttons
		strOut += strBtn1 + "BtnPage" + strBtn2 + btnNum + strBtn3 + btnNum + 
			strBtn4 + "0" + strBtn5 + btnNum + strBtn6 + libDesc.imgPath + "GlowRectangle1-30px.jpg" +
													strBtn7 + btnNum++ + strBtn8 + "0" + strBtn9;

											// Write next page button
	strOut += strBtn1 + "BtnArrow" + strBtn2 + btnNum + strBtn3 + btnNum + 
		strBtn4 + "0" + strBtn5 + btnNum + strBtn6 + libDesc.imgPath + "SimpleArrow1_R-65px.gif" +
													strBtn7 + btnNum++ + strBtn8 + "Next" + strBtn9;
	strOut += "<\/div>\n<\/div>\n<\/div>\n";

	return(strOut);
}

//******************************************************************************
//*                        Update Book Navigation Panel                        *
//******************************************************************************
//
function navUpdate()
{
	var libDesc;
	var bkDesc;
	var i;
	var navLast;
	var pgeNum;
	var uniBtn;
	var sBtn;
	var pgeGrp;

//	debugger;
	libDesc = parent.frames.bkData.libDesc;
	bkDesc = libDesc.bkDesc;
	pgeGrp = bkDesc.pgeGrp;
	btnNum = 0;
	flgWrBtns = false;

//
// =========================================
// Calculate Navigation Button Display Range
// =========================================
//											// Calc current last navigation page
	navLast = libDesc.navFirst + (libDesc.navMax-1);
											// If we need to write new page buttons
	if (!libDesc.navFirst || libDesc.pgeNum < libDesc.navFirst || libDesc.pgeNum > navLast)
	{
		flgWrBtns = true;					// Set write buttons flag
		libDesc.navFirst = libDesc.pgeNum;	// First nav page is current page
											// Calc last nav page
		navLast = libDesc.navFirst + (libDesc.navMax-1);
		if (navLast > bkDesc.pgeLast)		// If its beyond last book page
		{									// Set max first nav page
			libDesc.navFirst = bkDesc.pgeLast - (libDesc.navMax-1);
											// Calc last nav page
			navLast = libDesc.navFirst + (libDesc.navMax-1);
		}
	}

//
// ================================
// Update Navigation Button Display
// ================================
//
	pgeNum = libDesc.navFirst;				// Set initial button page number
											// Process last page button
	navBtnVisCntrl((libDesc.pgeNum != 1), btnNum++, (libDesc.pgeNum-1));
	
	if (bkDesc.coverNum != 0)				// If Cover button enabled
	{										// Get button
		uniBtn = document.getElementById("aNvBtn" + btnNum++);
		uniBtn.value = bkDesc.coverNum;
		navBtnActCntrl(uniBtn, libDesc);	// Set active state
	}

	if (bkDesc.contentsNum!= 0)				// If Contents button enabled
	{										// Get button
		uniBtn = document.getElementById("aNvBtn" + btnNum++);
		uniBtn.value = bkDesc.contentsNum;
		navBtnActCntrl(uniBtn, libDesc);	// Set active state
	}

	for (i = 0; i < libDesc.navMax; i++)	// Process buttons
	{
		uniBtn = document.getElementById("aNvBtn" + btnNum);
		if (flgWrBtns)						// If we need to write new button vars
		{
			uniBtn.value = pgeNum;			// Set page number value
											// Get button span
			sBtn  = document.getElementById("spanNvBtn" + btnNum);
											// Write button page number text
			sBtn.innerHTML = convertPageNum(pgeNum, getPgeGrpIdx(bkDesc, pgeNum));
		}

		navBtnActCntrl(uniBtn, libDesc);	// Set active state
		pgeNum++;							// Inc page number
		btnNum++;
	}
											// Process next page button
	navBtnVisCntrl((libDesc.pgeNum != bkDesc.pgeLast), btnNum, (libDesc.pgeNum+1));
}

//******************************************************************************
//*                          Button Visibility Control                         *
//******************************************************************************
//
function navBtnVisCntrl(flgVis, btnNum, intPage)
{
	uniBtn = document.getElementById("aNvBtn" + btnNum);

	if (flgVis)								// If button should be visible
	{
		uniBtn.value = intPage;

		uniBtn = document.getElementById("divNvBtn" + btnNum);
		uniBtn.style.visibility = 'visible';
	}
	else									// If button should be invisible
	{
		uniBtn = document.getElementById("divNvBtn" + btnNum);
		uniBtn.style.visibility = 'hidden';
	}
}

//******************************************************************************
//*                           Button Active Control                            *
//******************************************************************************
//
function navBtnActCntrl(objBtn, libDesc)
{
										// If not current page
	if (objBtn.value != libDesc.pgeNum)
	{
		BtnNorm(objBtn);				// Set button normal
	}
	else								// If current page
	{
		BtnActive(objBtn);				// Set button active
	}
}

//******************************************************************************
//*                            Get Page Group Index                            *
//******************************************************************************
//
function getPgeGrpIdx(bkDesc, pgeNum)
{
	var i;
									// Get current page group index
	for (i = 0; i < bkDesc.pgeGrp.length; i++)
	{
		if (pgeNum >= bkDesc.pgeGrp[i].Start && pgeNum <= bkDesc.pgeGrp[i].End)
			break;
	}
	return(i);
}



