function openDocument(sUNID, bBacklink, sSegEd, sContext)
{
	CntOpenDocument(sUNID, bBacklink, sSegEd, sContext);
}

function CntOpenDocument(sUNID, bBacklink, sSegEd, sContext, bAvail, sHost)
{
  	if (bBacklink==null) bBacklink = true;
  	if (sSegEd==null) sSegEd = window.CurrentSegEdition?window.CurrentSegEdition:"";
	if (sContext==null) sContext = window.CurrentCtx ? window.CurrentCtx : "";
	
	var sQueryStringAddin = window.CntQueryStringAddin ? CntQueryStringAddin : "";
	var sHt = window.CntDocHiLite==null ? "" : "&ht="+escape(window.CntDocHiLite);

	return  NavGetAction("DisplayDocument", "&unid="+sUNID+"&login=1&seged="+sSegEd+"&ctx="+sContext+sHt+sQueryStringAddin, bBacklink, sHost);
}

/*
	Open a document by its ID. 
*/
function CntOpenDocumentByID(sID, bBacklink,  sContext, sQueryStringAddin)
{
	if (sID==null||sID=="null") return false;

  	if (bBacklink==null) bBacklink = true;
	if (sContext==null) sContext = window.CurrentCtx ? window.CurrentCtx : "";

	if (sQueryStringAddin==null) sQueryStringAddin = "";
    if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;

	var sHt = window.CntDocHiLite==null ? "" : "&ht="+escape(window.CntDocHiLite);

	return  NavOpen("report-document.pag?docid="+sID+sQueryStringAddin, bBacklink);
}

function CntOpenDocumentByEditionID(sID, bBacklink)
{
	return CntOpenDocumentByID(sID, bBacklink);
}

/*
	Open the first document in the report, segment or section identified by the passed ID.
*/
function CntOpenDocumentByParentID(sID, bBacklink, sContext, sQueryStringAddin)
{
  	if (bBacklink==null) bBacklink = true;

	if (sQueryStringAddin==null) sQueryStringAddin = "";
    if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;

   return  NavGetAction("DisplayFirstDocument", "&pid="+sID+sQueryStringAddin, bBacklink);
}

function CntPrintDocument(sUNID, sSegEd)
{
  if (sSegEd==null) sSegEd = window.CurrentSegEdition?window.CurrentSegEdition:"";
  var sUrl = window.DirURL+"cstore.nsf/0/"+sUNID+"?OpenDocument&login=1&print=1&seged="+sSegEd;
  var sOptions = 'toolbar=yes,status=no,resizable=yes,scrollbars=yes';
  NavOpenPopupWindow(sUrl, sOptions);
}

function CntOpenReport(sUNID, bBacklink)
{
  if (bBacklink==null) bBacklink = true;
  var sQueryStringAddin = window.CntQueryStringAddin ? CntQueryStringAddin : "";
  return  NavGetAction("DisplayReport", "&unid="+sUNID+sQueryStringAddin, bBacklink);
}

function CntOpenReportByEditionID(sID, sEdition, bBacklink)
{
	return CntOpenReportByID(sID, bBacklink);
}

function CntOpenReportByID(sID, bBacklink,sQueryStringAddin)
{
  if (bBacklink==null) bBacklink = true;
  if (sQueryStringAddin==null) sQueryStringAddin = "";
  if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;
  return  NavOpen("report-homepage.pag?repid="+sID+sQueryStringAddin, bBacklink);
}

function CntOpenEventByID(sID, bBacklink,sQueryStringAddin, sType)
{
  if (bBacklink==null) bBacklink = true;
  if (sQueryStringAddin==null) sQueryStringAddin = "";
  if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;
  // These need to match site.xml entries
  if (sType="0") return  NavOpen("summits-details.pag?eventid="+sID+sQueryStringAddin, bBacklink);
  if (sType="1") return  NavOpen("summits-details.pag?eventid="+sID+sQueryStringAddin, bBacklink);
  if (sType="2") return  NavOpen("summits-details.pag?eventid="+sID+sQueryStringAddin, bBacklink);
  if (sType="3") return  NavOpen("summits-details.pag?eventid="+sID+sQueryStringAddin, bBacklink);
  if (sType="4") return  NavOpen("ecast.pag?eventid="+sID+sQueryStringAddin, bBacklink);
}

function CntPriceReport(sUNID, bBacklink)
{
  if (bBacklink==null) bBacklink = true;
  return  NavGetAction("PriceReport", "&unid="+sUNID+"&login=1", bBacklink);
}

function CntOpenServiceByID(sID, bBacklink)
{
  	if (bBacklink==null) bBacklink = false;
	return NavOpen("subscription-homepage.pag?svcid="+sID, bBacklink);
}

function CntOpenWatchServiceByID(sID, bBacklink,sQueryStringAddin)
{
  return CntOpenServiceByID(sID, bBacklink);
}

function CntOpenMarketServiceByID(sID, bBacklink,sQueryStringAddin)
{
  return CntOpenServiceByID(sID, bBacklink);
}

function CntOpenServiceGroupByID(sID, bBacklink,sQueryStringAddin)
{
	if (bBacklink==null) bBacklink = false;
	return NavOpen("svcg.pag/"+sID, bBacklink);
}

function CntOpenFolderItem(sDb, sUNID, bBacklink)
{
  if (bBacklink==null) bBacklink = true;

  var sContext = window.CurrentCtx ? window.CurrentCtx : "fdr";
  
  return  NavGetAction("DisplayFolderItem", "&db="+sDb+"&unid="+sUNID+"&ctx="+sContext, bBacklink);
}

function CntOpenNews(sUNID, bBacklink, bReload,sQueryStringAddin)
{
  if (bBacklink==null) bBacklink = true;

  if (sQueryStringAddin==null) sQueryStringAddin = "";
  if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;

  if (StdGetCookie("FcmUser2")==null)
  	return  NavOpen("../portal.nsf/frmUserRegistration?OpenForm"+sQueryStringAddin, bBacklink, bReload);
  else
  	return  NavOpen("../news.nsf/0/"+sID+"?OpenDocument&login=1"+sQueryStringAddin, bBacklink, bReload);
}

function CntOpenNewsByID(sID, bBacklink, bReload,sQueryStringAddin)
{
  if (bBacklink==null) bBacklink = true;

  if (sQueryStringAddin==null) sQueryStringAddin = "";
  if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;

	var url = "market-insight.pag?docid="+sID+sQueryStringAddin;

	//We generally want context propagated since this function is used for embedded links
	if (window.CtxPropagate) url = CtxPropagate(url);

	NavOpen(url);
}

function CntOpenNewsByIDForPrint(sID, bBacklink, bReload,sQueryStringAddin)
{
	// note that cntPrintNews is probably redundant now...

  if (bBacklink==null) bBacklink = true;

  if (sQueryStringAddin==null) sQueryStringAddin = "";
  if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;

	var url = "market-insight-print.pag?docid="+sID+sQueryStringAddin;

	//We generally want context propagated since this function is used for embedded links
	if (window.CtxPropagate) url = CtxPropagate(url);

  var sOptions = 'toolbar=yes,status=no,resizable=yes,scrollbars=yes,menubar=yes';
  NavOpen(url, sOptions);
  
}

function CntOpenReleaseByIDForPrint(sID, bBacklink, bReload,sQueryStringAddin)
{

  if (bBacklink==null) bBacklink = true;

  if (sQueryStringAddin==null) sQueryStringAddin = "";
  if (window.CntQueryStringAddin) sQueryStringAddin+= window.CntQueryStringAddin;

	var url = "press-release-print.pag?docid="+sID+sQueryStringAddin;

	//We generally want context propagated since this function is used for embedded links
	if (window.CtxPropagate) url = CtxPropagate(url);

  var sOptions = 'toolbar=yes,status=no,resizable=yes,scrollbars=yes,menubar=yes';
  NavOpen(url, sOptions);
  
}

function CntOpenWithLogin(sUNID,  sDb, bBacklink, bReload)
{
  if (bBacklink==null) bBacklink = true;

  if (StdGetCookie("FcmUser2")==null)
  	return  NavRegister();
  else
  	return  NavOpen("../" +sDb+"/0/"+sUNID+"?OpenDocument&login=1", bBacklink, bReload);
}

function CntOpenCorpNews(sUNID, bBacklink, bReload)
{
  if (bBacklink==null) bBacklink = true;

  return  NavOpen("../corpnews.nsf/0/"+sUNID+"?OpenDocument", bBacklink, bReload);

}

function CntPrintNews(sUNID, sDB)
{

  var sUrl = window.DirURL + sDB + "/0/"+sUNID+"?OpenDocument&print=1";

  var sOptions = 'toolbar=yes,status=no,resizable=yes,scrollbars=yes';
  NavOpenPopupWindow(sUrl, sOptions);
}

function CntOpenPdf(sUNID, sFile)
{
  var sUrl = window.DirURL+"pdf.nsf/0/"+sUNID+"/$File/"+sFile;
  var sOptions = 'toolbar=no,menubar=no,status=no,resizable=yes,scrollbars=yes';
  NavOpenPopupWindow(sUrl, sOptions);
}

function CntOpenBrochurePdf(sUNID, sFile)
{
  var sUrl = window.DirURL+"pdf.nsf/0/"+sUNID+"/$File/"+sFile + "?OpenElement";
  var sOptions = 'toolbar=no,menubar=no,status=no,resizable=yes,scrollbars=yes';
  NavOpenPopupWindow(sUrl, sOptions);
}

function CntOpenFile(sDb, sUNID, sFile)
{
  var sUrl = window.DirURL+sDb+"/0/"+sUNID+"/$File/"+sFile;
  var sOptions = 'toolbar=no,menubar=no,status=no,resizable=yes,scrollbars=yes';
  NavOpenPopupWindow(sUrl, sOptions);
}


function CntAddToFolder(sID)
{
	if (confirm("Add this item to your personal folder?  "))
		NavGetAction("AddToPersonalFolder", "&id="+sID, true);
}

function CntAddDocumentToFolder(sID)
{
	if (confirm("Add this document to your personal folder?  "))
		NavGetAction("AddToPersonalFolder", "&id="+sID, true);
}

function CntAddCurrentDocumentToFolder( )
{
	if (confirm("Add the current document to your personal folder?  "))
		NavGetAction("AddToPersonalFolder", "&id=" + window.CurrentCatId, true);
}

function CntGetSelectedItems(sName, sParmName)
{
	var fm = _StdGetMainForm();
	var cbs = fm[sName];
	if (cbs==null) return "";

	if (cbs.length==null) return (cbs.checked)?"&"+sParmName+"="+cbs.value:"";

	var sUnids = "";

	for (var n=0; n<cbs.length; n++) {
		if (cbs[n].checked) sUnids += "&"+sParmName+"="+cbs[n].value;
	}

	return sUnids;
}

function CntCountSelectedItems(sName)
{
	var fm = _StdGetMainForm();
	var cbs = fm[sName];
	if (cbs==null) return "";

	if (cbs.length==null) return (cbs.checked)?1:0;

	var iCount = 0;
	for (var n=0; n<cbs.length; n++) {
		if (cbs[n].checked) iCount++;
	}

	return iCount;
}

function CntAddSearchResultsToFolder( )
{
	var sSels = CntGetSelectedItems("Sel", "id");
	
	if (sSels=="") {
		alert("No items have been selected.   ");
		return;
	}

	if (confirm("Add the selected items to your personal folder?   "))
		NavGetAction("AddToPersonalFolder", sSels, true);

}

function CntRemoveFromFolder( )
{
	var sUnids = CntGetSelectedItems("FdrSel", "unid");
	
	if (sUnids=="") {
		alert("No items have been selected.");
		return;
	}

	if (window.CurrentFolderId==null) {
		alert("No CurrentFolder variable present");
		return;
	}

	NavGetAction("RemoveFromFolder", "&fid="+window.CurrentFolderId+sUnids, true);
}


function CntRemoveFolderItems( )
{
	
	var sds = CntGetSelectedItems("Sel", "id");
	
	if (sds=="") {
		alert("No items have been selected.");
		return;
	}

	// Calls RemoveFolderItemsHandler
	NavGetAction("RemoveFolderItems", sds, true);
}


function CntAddSelectedToBasket( )
{
	var sIds = CntGetSelectedItems("Sel", "id");
	
	if (sIds=="") {
		alert("No items have been selected.   ");
		return;
	}

	if (confirm("Add the selected items to your basket?   "))
		NavGetAction("AddToBasket", sIds, true);

}

function CntBuySelected(sJobCode )
{
	var sIds = CntGetSelectedItems("Sel", "id");
	
	if (sIds=="") {
		alert("No items have been selected.   ");
		return;
	}

	if (sJobCode==null) sJobCode = "";
	
	if (confirm("Buy the "+CntCountSelectedItems("Sel")+" selected items ?   "))
		NavGetAction("BuySelection", sIds+"&jobcode="+sJobCode, true);

}

function CntPrintSelectedItems( )
{
	var sIds = CntGetSelectedItems("Sel", "id");
	
	if (sIds=="") {
		alert("No items have been selected.   ");
		return;
	}

	NavOpenPopupWindow(NavGetActionUrl("PrintCollection", sIds));
}

function CntRemoveFromBasket( )
{
	var sIds = CntGetSelectedItems("Sel", "id");
	
	if (sIds=="") {
		alert("No items have been selected.");
		return;
	}

	if (window.CurrentBasketId==null) {
		alert("No CurrentBasketId variable present");
		return;
	}

	NavGetAction("RemoveFromBasket", "&bskid="+window.CurrentBasketId+sIds, true);
}


function CntHiLite(sHilite)
{
	if (sHilite==null || sHilite=='') return;
	if (document.all) 
	    if (document.documentElement) {
	        var sReg = "(\\s|,|\\.|;|^)("+HltApplyStemming(sHilite)+")(\\s|,|\\.|;|$)";
	        var e = document.getElementById("Body");
	        if (e) HltHiLiteNode(e, sReg);
	        /*
	        e = document.getElementById("Head1")
	        if (e) HltHiLiteNode(e, sReg)
	        e = document.getElementById("Head2")
	        if (e) HltHiLiteNode(e, sReg)
	        e = document.getElementById("Head3")
	        if (e) HltHiLiteNode(e, sReg)
	        e = document.getElementById("Head4")
	        if (e) HltHiLiteNode(e, sReg)
	        */
	    }

}

function HltHiLiteNode( e, sReg )
{
	var sText = e.innerHTML;
	sText = sText.replace(new RegExp(sReg, "gi"), "$1<span class=\"SearchHilight\">$2</span>$3");
	e.innerHTML = sText;
}


function HltApplyStemming(sWord)
{
	var sResult = "";
	
	if (typeof(sWord)!="string") {
		for ( i in sWord) {
			if (sResult!="") sResult += "|";
			sResult += HltApplyStemming(sWord[i]);
		}
		return sResult;
	}

	if (sWord.indexOf("*")!=-1) return sWord.replace(/\*/i, "\\w*");
	if (sWord.indexOf("%")!=-1) return sWord.replace(/\%/i, "\\w*");//////////////////
	
	var aSuffix = HltGetSuffixList( );

	var sSuffix = "";
	for ( i in aSuffix) {
		if (sSuffix!="") sSuffix += "|";
		sSuffix += (aSuffix[i]+"$");
	}
	var sRoot = sWord.replace(new RegExp(sSuffix, "i"),"")
	
	for ( i in aSuffix) {
		if (sResult!="") sResult += "|";
		sResult += (sRoot+aSuffix[i]);
	}
	
	return sResult + "|"+sWord  ;
}


function HltGetSuffixList( )
{
	return new Array("ing", "ed", "s", "y", "ies")
}


function CntSetTocLevel( iLevel )
{
    if (iLevel<1) iLevel=1;
    if (iLevel>3) iLevel=3;
    var url = window.location.href.replace(/&level=[^&]*/i, "") + "&level="+iLevel;
    NavReplace(url, false, true);
}


function CntValidateJobcode(sJobCode, sMandatory, sPattern, sExample) 
{
  //If job code is mandatory check it is present.
  if (( sJobCode== null || sJobCode.length==0)) {
    if (sMandatory != "1") 
       return true;
    else {
      alert ("Please enter the Job Code for this purchase");
      return false;
    }
  }

  // See if there is a Job Code pattern for this account
  if (( sPattern== null || sPattern.length==0)) return true;

  // See if there is a Job Code example for this account
  if ( sExample=="") sExample = null;

  //To be valid the match found must be the whole string
  if (sPattern.charAt(0)!='^') sPattern = "^"+sPattern;
  if (sPattern.charAt(sPattern.length-1)!='$') sPattern += "$";

  //Match the entered job code to the pattern
  var r = new RegExp(sPattern); 
  var a = sJobCode.match(r);

  //Check for a match
  if (a==null || a.length==0 || a[0]!=sJobCode) {	
    if (sExample==null) alert ("Job Code is invalid    ");
	  else alert("Please enter a Job Code in the form '"+sExample+"'    ");
   return false;
  }
   
   //Code is valid
   return true;
} 


