/*
	File Version Start - Do not remove this if you are modifying the file
	Build: 10.0.0
	File Version End

	(c) Business Objects 2003-2004.  All rights reserved.
*/

// TODO: This may need to be revisited:  can (should) we dump the Netscape7 handling?
var BROWSER_INTERNET_EXPLORER = ( window.navigator.userAgent.toLowerCase().indexOf('msie') != -1);
var BROWSER_SAFARI = ( window.navigator.userAgent.toLowerCase().indexOf('applewebkit') != -1);
var BROWSER_FIREFOX = ( window.navigator.userAgent.toLowerCase().indexOf('firefox') != -1);
var BROWSER_GECKO = ( window.navigator.userAgent.toLowerCase().indexOf('gecko') != -1) && (!BROWSER_SAFARI) && (!BROWSER_FIREFOX);

var IE_CLOSE_SCREEN_LEFT = 10004; // IE magic number for closing browser window.
var IE_CLOSE_MIN_SCREEN_LEFT = -32000; // IE magic number for closing browser window while minimized.

var DEFAULT_NAV_WIDTH = "200";
var Current_Workspace_Header_Title = "";
//
// utility functions
//

/**
 * Dummy function to be used as the src of iframe or frame to prevent the unsecure message 
 * when using IE6 through https.
 */ 
function empty() {
  return '';
}

function getHeaderPlusFrame() {
	var hpWindow = null;
	if (isNetscape70() || BROWSER_GECKO) {
		hpWindow = top;
	}
	else {
		hpWindow = findFrame('headerPlusFrame');
	}
	// check hpWindow if it is headerPlus.do (main.jsp)
	try {
		if (hpWindow.headerPlusFrameProp==undefined)
			hpWindow = findHPWindow();
	} catch (ex) {
		// hpWindow violate the same origin policy (across domains)
		hpWindow = findHPWindow();
	}
	return hpWindow;
}
function getDataController() {
	return findFrame('dataFrame');
}
function getNavWorkController() {
	return findFrame('dataFrame');
}
function getWorkspaceController() {
	return findFrame('workspaceBodyFrame');
}

function findHPWindow() {
	// To find the HeaderPlus Window
	var mywin = window;	// current window
	try {
		// search upwards only
		while (mywin != mywin.parent && mywin.parent && mywin.parent.document) {
			// check unique HeaderPlus Window properties
			if (mywin.headerPlusFrameProp!=undefined) {
				break;
			}
			mywin = mywin.parent;
		}
	} catch (ex) {
		// stop at the current frame, if mywin.parent.document returns access denied error.
		// This happens when the parent frame has a different URL context than the current frame.
	}
	// final check of mywin if it is the HeaderPlus Window
	if (mywin.headerPlusFrameProp!=undefined) {
		return mywin;
	} else {
		return null;
	}
}
function findElementById(Id) {
	var mywin = window;
	try {
		while (mywin != mywin.parent && mywin.parent && mywin.parent.document) {
			mywin = mywin.parent;
		}
	} catch (ex) {
		// stop at the current frame, if mywin.parent.document returns access denied error.
		// This happens when the parent frame has a different URL context than the current frame.
	}
	var f = null;
	try {
		f = mywin.document.getElementById(Id);
	} catch(ex) {
		// do nothing
	}
	if (f != null) return f;

	for (var i = 0; i < mywin.length; i++) {
		f = findElementHelper(mywin.frames[i], Id);
		if (f != null) return f;
	}
	return null;
}
function findElementHelper(frame, Id) {
	// frames with certain plugins (word, excel) will cause a js error because the frame document doesn't exist
	if ((typeof(frame.document)).toLowerCase() == "unknown") return null;

	var f = null;
	try {
		f = frame.document.getElementById(Id);
	} catch(ex) {
		// Ignore this frame if we can't access it.  NS will return "Permission denied to get property
		// HTMLDocument.getElementById" on some frames (eg: external hyperlink page)
	}

	if (f != null) return f;

	for (var i = 0; i < frame.length; i++) {
		f = findElementHelper(frame.frames[i], Id);
		if (f != null) return f;
	}
	return null;
}

function findFrame(frame) {
    var f = findElementById(frame);
    if (f) {
        if (f.contentWindow)
        {
            return f.contentWindow;
        }
    }
    return f;
}

function getSelectedId() {
	var navWork = getNavWorkController();
	var hplus = getHeaderPlusFrame();
	if (hplus.showFolders) {
		return navWork.selectedFolder;
	} else {
		return navWork.selectedCategories;
	}
}

function showListing() {
	var navWorkFrame = getNavWorkController();
	var hplus = getHeaderPlusFrame();
	if( hplus != null && navWorkFrame != null )
	{
		if (hplus.showFolders) {
			navWorkFrame.displaySelectedFolderContents();
		} else {
			navWorkFrame.displaySelectedCategoryContents();
		}
	}
}

function showInWorkspaceDashboard(url, hideTitle, hideCollapseExpandButton)
{
    // extract the id
    var currentUrl = url;
    var objId = null;
    if( currentUrl )
    {
        var strBegin = currentUrl.indexOf("objId") + 6;

        if( strBegin != -1 )
        {
            var strEnd = currentUrl.indexOf("&",strBegin);

            if (strEnd==-1)
                strEnd = currentUrl.length;

            objId = currentUrl.substring(strBegin,strEnd);
        }
    }

    // update encyclopedia  (we don't need to guard against isNetscape70?)
    updateRightFrame(objId);

    resetLastActionId();

    if (url)
    {
        if( !isNetscape70() )
        {
            // update discussion
            showDiscussions(objId);
        }

        // need to add the show/hide state of the topbar and the nav bar here...
        var topBarShown = true;
        var wsHdrFrame = findFrame('workspaceHeaderFrame');
        if (wsHdrFrame != null)
        {
	        topBarShown = (wsHdrFrame.bHeaderCurrentlyShown);
        }
        url = url + "&topBarShown=" + topBarShown;

        var wkspace = getWorkspaceController();
        if (hideTitle) {
            setWorkspaceHeaderTitle2("","");
        }
        if (hideCollapseExpandButton) {
            var wsHeaderFrame = findFrame('workspaceHeaderFrame');
            if( wsHeaderFrame != null )
                wsHeaderFrame.hideCollapseExpandButtons();
        }
        if (wkspace && ((typeof(wkspace.document)).toLowerCase() != "unknown")) {
            wkspace.document.location.href = url;
        } else {
            var wsFrame = findFrame('workspaceFrame');
            if (wsFrame) {
                var loc = "workspace.do?url=" + _URIEncode(url);
                wsFrame.location.href = loc;
            }
        }
    }
}

function checkThirdPartyPermissionDenied (wkspace) {
	var f = null;
	try {
		f = wkspace.document.location.href;
	} catch(ex) {
		// Ignore this workspace if we can't access it.  NS will return "Permission denied to get property
		// HTMLDocument.domain" on some frames (eg: external hyperlink page)
	}

	return f;	
}

// NOTE: signature has changed from showInWorkspace(url, preserveActionId, id)
//
function showInWorkspace(url, showNewWindowButton, preserveActionId, id) {
    setWorkspaceHeaderTitle("");
    var wsHeader = findFrame('workspaceHeaderFrame');

    if (showNewWindowButton != undefined && showNewWindowButton == true)
    {
        if(wsHeader && wsHeader.displayNewWindowButton)
            wsHeader.displayNewWindowButton();
    }
    else
    {
        if(wsHeader && wsHeader.hideNewWindowButton)
            wsHeader.hideNewWindowButton(); 
    }

    
    /* TODO: do we still need this? id used for encyclopedia, lastActionId for sendto from page currently being viewed, I think.
    if (id != -1) {
		if (id != undefined) {
			updateRightFrame(id);
		} else {
			updateRightFrame();
		}
	}

	if (!preserveActionId) {
		// resetLastActionId();
	}
	*/
    
    if (url) {
        // need to work around some safari behavior when finding frame "workspaceFrame"
        if(isSafari() && 'workspaceBodyFrame' == window.name) {
            document.location.href = url;
            return;
        }

        var wkspace = getWorkspaceController();
        var locationHref = checkThirdPartyPermissionDenied(wkspace);
        var wkspaceDocumentExist = false;
        try {
            wkspaceDocumentExist = (typeof(wkspace.document)).toLowerCase() != "unknown";
        } catch(ex) {
            wkspaceDocumentExist = false;
        }

        if (wkspace && wkspaceDocumentExist && locationHref != null) {
            var docObj = wkspace.document;
            if (isSafari() && wkspace.contentDocument) {
                // Safari sometimes returns the frameElement.document as the ownerDocument (parent container's document).
                // frameElement.contentDocument is more reliable here.
                docObj = wkspace.contentDocument;
            }
            docObj.location.href = url;
        } else {
            var wsFrame = findFrame('workspaceFrame');
            if (wsFrame) {
            	var loc = wsFrame.location.href;
            	if (loc.indexOf("workspace.do") > 0) {
            	    // try to reuse wsFrame.location.href (absolute path) for encyclopedia case (ADAPT01085539)
            		var queryStart = loc.indexOf( "?" );
                    if( queryStart > 0 )
                        loc = loc.substring( 0, queryStart );
					// check for encyclopedia case (ADAPT01085539), context path is different from what is hardcoded in refreshGenericObject().
					if (url.indexOf("../../jsp/Encyclopedia/applications/busy.html") == 0) {
						url = url.replace("../../jsp/Encyclopedia/applications/busy.html", "../../PlatformServices/jsp/Encyclopedia/applications/busy.html");
					}
                    loc = loc + "?url=" + _URIEncode(url);
            	}
            	else {
                	loc = "workspace.do?url=" + _URIEncode(url);
                }
                wsFrame.location.href = loc;
            } else {
                document.location.href = url;
            }
        }
    }
}


// Desired behaviour is to go to last visited of: initial view, home page,
// folder/category list, search results.  Paging included.
// TODO: determine how this will work with listing implemented by URE: it may cache its state?
// I believe that advanced search (and discovery search) is rendered in main URE page.
// Also need to be careful about relative urls.  Since this is invoked infoView jsp files, a url for a
// search action based somewhere else needs still be relative to our callers (main,jsp, error.jsp)

function showLastWorkspace(defaultUrl) {
    var navWorkFrame = getNavWorkController();
    if( navWorkFrame != null )
    {
        var url = navWorkFrame.defaultWorkspacePage;
        if (defaultUrl && (defaultUrl.length > 0)) {
            url = defaultUrl;
        }
        if (navWorkFrame.lastWorkspacePage) {
            url = navWorkFrame.lastWorkspacePage;
//            restoreLastActionId();
        }
//        else resetLastActionId();
        showInWorkspace(url, false, true);
    }
}

function saveWorkspace(urlToSave) {
	if (urlToSave.length == 0) return;

	var navWorkFrame = getNavWorkController();
	// saveLastActionId();
	navWorkFrame.setLastWorkspacePage(urlToSave);
}

// TODO: does anyone still use this?
function getLastWorkspace() {
	var navWorkFrame = getNavWorkController();
	if (navWorkFrame.lastWorkspacePage && (navWorkFrame.lastWorkspacePage.length > 0))
		return navWorkFrame.lastWorkspacePage;
	else
		return navWorkFrame.defaultWorkspacePage;       // home page
}

function showInListing(url) {
	if (url) {
		var listingframe = findFrame('objectListBodyFrame');
		if (listingframe)
			listingframe.document.location = url;
		else
			showInWorkspace(url);
	}
}

function showNoAccess (contextPath) {
	var url = contextPath + "/InfoView/common/" + "noAccess.do";
	resetLastActionId();
	var wkspace = getWorkspaceController();
	if (wkspace)
		showInWorkspace (url);
	else
		document.location = url;
}

//This function is to fix the bug in IE/XP where in full screen mode all toolbars are hidden (Can't close window)
function ieFixWindowProps(windowProps){
    if (windowProps.indexOf('fullscreen') > -1){
      var newFullScreenString = "left=0,top=0,width=" + (screen.width-10) + ",height=" + (screen.height-70);
      var fullIndex = windowProps.indexOf('fullscreen');
      if (windowProps.indexOf(',', fullIndex) > -1){
        windowProps = windowProps.substring(0, fullIndex - 1) + newFullScreenString
                      + windowProps.substring(windowProps.indexOf(',', fullIndex));
      }else{
        windowProps = windowProps.substring(0, fullIndex - 1) + newFullScreenString;
      }
    }
    return windowProps;
}

function resetLastActionId() {
    var f = getHeaderPlusFrame();
    if( f != null )
        f.setLastActionId(null);
}
function setLastActionId(id) {
	var f = getHeaderPlusFrame();
	if( f != null )
		f.setLastActionId(id);
}
function getLastActionId() {
	var f = getHeaderPlusFrame();
	if (f != null && f.lastActionId)
        return String(f.lastActionId);
	else
        return null;
}
function saveLastActionId() {
	var f = getHeaderPlusFrame();
    if( f != null )
        f.setSavedLastActionId(f.lastActionId);
}
function restoreLastActionId() {
	var f = getHeaderPlusFrame();
    if( f != null )
        f.setLastActionId(f.savedLastActionId);
}

function addQueryStrSep(url)
{
    if (url.length == 0)
        return "?";

    if (-1 == url.indexOf('?'))
    {
        return url + "?";
    }
    else
    {
        if ('&' != url.charAt(url.length - 1))
            return url + "&";
        else
            return url;
    }
}

function _HtmlEncode (s)
{
	es = s.replace(/\&/g,"&amp;");
	es = es.replace(/\</g,"&lt;");
	es = es.replace(/\>/g,"&gt;");
	es = es.replace(/\'/g,"&apos;");
	es = es.replace(/\"/g,"&quot;");
	return es;
}

function getJSDate(calendarName)
{
	var dateString = (document.getElementsByName(calendarName + ".date"))[0].value; 
	var dateArray = dateString.split("."); 
	var hour = (document.getElementsByName(calendarName + ".hour"))[0].selectedIndex; 
	var min = (document.getElementsByName(calendarName + ".minute"))[0].selectedIndex; 
	var AMorPM = document.getElementsByName(calendarName + ".ampm"); 
	if(AMorPM) {
		hour += 1; 
		if((AMorPM[0]).selectedIndex == 0 && hour == 12) hour = 0;  
		if((AMorPM[0]).selectedIndex == 1 && hour != 12) hour = hour + 12;  
	}
	var date = new Date(dateArray[0], dateArray[1] -1, dateArray[2], hour, min, 0); 
	return date;
}

// NOTE: added optional parameter showNewWindowButton
//
function gotoAction(url, id, viewInPortal, windowName, windowProps, showNewWindowButton)
{
	var frame = getHeaderPlusFrame();
    if( frame != null )
    {
		frame.lastUrl = url; 
		frame.lastWindowName = windowName + id; 
		frame.lastWindowProps = windowProps; 
    }
    if (BROWSER_GECKO && url.indexOf("CrystalEnterprise_MyInfoView") != -1)
    {
	// setLastActionId(id);
	if (!windowName)
	    windowName = "iv";
	if (!windowProps)
	    windowProps = "fullscreen=yes,location=no,scrollbars=yes,menubars=no,toolbars=no,resizable=yes";
	window.open(url, windowName, ieFixWindowProps(windowProps));
	return;
    }
    
    var wkspace = getWorkspaceController();
    if (!wkspace)
    {
        // If we are not in an InfoView subframe.
        var finalUrl = addQueryStrSep(url) + "backbutton=false"; 
        if (viewInPortal && !(isNetscape70() && windowName))
            window.top.location.href = finalUrl;
        else
            window.open(finalUrl, windowName, ieFixWindowProps(windowProps));
    }
    else
    {
        // setLastActionId(id);
        if (viewInPortal && !(isNetscape70() && windowName)) {
            //showDiscussions(id);
			// Update the workspace id even after viewing a shortcut document inside InfoView. (ADAPT01093653)
	        updateRightFrame(id);
            var showNWB = (showNewWindowButton != undefined && showNewWindowButton == true);
            showInWorkspace(url, showNWB, true, id);
        } else {
            window.open(url, windowName, ieFixWindowProps(windowProps));
        }
	}
}
function toggleNav (bShow)
{
	// do nothing for netscape 7.0 since it refreshes the whole page
	if (isNetscape70())
		return;

	if (bShow != undefined)
	{
		toggleNavBase(bShow);
	}
	else
	{
		toggleNavBase();
		var navWorkFrame = getNavWorkController();
		bShow = navWorkFrame.navFrameShown;
	}
	setPanelStateForRestoredWorkspace ('nav', bShow);
}

function toggleNavBase(bShow)
{
	// do nothing for netscape 7.0 since it refreshes the whole page
	if (isNetscape70())
		return;

	var navWork = getNavWorkController();
	if(navWork == null)
		return;
	if (bShow != undefined) {
		navWork.setNavFrameShown(bShow);
	} else {
		navWork.setNavFrameShown(!navWork.navFrameShown);
	}
	var fs = navWork.document.getElementById('navWorkFrameSet');
	var frame = navWork.document.getElementById('navigationFrame');

	var navFrameCol = fs.cols.substr(0, fs.cols.indexOf(','));
    var restOfCols = fs.cols.substr(fs.cols.indexOf(','));

    //Make sure the centre frame is always *
    restOfCols = restOfCols.replace(/,.*,/, ",*,");
	if (navWork.navFrameShown) {
		frame.noResize=false;
		if (navWork.navCols)
            fs.cols = navWork.navCols + restOfCols;
		else
			fs.cols = DEFAULT_NAV_WIDTH + restOfCols;
	} else {
		// save the last state
		if (navFrameCol != "0")
			navWork.setNavCols(navFrameCol);
		fs.cols="0" + restOfCols;
		frame.noResize=true;
	}
	var headerPlus = getHeaderPlusFrame(); 
	if(headerPlus != null && headerPlus.btnNav != null) 
	 	headerPlus.btnNav.check(navWork.navFrameShown, false); 
}


function toggleDiscussionsBase(bShow) {
    var discussHeader = findFrame('discussionsHeaderFrame');
    if (discussHeader != null)
    {
        discussHeader.toggleDiscussionsFrameBase(bShow);
    }
}

function disableDiscussionFrame( disable ) {
    var discussHeader = findFrame('discussionsHeaderFrame');
    if (discussHeader != null)
    {
        discussHeader.disableDiscussionFrame( disable );
    }
}

function toggleFoldersCategories(bShowFolders, id)
{
	var navHeaderFrame = findFrame('navigationHeaderFrame');
	if (navHeaderFrame) {
		var navWork = getNavWorkController();
		if (bShowFolders) {
			navWork.setSelectedFolder(id);
			navHeaderFrame.displayFolders(id);
		} else {
			navWork.setSelectedCategories(id);
			navHeaderFrame.displayCategories(id);
		}
	}
}

function selectNavNodeAndDisplay(bShowFolders, id) {
	toggleFoldersCategories(bShowFolders, id);
	showListing();
}

function refreshEntireNavTree(){
	var f = findFrame('navigationBodyFrame');
	if (f) {
		if (f != window)
			f.refreshEntireNavTree();
		else
			f.refreshEntireNavTree_Impl();
	}
}

function refreshSelectedNavNode(){
    var f = findFrame('navigationBodyFrame');
    if (f !=  null)
    {
        f.refreshSelectedNavNode();
    }
}

function refreshSelectedNavNodeChildren(){
    var f = findFrame('navigationBodyFrame');
    if (f !=  null)
    {
        f.refreshSelectedNavNodeChildren();
    }
}

function selectSelectedNavNodeParent(){
    var f = findFrame('navigationBodyFrame');
    if (f !=  null)
    {
        f.selectSelectedNavNodeParent();
    }
}

function expandSelectedNavNode(){
    var f = findFrame('navigationBodyFrame');
    if (f !=  null)
    {
        f.expandSelectedNavNode();
    }
}

function refreshNodeDisplayContents()
{
	toggleNav(true);
	refreshSelectedNavNodeChildren();
	showListing();
}

function getWorkspaceHeaderTitle () {
	var wsHeaderFrame = findFrame('workspaceHeaderFrame');
	var title = wsHeaderFrame.getTitleText();
	return title;
}
function setWorkspaceHeaderTitle(title) {
	var wsHeaderFrame = findFrame('workspaceHeaderFrame');
	if (wsHeaderFrame && wsHeaderFrame.setTitle) {
		wsHeaderFrame.setTitle(title);
	}
	var f = getHeaderPlusFrame();
    if( f != null && f.setSavedWorkspaceHeaderTitle)
        f.setSavedWorkspaceHeaderTitle (title);
}

function setWorkspaceHeaderTitle2(title, link) {
	var wsHeaderFrame = findFrame('workspaceHeaderFrame');
	if (wsHeaderFrame && wsHeaderFrame.setTitle2) {
		wsHeaderFrame.setTitle2(title, link);
	}
	var f = getHeaderPlusFrame();
    if( f != null && f.setSavedWorkspaceHeaderTitle2)
        f.setSavedWorkspaceHeaderTitle2 (title,link);
}

function showDiscussions(id) {
	var frame = getDataController();
	if( frame != null )
		frame.showDiscussions(id);
}

// TOOLBAR: creation helper functions
// Id map for menu items
function createIdMap (theArray) {
	var map = new Object();
	for (var i = 0; i < theArray.length; i++) {
		map[theArray[i].id] = i;
	}
	return map;
}

function panelButtonHover(id, newImg) {
	var img = document.getElementById(id);
	if (img && img.src) {
		img.src = newImg.src;
	}
}

//  -comma separated lists-
// input is a (probably) a hidden input
// item is a string
// only adds unique items
function addToCSList(input, item)
{
	if (input.value.length > 0) {
		var oldvalue = "," + input.value + ",";
		if (oldvalue.indexOf("," + item + ",") == -1) {
			input.value += "," + item;
		}
	} else {
		input.value = item;
	}
}
function removeFromCSList(input, item)
{
	var items = input.value.split(",");
	var i;
	input.value = "";
	for (i = 0; i < items.length; i++) {
		if (items[i] != item && items[i] != "") {
			addToCSList(input, items[i]);
		}
	}
}

function _URIEncode(s)
{
   if( (typeof(encodeURIComponent)).toLowerCase() == "function" ) {
      //escape behaves differently in IE and Netscape; besides it's been deprecated and removed from the standard.
	  //Therefore use encodeURIComponent when we can.
	  return encodeURIComponent(s);
   } else {
	   //for Safari, which does not support encodeURIComponent;
	  var tmp = escape(s);
      // encode "+", since escape will not do it for us...
      return tmp.replace(/\+/g, "%2b");
   }
}

function isNetscape70() {
	return (navigator.product == "Gecko"
    && navigator.userAgent.indexOf("Netscape/7") != -1
    && navigator.userAgent.indexOf("Firefox") == -1);
}

function isSafari() {
	return (navigator.vendor == "Apple Computer, Inc.");
}

function netscapeOnScroll() {
	// Netscape 7.x has issues with scrolling where vertical lines appear when scrolling down
	// this seems to fix the problem...
	self.document.bgColor = self.document.bgColor;
}

if (isNetscape70()) {
	self.window.onscroll = netscapeOnScroll;
}

function resetListingVariables() {
	var headerFrame = getHeaderPlusFrame();
	if (headerFrame && headerFrame.resetListingVariables) {
		headerFrame.resetListingVariables();
	}
}

function toggleRightFrame(bShow)
{
	if (bShow != undefined)
	{
		toggleRightFrameBase(bShow);
		var headerFrame = getHeaderPlusFrame();
		if (!bShow && !headerFrame.rightPanelDisabled) {//toggle off RightFrame
			if (headerFrame && headerFrame.populateAppsMenu) {
				headerFrame.populateAppsMenu(bShow);
			}
		}
	}
	else
	{
		toggleRightFrameBase();
		var navWorkFrame = getNavWorkController();
    	bShow = navWorkFrame.rightFrameShown;
	}
	setPanelStateForRestoredWorkspace ('right', bShow);
}

function toggleRightFrameBase(bShow)
{
    var navWork = getNavWorkController();
    if(navWork == null)
        return;

    var frame = findFrame('rightFrame');
    if (frame == null) {
        return;
    }

    if (bShow == undefined) {
        bShow = !navWork.rightFrameShown;
    }

    var fs = navWork.document.getElementById('centerFrameset');
    var rf = navWork.document.getElementById('rightFrame');
    var rightCols = fs.cols.substr(fs.cols.lastIndexOf(',') + 1);
    if (bShow) {
        rf.noResize=false;
        fs.cols = "*," + navWork.rightFrame;
    } else {
        if (navWork.rightFrameShown) {
            rf.noResize=true;
	    	if (rightCols != "0")
                navWork.setRightFrameCols(rightCols);
            fs.cols = "*,0";
        }
    }

    navWork.setRightFrameShown(bShow);
   	var headerPlus = getHeaderPlusFrame();
	if (navWork.rightFrameShown)
		updateRightFrame(-1);
}

function updateRightFrame(id)
{
	var navWork = getNavWorkController();
	if(navWork == null)
		return;

    var frame = findFrame('rightFrame');
    if (frame == null)
    return;

    var originalID = navWork.rightFrameCurrentId;
    if (id == undefined) {
	    navWork.setRightFrameRequestedId(0);
    } else if (id != -1) {
	    navWork.setRightFrameRequestedId(id);
    }

    if (!navWork.rightFrameShown)
    	return;

    if (navWork.rightFrameCurrentId != navWork.rightFrameRequestedId || navWork.rightFrameUrlChanged) {
	    navWork.setRightFrameCurrentId(navWork.rightFrameRequestedId);
	    navWork.setRightFrameUrlChanged(false);

        var url = navWork.rightFrameURL;
        var objIdIndex = url.indexOf( '&objIds=' );
        if( objIdIndex > 0 )                            // get rid of last obj id
            url = url.substring( 0, objIdIndex );
		// Except in Internet Explorer, Encyclopedia's calling context is at a deeper level relative to infoview
		// when invoked from the data frame, check the URL (using a case insensitive regular expression check)
        // and the id to determine the source of the update
        // if the update is coming from a selection in the InfoView listing (id is valid) and the browser is NOT IE
        // add the extra '../' to the path
		var f_location = frame.location.href;		
		var pattern = /bouitoolkit/i;		 		
		if( pattern.exec(f_location) != null ){	
		  var rfURL = replaceRightFrameID(f_location, originalID, navWork.rightFrameCurrentId);		  		
		  frame.location = rfURL;
		}else{		
		  frame.location = url + "&objIds=" + navWork.rightFrameCurrentId;
		}
    }
}

function replaceRightFrameID (theURL, originalID, newID)
{
	var theNewURL = theURL.replace("objIds=" + originalID, "objIds=" + newID);
	return theNewURL;
}

function afOpen(url)
{
	// this is used by af when using report list inside AF
    url = url + "&afObjListFlag=true";
    // set the last url for the back button
    var currentLocation = this.location.href;
    if( currentLocation != null )
    {
        parent.savedLocation = this.location.href;
        if( parent.frames != null &&
            parent.frames.length >= 1 &&
            parent.frames[0].toggleBackButton != null)
            parent.frames[0].toggleBackButton(true);
    }

    if (parent.openFromListCB1InfoView) {
        //this happens only when the page doesn't have a frame and dashboard is viewed (saved already).
        //i.e., specific category is open and one is viewing a dashboard.
        parent.openFromListCB1InfoView(url, this);
    }
    if (parent.parent.openFromListCB1InfoView) {
        //this happens only when the page doesn't have a frame and creating a dashboard.
        //i.e., specific category is open and one is creating a dashboard.
        parent.parent.openFromListCB1InfoView(url, this);
    }
    if (parent.parent.parent.openFromListCB1InfoView) {
        //this happens only when the page is saved to dashboard already.
        //i.e., when modifying an existing dashboard or viewing a dashboard.
        parent.parent.parent.openFromListCB1InfoView(url, this);
    } else if (parent.parent.parent.parent.openFromListCB1InfoView) {
        //this happens only when a user drag a page to a dashboard.
        parent.parent.parent.parent.openFromListCB1InfoView(url, this);
    }
}

function opendocumentCallback(id) {
    showDiscussions(id);
    updateRightFrame(id);
}

function ignoreErrors() {
	return true;
}

function isWindowClosing()
{
	// Determine if window is closing according to browser type.
	// NOTE: Currently no official way in javascript to determine if window is closing.
	if (BROWSER_INTERNET_EXPLORER) {
		if (window.screenLeft == IE_CLOSE_SCREEN_LEFT) return true;
		if (window.screenLeft == IE_CLOSE_MIN_SCREEN_LEFT) return true;
	}
	else if (BROWSER_GECKO || BROWSER_SAFARI)
	{
		// TODO: Figure out how to check for Netscape and/or Safari.
	}

	return false;
}

function setPanelStateForRestoredWorkspace (panelId, isShown)
{
	var wsHeaderFrame = findFrame('workspaceHeaderFrame');
	if (wsHeaderFrame && wsHeaderFrame.setPanelStateForRestoredWorkspaceImpl)
			wsHeaderFrame.setPanelStateForRestoredWorkspaceImpl (panelId, isShown);
}

// Encodes delimiters "=" and ","
// Identical to codebehind function
function encodeDelimiters (s)
{
	es = s.replace(/\|/g,"*|");
	es = es.replace(/\&/g,"*||");
	es = es.replace(/\=/g,"*|||");
	es = es.replace(/\,/g,"*||||");
	return es;
}

// Decodes strings previously encoded with encodeDelimiters()
// Identical to codebehind function
function decodeDelimiters (es)
{
	s = es.replace(/\*\|\|\|\|/g,",");
	s = s.replace(/\*\|\|\|/g,"=");
	s = s.replace(/\*\|\|/g,"&");
	s = s.replace(/\*\|/g,"|");
	return s;
}

function moveListBoxItems (fromListBox, toListBox, moveAll)
{
	// Iterate forward thru "fromListBox", copying to "toListBox"
	for (count = 0; count < fromListBox.options.length; ++count)
	{
		var currentItem = fromListBox.options[count];
		if (moveAll || currentItem.selected)
		{
			var option = new Option (currentItem.text, currentItem.value, false, false);
			toListBox.options[toListBox.options.length] = option;
		}
	}

	// Iterate backwards thru "fromListBox", removing copied items
	for (count = fromListBox.options.length -1;  count >= 0; --count)
	{
		if (moveAll || fromListBox.options[count].selected)
			fromListBox.options[count] = null;
	}
}

function enableButton (buttonId, enable)
{
	if (enable)
		document.getElementById(buttonId).className = "clsButton";
	else
		document.getElementById(buttonId).className = "clsButtonDisabled";
}

function onClick (buttonId, arg)
{
	if (document.getElementById(buttonId).className == "clsButtonDisabled")
		return;

	var myfunc=this["onClick" + buttonId];
	if (arg != undefined)
		myfunc(arg);
	else
		myfunc();
}

function getClientServerPort( currContext ) {
    var httpserver = document.location.hostname;
    var httpport = document.location.port;
	var httpprotocol = document.location.protocol;
	httpprotocol = httpprotocol.substring(0, httpprotocol.length-1);	// ADAPT00522502		//remove the colon after the protocol name ("http:" => "http")
	if (httpport == "" && httpprotocol == "http") httpport = "80";				//80 is the default HTTP port
	else if (httpport == "" && httpprotocol == "https") httpport = "443";			//443 is the default HTTPS port (HTTP with SSL)

    var webapproot = new String(document.location.pathname);
	webapproot = webapproot.substring(0, webapproot.toLowerCase().lastIndexOf(currContext));
    return httpprotocol +'://'+httpserver+ ':'+ httpport + webapproot;
}
