function postComponentPageEvent(strFormId, strComponent, strTarget, strEventArgName, strEventArgValue)
{
var arrArgs = getArgs("postComponentPageEvent", 3);
postComponentNavigationEvent(strFormId, strComponent, "onComponentPage", strTarget, arrArgs);
}
function postComponentJumpEvent(strFormId, strComponent, strTarget, strEventArgName, strEventArgValue)
{
var arrArgs = getArgs("postComponentJumpEvent", 3);
postComponentNavigationEvent(strFormId, strComponent, "onComponentJump", strTarget, arrArgs);
}
function postComponentNestEvent(strFormId, strComponent, strTarget, strEventArgName, strEventArgValue)
{
if ((strEventArgName != null) && (strEventArgName != "") && (typeof strEventArgName != "undefined"))
{
var arrArgs = getArgs("postComponentNestEvent", 3);
postComponentNavigationEvent(strFormId, strComponent, "onComponentNested", strTarget, arrArgs);
}
else
{
var emptyArray = new Array();
postComponentNavigationEvent(strFormId, strComponent, "onComponentNested", strTarget, emptyArray);
}
}
function postComponentNavigationEvent(strFormId, strComponent, strEvent, strTarget, arrArgs)
{
var strCall = "";
var strFramePath = getAbsoluteFramePath(strTarget);
if (strFramePath != null)
{
// Walk down to leaf and see if it is a form but first check frame's state,
if ( isValidWindow(strFramePath) == true )
{
strFramePath = walkDownFrameSet(strFramePath);
var targetFrame = eval(strFramePath);
if ( isDispatchableWindow(targetFrame) )
{
strCall = strFramePath + "." + generateSafeCallString(strFormId, arrArgs);
}
else
{
var strComponentUrl = generateComponentUrl(getVirtualDir(), strComponent, arrArgs);
strComponentUrl = addBrowserIdToURL(strComponentUrl);
strCall = strFramePath + ".location.href = \"" + strComponentUrl + "\"";
}
}
else
{
if (Trace_COMPONENTNAVIGATION) componentnavigation_trace("Delaying postComponentNavigationEvent for " + strTarget + " by 100ms");
var delayed = _postComponentNavigationEventClosure(strFormId, strComponent, strEvent, strTarget, arrArgs);
return setTimeout(delayed, 100);
}
}
else
{
// Frame doesn't exist or target is current page
if ((strTarget == null) || (typeof strTarget == "undefined"))
{
strCall = generateSafeCallString(strFormId, arrArgs);
}
else
{
var strVirtualRoot = getVirtualDir();
if(typeof g_virtualRoot != "undefined")
{
strVirtualRoot =  g_virtualRoot.substring(1);
}
strCall = "window.open(\"" + generateComponentUrl(strVirtualRoot, strComponent, arrArgs) + "\", strTarget)";
}
}
if (Trace_COMPONENTNAVIGATION)
{
componentnavigation_trace("About to Eval Component Navigation Call : " + strCall);
componentnavigation_trace(" - strFormId = " + strFormId);
componentnavigation_trace(" - strComponent = " + strComponent);
componentnavigation_trace(" - strEvent = " + strEvent);
componentnavigation_trace(" - strTarget = " + strTarget);
}
eval(strCall);
}
function _postComponentNavigationEventClosure(strFormId, strComponent, strEvent, strTarget, arrArgs)
{
return function()
{
window.postComponentNavigationEvent(strFormId, strComponent, strEvent, strTarget, arrArgs);
};
}
function generateComponentUrl(strVirtualRoot, strComponent, arrArgs)
{
var strComponentUrl = "/" + strVirtualRoot + "/component/" + strComponent;
var strPage = retrievePage(arrArgs);
if (strPage != null)
{
strComponentUrl += "/" + strPage;
arrArgs = removePageFromArray(arrArgs);
}
if (arrArgs.length > 0)
{
strComponentUrl += "?" + convertArgsToUrlArgString(arrArgs);
}
return strComponentUrl;
}
function generateSafeCallString(strFormId, arrArgs)
{
var strSafeCall = "";
if (strFormId)
{
strSafeCall = "safeCall('postServerEvent', '" + strFormId + "', null, null, strEvent, '__dmfTargetComponent', strComponent";
}
else
{
// strFormId == null, strFormId == "", typeof strFormId == "undefined", strFormId == 0, strFormId == false all fall here
strSafeCall = "safeCall('postServerEvent', null, null, null, strEvent, '__dmfTargetComponent', strComponent";
}
if (arrArgs.length > 0)
{
strSafeCall += ", " + convertArgsToFunctionString(arrArgs);
}
strSafeCall += ")";
return strSafeCall;
}
function retrievePage(arrArgs)
{
var strResult = null;
if (arrArgs.length > 0)
{
for (var iArg = 0; iArg < arrArgs.length; iArg+=2)
{
if (arrArgs[iArg] == "__dmfPage")
{
strResult = arrArgs[iArg + 1];
break;
}
}
}
return strResult;
}
function removePageFromArray(arrArgs)
{
var arrResult = new Array();
var nArrOffset = 0;
if (arrArgs.length > 0)
{
for (var iArg = 0; iArg < arrArgs.length; iArg+=2)
{
if (arrArgs[iArg] != "__dmfPage")
{
arrResult[nArrOffset] = arrArgs[iArg];
arrResult[nArrOffset + 1] = arrArgs[iArg + 1];
}
}
}
return arrResult;
}
function componentnavigation_trace(strMsg)
{
Trace_println("componentnavigation.js: " + strMsg);
}

