//navigator_helper.js
	function makeSimpleSiteBuilderCall(sSiteKey, sPageKey)
	{
		var sCry;
		var oForm = document.forms.ChannelNet;
		sCry = '<cnenvironment>';
		sCry += '<systemvars>';
		sCry += '<var name="pageid">refApp.sitebuilder.view</var>';
		//sCry += '<var name="debug">3</var>';
		sCry += '</systemvars>';
		sCry += cnresponseSiteBuilder(sSiteKey, sPageKey);
		sCry += '</cnenvironment>';
		oForm.xml.value = sCry;
		oForm.submit();
		document.body.style.cursor = 'wait';
	}

	function makeSBAssessSetCategory(sSiteKey, sPageKey, sCategory,nCurrentQuestionId){
		var sCry;
		var oForm = document.forms.ChannelNet;
		sCry = '<cnenvironment>';
		sCry += '<systemvars>';
		sCry += '<var name="pageid">refApp.sitebuilder.view</var>';
		//sCry += '<var name="debug">3</var>';
		sCry += '</systemvars>';
		sCry += cnresponseAssessSetCategory('assess',sCategory, nCurrentQuestionId);
		sCry += cnresponseSiteBuilder(sSiteKey, sPageKey);
		sCry += '</cnenvironment>';
		oForm.xml.value = sCry;
		oForm.submit();
		document.body.style.cursor = 'wait';
	}
	
	function makeSBAssessQCatalog(sSiteKey, sPageKey,nCategoryId, in_objAssessStateContainer, arrState){
		var sCry;
		var oForm = document.forms.ChannelNet;
		sCry = '<cnenvironment>';
		sCry += '<systemvars>';
		sCry += '<var name="pageid">refApp.sitebuilder.view</var>';
		//sCry += '<var name="debug">3</var>';
		sCry += '</systemvars>';
		sCry += cnresponseAssessCatalog('assess', '', '',nCategoryId, in_objAssessStateContainer, arrState);
		sCry += cnresponseSiteBuilder(sSiteKey, sPageKey);
		sCry += '</cnenvironment>';
		oForm.xml.value = sCry;
		oForm.submit();
		document.body.style.cursor = 'wait';
	}

  function makeSBAssessGoBackCatalog(sSiteKey, sPageKey,nCategoryId, in_objAssessStateContainer, arrState){
		if(bExistingQuestions){
      var sCry;
  		var oForm = document.forms.ChannelNet;
  		sCry = '<cnenvironment>';
  		sCry += '<systemvars>';
  		sCry += '<var name="pageid">refApp.sitebuilder.view</var>';
  		//sCry += '<var name="debug">3</var>';
  		sCry += '</systemvars>';
  		sCry += cnresponseGoBackAssessCatalog('assess', '', '',nCategoryId, in_objAssessStateContainer, arrState);
  		sCry += cnresponseSiteBuilder(sSiteKey, sPageKey);
  		sCry += '</cnenvironment>';
  		oForm.xml.value = sCry;
  		oForm.submit();
  		document.body.style.cursor = 'wait';
  	} else {
      makeSBAssessSetCategory(sSiteKey, sPageKey, nCategoryId,0);
    }
	}

	function cnresponseSiteBuilder(sSiteKey,sPageKey)
	{
		var sReturn;
		
		sReturn = '<cnrequest label="sitebuilder" metricslog="false">';
  		sReturn += '<businessobject>sitebuilder</businessobject><action>view</action>';
  		sReturn += '<parameters>';
  		sReturn += '<parameter name="sitekey">' + sSiteKey +'</parameter>';
  		sReturn += '<parameter name="pagekey">' + sPageKey +'</parameter>';
		sReturn += '</parameters><language>145042</language></cnrequest>';
		return sReturn;
	}


	function setLevelProperties(oMenu, iLevel, sAlign, iWidth,iHeight, iBorderX,iBorderY, iOffSetX,iOffSetY, iRows, iArrow, iArrowHeight, iArrowWidth   )
	{
		if(oMenu.level.length<=parseInt(iLevel))
			 makeLevel(oMenu,iLevel); //Add this for each new level			
		var oLevel = oMenu.level[iLevel];
	
		if(sAlign != null)oLevel.align = sAlign;
		if(iWidth != null)oLevel.width = iWidth;
		if(iHeight != null)oLevel.height = iHeight;
		if(iBorderX != null)oLevel.borderX = iBorderX;
		if(iBorderY != null)oLevel.borderY = iBorderY;
		if(iOffSetX != null)oLevel.offsetX = iOffSetX;
		if(iOffSetY != null)oLevel.offsetY = iOffSetY;
		if(iRows != null)oLevel.rows = iRows;
		if(iArrow != null)oLevel.arrow = iArrow;
		if(iArrowWidth != null)oLevel.arrowWidth = ArrowWidth;
		if(iArrowHeight != null)oLevel.arrowHeight = iArrowHeight;
	}

	function setMenuProperties(oMenu, iBetween, iFromLeft,iFromTop, iRows, sPlacement, iOffRoot, iOnRoot, iResizeCheck, iWait,sFillImage,iZIndex)
	{/**/
		oMenu.pxBetween = iBetween;
		oMenu.fromLeft = iFromLeft;
		oMenu.fromTop = iFromTop;
		oMenu.rows = iRows;
		oMenu.menuPlacement = sPlacement;			
		
		oMenu.offlineRoot = iOffRoot;
		oMenu.onlineRoot = iOnRoot;
		oMenu.resizeCheck = iResizeCheck;
		oMenu.wait = iWait;
		oMenu.fillImg = sFillImage;
		oMenu.zIndex = iZIndex;
	}
	
	function setMenuBarProperties(oMenu, iUse, sWidth, sHeight, sClass, sBarX, sBarY, iBorderX, iBorderY, sBorderClass )
	{/**/
		oMenu.useBar = iUse;
		oMenu.barWidth = sWidth;
		oMenu.barHeight = sHeight;
		oMenu.barClass = sClass;
		oMenu.barX = sBarX;
		oMenu.barY = sBarY;
		oMenu.barBorderX = iBorderX;
		oMenu.barBorderY = iBorderY;
		oMenu.barBorderClass = sBorderClass;
	}


	function makeLevel(oMenu, iLevel)
	{
		oMenu.level[iLevel] = new cm_makeLevel();
		var oLevel = oMenu.level[iLevel];
		oLevel.align = "center";
		oLevel.width = 125;
		oLevel.height = 28;
		oLevel.borderX = 0;
		oLevel.borderY = 0;
		oLevel.offsetX = 0;   
		oLevel.offsetY = 0;
		oLevel.rows = 0;
		oLevel.arrow = 0;
		oLevel.arrowWidth = 0;
		oLevel.arrowHeight = 0;
		oLevel.regClass = "v_clLevel"+iLevel;
		oLevel.overClass = "v_clLevel"+iLevel+"over";
		oLevel.borderClass = "v_clLevel"+iLevel+"border";
	}

	// Calculates width of the widest element for each menu and set all its elements to that width
	// Designed to called after all menus are populated
	function adjustMenuWidthsSAVE(oMenu)
	{
		var s, l, nThisLevelDx, nThisLevelMax, nTopmostEntries = oCMenu.l[0].m.length;

		for ( var i=0; i<nTopmostEntries; i++ ) {
			nThisLevelMax = oCMenu.m[oCMenu.l[0].m[i]].subs.length;
			for ( nThisLevelDx=0; nThisLevelDx<nThisLevelMax; nThisLevelDx++ )
			{
				s = oCMenu.m[ oCMenu.m[oCMenu.l[0].m[i]].subs[nThisLevelDx] ].txt;
				oMaxLengths.addMaxLength(getStringPixelWidth(s), oCMenu.m[oCMenu.l[0].m[i]]);	
			}
			l = oMaxLengths.getMaxLength(oCMenu.m[oCMenu.l[0].m[i]]);
			for ( nThisLevelDx=0; nThisLevelDx<nThisLevelMax; nThisLevelDx++ )
			{
				oCMenu.m[ oCMenu.m[oCMenu.l[0].m[i]].subs[nThisLevelDx] ].w = l;
			}
		}
	}
	function adjustMenuWidths(oMenu)
	{
		var s, l, nThisLevelDx, nThisLevelMax, nTopmostEntries = oCMenu.l[0].m.length;

		for ( var i=0; i<nTopmostEntries; i++ ) {
			adjustInnerMWidths(oCMenu.m[oCMenu.l[0].m[i]]);
		}
	}

	function adjustInnerMWidths (oInnerM)
	{
		var s, m, nThisLevelMax = oInnerM.subs.length;
		for ( var nThisLevelDx=0; nThisLevelDx<nThisLevelMax; nThisLevelDx++ )
		{
			m = oCMenu.m[ oInnerM.subs[nThisLevelDx] ]; 
			s = m.txt;
			oMaxLengths.addMaxLength(getStringPixelWidth(s), oInnerM);
			if (m.subs.length != 0) {
				adjustInnerMWidths(m); 
			}
		}
		l = oMaxLengths.getMaxLength(oInnerM);
		for ( nThisLevelDx=0; nThisLevelDx<nThisLevelMax; nThisLevelDx++ )
		{
			oCMenu.m[ oInnerM.subs[nThisLevelDx] ].w = l;
		}
	}
		
	// Returns the width that the string argument occupies when rendered
	// Assumes existence of a hidden span to hold the text whose width we want
	function getStringPixelWidth(sTxt)
	{
		var oTestEl, nRet = sTxt.length * 10;
		
		oTestEl = document.getElementById('TestEl');
		if (oTestEl != null) {
			oTestEl.innerHTML = "    " + sTxt;
			nRet = oTestEl.offsetWidth;
		} 
		return nRet;
	}

	// Sets the widths of Level 0 menu elements width to match the named TD's that actually display
	// Assumes existentce of TDs with ids like 'TD_2_' for the top level
	// notes: designed for use with horizontal menubars, does not address placing menu adjacent to cells
	function matchMenu0ToCellWidths(oMenu)
	{
		var oTD, nTopmostEntries = oCMenu.l[0].m.length;
		for (var i=0; i<nTopmostEntries; i++)
		{
			oTD = document.getElementById('TD_'+i+'_');
			if ( oTD != null ) {
				oMenu.m[oMenu.l[0].m[i]].w = oTD.offsetWidth;
				oMenu.m[oMenu.l[0].m[i]].txt = 'x';
			}
		}
		;
	}
	function adjustSubMenus(oChildNames)
	{
        for (var ii=0; ii<oChildNames.length; ii++)
        {
            if (oCMenu.m[oChildNames[ii]].subs.length!=0)
            {
                oCMenu.m[oChildNames[ii]].subx = oCMenu.m[oChildNames[ii]].x + oCMenu.m[oChildNames[ii]].w;
                adjustSubMenus(oCMenu.m[oChildNames[ii]].subs);
            }
        }
	    
	}
	function recalcMenuLoc(oMenu)
	{
		var oTD, nTopmostEntries = oCMenu.l[0].m.length;
		var oT1 = document.getElementById("Table1");
		var nOffsetLeft = oT1.offsetLeft + 247 - 24;
		var nLevels = oMenu.l.length, arrMnuNames, oMnu, oParentMnu;
		
		for (var i=0; i<nTopmostEntries; i++)
		{
			oTD = document.getElementById('TD_'+i+'_');
			if ( oTD != null ) { 
				oMenu.m[oMenu.l[0].m[i]].subx = oTD.offsetLeft + nOffsetLeft;
			}
		}
		
		for (    i=0; i<nTopmostEntries; i++)
        {
            var oChildNames = oMenu.m[oMenu.l[0].m[i]].subs;
            adjustSubMenus(oChildNames);
        }		
 
	}
