﻿//------------------------------------------------------
// Page:					Viewer.js
// Author:				John Bradnam
// Created:				070812 JLB
// Copyright:			Republicorp P/L
// Purpose:				Default viewer functions
// History:
//------------------------------------------------------

//------------------------------------------------------
// Initialise
//------------------------------------------------------

var BOOKMARK_PERIOD = 2000;
var blnViewerInBookmark = false;
var strViewerLastBookmark = "";
var objViewerHistory = null;
var strOldTitle = "";
var objAjaxShare = null;
var objAjaxTrack = null;

function ViewerInitialise() {
	if (window.self == window.top) {
		//Initialise Republicast
		RepublicastOnLoad();
		//Initialise Control library
		ControlsOnLoad();
		//Register for onready state
		RepublicastAddEventHandler("onready", "ViewerEngineReady");
		if (RepublicastIsReady())
			RepublicastFireEvent("onready");
	}
} //ViewerInitialise

function ViewerEngineReady(objEngine) {
	//Display the viewer
	var objSrn = document.getElementById("screen");
	objSrn.style.display = "";
	RepublicastShow();
	//Restore from bookmark
	ViewerRestoreFromBookmark();
	//Register for page change
	RepublicastAddEventHandler("onpagechange", "ViewerPageChange");
	RepublicastFireEvent("onpagechange");
} //ViewerEngineReady

function ViewerPageChange(objEngine, strText) {
	WatermarkSetEmptyText("btn_goto", strText);
	ViewerSaveForBookmark(RepublicastGetPhysicalPage(), strText);
	ViewerPrintPageChange();
	ViewerSharePageChange();
	ViewerPageTrack();
} //ViewerPageChange

//------------------------------------------------------
// Toolbar
//------------------------------------------------------

function ViewerFirst() {
	RepublicastFirst();
} //ViewerFirst

function ViewerPrev() {
	RepublicastPrevious();
} //ViewerPrev

function ViewerGoTo(intPage, strSearchTerm) {
	var objEdt = null;
	if (typeof(intPage) == "object") {
		var objEdt = intPage.nextSibling;
		intPage = WatermarkGetValue(objEdt);
		objEdt.value = "";
		WatermarkBlur(objEdt, null);
	}
	if (intPage == "")
		alert("Click in the box and enter the page number that you wish\nto view, then click this button to view that page.");
	else {
		var intPhy = RepublicastLogicalToPhysical(intPage);
		if ((typeof(strSearchTerm) == "undefined") && (intPhy == 0))
			alert("Page range must be between " + RepublicastGetLogicalPage(1) + " and " + RepublicastGetLogicalPage(Config.pages));
		else {
			if (objEdt == null)
				objEdt = document.getElementById("btn_goto");
			objEdt.value = "";
			WatermarkBlur(objEdt, null);
			if (typeof(strSearchTerm) == "undefined")
				intPage = intPhy;
			RepublicastGoTo(intPage, strSearchTerm);
		}
	}
	return true;
} //ViewerGoTo

function ViewerNext() {
	RepublicastNext();
} //ViewerNext

function ViewerLast() {
	RepublicastLast();
} //ViewerLast

function ViewerPdf() {
	var strPdf = "../../" + Config.folder + "/" + Config.pdf;
	window.open(strPdf, "_blank");
} //ViewerPdf

function ViewerLibrary() {
	GlassTabClick("tab_book", false);
	RepublicastCustomView("page_back");
} //ViewerLibrary

function ViewerHelp() {
	GlassTabClick("tab_book", false);
	RepublicastCustomView("page_front");
} //ViewerHelp

function ViewerHelpMore() {
	ViewerShareSocial(0);
} //ViewerHelpMore

//------------------------------------------------------
// Tab bar
//------------------------------------------------------

function ViewerBook() {
	GlassTabClick("tab_book", false);
	RepublicastCustomView("page_book");
} //ViewerBook

function ViewerContents() {
	GlassTabClick("tab_contents", false);
	RepublicastCustomView("page_contents");
	ViewerPageTrack("contents");
} //ViewerContents

function ViewerSearch(strSearchTerm) {
	GlassTabClick("tab_search", false);
	RepublicastCustomView("page_search");
	var objEdt = document.getElementById("btn_search");
	if (typeof(strSearchTerm) == "undefined")
		strSearchTerm = WatermarkGetValue(objEdt);
	objEdt.value = "";
	WatermarkBlur(objEdt, null);
	if (strSearchTerm != "") {
		var objEdt = document.getElementById("input_find");
		WatermarkSetValue(objEdt, strSearchTerm);
		ViewerSearchGetResults("results", strSearchTerm);
	}
	window.setTimeout("ViewerSearchFocus()",1);
} //ViewerSearch

function ViewerPrint() {
	GlassTabClick("tab_print", false);
	var strLeft = RepublicastGetLogicalLeftPage();
	var strRight = RepublicastGetLogicalRightPage();
	var objFrom = document.getElementById("input_from");
	WatermarkSetValue(objFrom, (strLeft == "") ? strRight : strLeft);
	var objTo = document.getElementById("input_to");
	WatermarkSetValue(objTo, (strRight == "") ? strLeft : strRight);
	RepublicastCustomView("page_print");
} //ViewerPrint

function ViewerShare() {
	GlassTabClick("tab_share", false);
	RepublicastCustomView("page_share");
} //ViewerShare

//------------------------------------------------------
// Bookmark functions
//------------------------------------------------------

function ViewerSaveForBookmark(intPage, strText) {
	blnViewerInBookmark = true;
	var strTitle = document.title;
	var strPage = " - Page " + strText;
	ViewerSetTitle(strTitle, strPage);
	var strUrl = document.location.href;
	var strToken = "#p=" + intPage;
	var intToken = strUrl.indexOf("#");
	if (intToken == -1)
		strViewerLastBookmark = strUrl + strToken;
	else
		strViewerLastBookmark = strUrl.substr(0, intToken) + strToken;
	document.location.href = strViewerLastBookmark;
	window.setTimeout("ViewerCheckForBookmark()", BOOKMARK_PERIOD);
	blnViewerInBookmark = false;
} //ViewerSaveForBookmark

function ViewerCheckForBookmark() {
	if (!blnViewerInBookmark) {
		if (strViewerLastBookmark != document.location.href)
			ViewerRestoreFromBookmark();
		else
			window.setTimeout("ViewerCheckForBookmark()", BOOKMARK_PERIOD);
	}
} //ViewerCheckForBookmark

function ViewerRestoreFromBookmark() {
	var strUrl = document.location.href;
	var intToken = strUrl.indexOf("#p=");
	if (intToken != -1)
		RepublicastGoTo(strUrl.substr(intToken + 3));
} //ViewerRestoreFromBookmark

function ViewerSetTitle(strTitle, strPage) {
	var intToken = strTitle.indexOf(" - ");
	if (intToken == -1)
		document.title = strTitle + strPage;
	else
		document.title = strTitle.substr(0, intToken) + strPage;
	return strTitle;
} //ViewerSetTitle

//------------------------------------------------------
// Full text search
//------------------------------------------------------

function ViewerSearchFocus() {
	var objEdt = document.getElementById("input_find");
	objEdt.select();
	objEdt.focus();
} //ViewerSearchFocus

function ViewerSearchGetResults(strContainer, strSearchTerm) {
	if (strSearchTerm != "") {
		var objContainer = document.getElementById(strContainer);
		if (objContainer != null) {
			ViewerPageTrack("search", strSearchTerm);
			var intLimit = 120;
			var strUrl = "../../Engine/Results.aspx";
			strUrl += "?c=" + Config.id;
			strUrl += "&f=" + encodeURI(strSearchTerm);
			strUrl += "&l=" + intLimit;
			var objAjax = new clsAjax(null, false);
			var strResult = objAjax.get(strUrl);
			if (strResult != "") {
				var objXmlDoc = new clsXmlDoc(strResult);
				if (objXmlDoc.loaded) {
					var aTagIndex = objXmlDoc.getElementsByTagName("index");
					var intCount = parseInt(aTagIndex.length);
					var strText = "";
					if (intCount == 0)
						strText = '<p class="notfound">No matches found for the search term \'' + strSearchTerm + '\'</p>';
					else {
						var objRegExp = new RegExp("(" + strSearchTerm.toLowerCase() + ")", "gi");
						strText = '<table cellpadding="0" cellspacing="0">';
						for (var intIndex = 0; intIndex < intCount; intIndex++) {
							var objIndex = aTagIndex[intIndex];
							var intPage = objXmlDoc.getAttribute(objIndex, 0).value;
							var strPreview = objXmlDoc.getInnerText(objIndex);
							if (strPreview.length >= intLimit)
								strPreview += "...";
							var strThumb = "../../Engine/Page.aspx?c=" + Config.id + "&p=" + intPage + "&z=0";
							strText += '<tr onmouseover="TableCursorOver(this);" onmouseout="TableCursorOut(this);" onclick="ViewerGoTo(' + intPage + ',\'' + strSearchTerm + '\')" >';
							strText += '<td class="thumb">'
							strText += '<img src="' + strThumb + '" width="' + Config.sizes[0].width + '" height="' + Config.sizes[0].height + '" alt="" />';
							strText += '</td>';
							strText += '<td class="preview">';
							strText += '<p class="page">Page ' + RepublicastGetLogicalPage(intPage) + '</p>';
							strText += '<p>' + strPreview.replace(objRegExp, "<span>$1</span>") + '</p>';
							strText += '</td>';
							strText += '</tr>';
						} //for
						strText += '</table>'
					}
					objContainer.innerHTML = strText;
				}
			}
			else
				objContainer.innerHTML = strText;
		}
	}
} //ViewerSearchGetResults
	
//------------------------------------------------------
// Library
//------------------------------------------------------

function ViewerChangePublication(intPub) {
	var objEdt = document.getElementById("ctlHiddenLibrary");
	if (objEdt != null) {
		if (objEdt.value == intPub) {
			GlassTabClick("tab_book", false);
			RepublicastCustomView("page_front");
		}
		else {
			ViewerPageTrack("library", intPub);
			objEdt.value = intPub;
			document.forms[0].submit();
		}
	}
} //function

//------------------------------------------------------
// Print
//------------------------------------------------------

function ViewerPrintRange() {
	var strError = "Page range must be between " + RepublicastGetLogicalPage(1) + " and " + RepublicastGetLogicalPage(Config.pages);
	var objFrom = document.getElementById("input_from");
	var strFrom = WatermarkGetValue(objFrom);
	var intFrom = RepublicastLogicalToPhysical(strFrom);
	var objTo = document.getElementById("input_to");
	var strTo = WatermarkGetValue(objTo);
	var intTo = RepublicastLogicalToPhysical(strTo);
	if (intFrom == 0) {
		alert(strError);
		objFrom.focus();
	}
	else if (intTo == 0) {
		alert(strError);
		objTo.focus();
	}
	else if (intFrom > intTo) {
		alert("The first page in the range must come before the last page in the range.");
		objFrom.focus();
	}
	else if (document.all) {
		ViewerPrintSetPages(intFrom, intTo);
		ViewerPageTrack("print", intFrom, intTo);
		var objPrn = document.getElementById("tbl_print");
		var objCan = document.getElementById("tbl_cancel");
		objPrn.style.visibility = "hidden";
		objCan.style.display = "";
		strOldTitle = document.title;
		var strPage = (intFrom == intTo) ? " - Page " + strFrom : " - Pages " + strFrom + " to " + strTo;
		ViewerSetTitle(strOldTitle, strPage);
		window.onafterprint = function() { ViewerPrintCancel(); };
		window.setTimeout("ViewerPrintBegin()",1000);
	}
	else {
		var intW = 200;
		var intH = 70;
		var intX = (screen.availWidth - intW) >> 1;
		var intY = (screen.availHeight - intH) >> 1;
		var objWindow = window.open(
			"../../Skins/Default/Print.aspx?c=" + Config.id + "&f=" + intFrom + "&l=" + intTo + "&pf=" + strFrom + "&pl=" + strTo,
			"_print",
			"left=" + intX + ",top=" + intY + ",screenX=0,screenY=0,scrollbars=0,status=no,width=" + intW + ",height=" + intH
		);
		objWindow.focus();
	}
} //ViewerPrintRange

function ViewerPrintBegin() {
	window.print();
} //ViewerPrintBegin

function ViewerPrintCancel() {
	document.title = strOldTitle;
	window.onafterprint = null;
	ViewerPrintPageChange();
	var objPrn = document.getElementById("tbl_print");
	var objCan = document.getElementById("tbl_cancel");
	objPrn.style.visibility = "visible";
	objCan.style.display = "none";
} //ViewerPrintCancel()

function ViewerPrintPageChange() {
	var intLeft = RepublicastGetPhysicalLeftPage();
	var intRight = RepublicastGetPhysicalRightPage();
	var intLeft = (intLeft == 0) ? intRight : intLeft;
	ViewerPrintSetPages(intLeft, intRight);
} //ViewerPrintPageChange

function ViewerPrintSetPages(intFrom, intTo) {
	var intSize = Config.sizes.length - 2;
	objDiv = document.getElementById("printer");
	while (objDiv.firstChild)
		objDiv.removeChild(objDiv.firstChild);
	for (var intPage = intFrom; intPage <= intTo; intPage++) {
		var strFull = "../../Engine/Page.aspx?c=" + Config.id + "&p=" + intPage + "&z=" + intSize;
		var objImg = document.createElement("IMG");
		objImg.src = strFull;
		objImg.className = (intPage == intTo) ? "" : "followed"; 
		objDiv.appendChild(objImg);
	} //for
} //ViewerPrintPageChange

function ViewerPrintOnLoad() {
	ViewerPrintSetPages(Config.first, Config.last);
	window.print();
	GlassButtonEnable("btn_close", true);
	window.close();
	setTimeout("try { window.close(); } catch(e) {}", 1000);
} //ViewerPrintOnLoad

//------------------------------------------------------
// Share
//------------------------------------------------------

function ViewerSharePageChange() {
	var intLeft = RepublicastGetPhysicalLeftPage();
	var intRight = RepublicastGetPhysicalRightPage();
	var intLeft = (intLeft == 0) ? intRight : intLeft;
	var objLeft = document.getElementById("img_share");
	objLeft.src = "../../Engine/Page.aspx?c=" + Config.id + "&p=" + intLeft + "&z=0"
} //ViewerSharePageChange;

function ViewerShareSend() {
	ErrorHideMessage();
	var objAdr = document.getElementById("input_friend");
	var objNam = document.getElementById("input_name");
	var strError = ViewerValidateEmail(objAdr.value);
	if ((strError == "") && (objNam.value == "")) {
		strError = "Please provide your name so that the\nreceiptant knows who you are.";
		objNam.focus();
	}
	if (strError != "")
		alert(strError);
	else {
		var objEma = document.getElementById("tbl_share");
		var objWai = document.getElementById("tbl_email");
		objEma.style.display = "none";
		objWai.style.display = "";
		window.setTimeout("ViewerShareSendBegin()",1000);
	}
} //ViewerShareSend

function ViewerShareSendBegin() {
	var objAdr = document.getElementById("input_friend");
	var objNam = document.getElementById("input_name");
	var objMsg = document.getElementById("input_message");
	var intLeft = RepublicastGetPhysicalLeftPage();
	var intRight = RepublicastGetPhysicalRightPage();
	var intLeft = (intLeft == 0) ? intRight : intLeft;
	ViewerPageTrack("share", intLeft, objAdr.value);
	var strData = objAdr.id + "=" + encodeURIComponent(objAdr.value);
	strData += "&" + objNam.id + "=" + encodeURIComponent(objNam.value);
	strData += "&" + objMsg.id + "=" + encodeURIComponent(objMsg.innerText);
	objAjaxShare = new clsAjax(null, true, function() { objAjaxShare.ready(); } );
	objAjaxShare.onready = "ViewerShareSendEnd";
	objAjaxShare.onerror = "ViewerShareSendFailed";
	objAjaxShare.post("../../Engine/Mail.aspx?c=" + Config.id + "&p=" + intLeft, strData);
} //ViewerShareSendBegin
	
function ViewerShareSendFailed(objAjax) {
	objAjax.response = "Ajax error: " + objAjax.error;
	ViewerShareSendEnd(objAjax);
} //ViewerShareSendFailed

function ViewerShareSendEnd(objAjax) {
	var strError = objAjax.response;
	objAjaxShare = null;
	var objEma = document.getElementById("tbl_share");
	var objWai = document.getElementById("tbl_email");
	objEma.style.display = "";
	objWai.style.display = "none";
	if (strError != "")
		alert(strError);
	else
		ErrorShowMessage("err_share", 5000);
} //ViewerShareSendEnd

function ViewerShareSocial(intType) {
	ViewerPageTrack("social", intType);
	var strLoc = encodeURIComponent(document.location.href);
	var strCap = encodeURIComponent(document.title);
	var strTgt = "social_" + intType;
	var strUrl = "";
	var intW = 800;
	var intH = 550;
	switch (intType) {
		case 0: strUrl = "../../Engine/Help/default.htm"; intW = 1024; intH = 768; break;
		case 1: strUrl = "http://www.facebook.com/share.php?u=" + strLoc + "&t=" + strCap; break;
		case 2: strUrl = "http://digg.com/submit?phase=2&url=" + strLoc; break;
		case 3: strUrl = "http://del.icio.us/post?url=" + strLoc + "&title=" + strCap; break;
		case 4: strUrl = "http://www.google.com/bookmarks/mark?op=add&output=popup&bkmk=" + strLoc + "&title=" + strCap; break;
		case 5: strUrl = "http://myweb.yahoo.com/myresults/bookmarklet?u=" + strLoc + "&t=" + strCap; break;
		case 6: strUrl = "http://www.newsvine.com/_wine/save?u=" + strLoc + ";title=" + strCap; break;
		case 7: strUrl = "http://www.stumbleupon.com/submit?adult=no&topic=arts&url=" + strLoc + "&title=" + strCap; break;
		case 8: strUrl = "http://reddit.com/submit?url=" + strLoc + "&title=" + strCap; break;
		case 9: strUrl = "http://cgi.fark.com/cgi/fark/edit.pl?new_url=" + strLoc; break;
	} //switch
	if (strUrl != "") {
		var intX = (screen.availWidth - intW) >> 1;
		var intY = (screen.availHeight - intH) >> 1;
		window.open(strUrl,strTgt,"left=" + intX + ",top=" + intY + ",screenX=0,screenY=0,scrollbars=1,status=no,width=" + intW + ",height=" + intH);
	}
}//ViewerShareSocial

function ViewerValidateEmail(strMail) {
	var strError = "";
	if (strMail == "")
		strError = "Please specify the email address\nof the friend that you wish to\nsend a link to this page";
	else {
		var objEmailFilter = /^\w+[\+\.\w-]*@([\w-]+\.)*\w+[\w-]*\.([a-z]{2,4}|\d+)$/i;
		if (!objEmailFilter.test(strMail))
			strError = strMail + " is incorrectly formatted for a email address";
		else {
			var strUrl = "../../Engine/DomainValidation.aspx?e=" + encodeURIComponent(strMail)
			var objAjax = new clsAjax(null, false);
			window.status = "Validating Email Domain, Please Wait ...";
			var strResult = objAjax.get(strUrl);
			window.status = "Done.";
			objAjax = null;
			if ((strResult == "") || (strResult != "Y"))
				strError = strMail + " doesn't appear to have a valid domain";
		}
	}
	return strError;
} //ViewerValidateEmail

//------------------------------------------------------
// Page tracking
//------------------------------------------------------

function ViewerPageTrack(strType, strParam1, strParam2) {
	if (Config.track) {
		if (typeof(strType) == "undefined") {
			strType = "view";
			strParam1 = RepublicastGetPhysicalLeftPage();
			strParam2 = RepublicastGetPhysicalRightPage();
			strParam1 = (strParam1 != 0) ? strParam1 : strParam2;
			strParam2 = (strParam2 != 0) ? strParam2 : strParam1;
		}
		var strData = "type=" + strType;
		strData += (typeof(strType) == "undefined") ? "" : "&param1=" + strParam1;
		strData += (typeof(strType) == "undefined") ? "" : "&param2=" + strParam2;
		objAjaxTrack = new clsAjax(null, true, function() { objAjaxTrack.ready(); } );
		objAjaxTrack.onready = "ViewerPageTrackResponse";
		objAjaxTrack.onerror = "ViewerPageTrackResponse";
		objAjaxTrack.post("../../Engine/Track.aspx?c=" + Config.id, strData);
	}
} //ViewerPageTrack

function ViewerPageTrackResponse(objAjax) {
} //ViewerPageTrackResponse
