// ***** FrameworkSupport API *******
var frameworkSupport = {
	isAnonymous : false,
	frameworkPhase : "none"
};

frameworkSupport.init = function(obj)
{
	frameworkSupport.isAnonymous 		= obj.anonymous;
	frameworkSupport.frameworkPhase		= obj.phase;
	frameworkSupport.portalURL			= obj.portalURL;
	frameworkSupport.quickLink			= obj.quickLink;
}

frameworkSupport.init2 = function(obj)
{
	frameworkSupport.contentAreaURL 	= obj.contentAreaURL;
	frameworkSupport.innerPage			= obj.innerPage;	
	frameworkSupport.innerPageFrameURL	= obj.innerPageFrameURL;
	frameworkSupport.tlnComp			= obj.tlnComp;
	frameworkSupport.serverPath			= obj.serverPath;
	frameworkSupport.portalURL			= obj.portalURL;
	frameworkSupport.ObjBasedNavigationURL	= obj.ObjBasedNavigationURL;
}

frameworkSupport.onPersonalizePortalLoad = function()
{
	try
	{
		window.frames[document.getElementById("isolatedWorkArea").name].document.body.tabIndex = -1;
	}
	catch(e)
	{
	}
	setTimeout("EPCM.raiseEvent(\"urn:com.sap.portal.navigation\" , \"DtnFocus\" , null)",500);	
	setTimeout("EPCM.raiseEvent(\"urn:com.sap.portal.navigation\" , \"DtnFocus\" , null)",1000);	
}

//*** Refresh portal funcitons ***

frameworkSupport.refreshPortal = function()
{
	try
	{
		if(! frameworkSupport.isAnonymous)
		{
			// html form is created to pass the context and the navigation target as POST parameters
			var ctxt;
			var str = EPCM._private.uipPortalPath;
			var navTarget = EPCM.getSAPTop().gHistoryFrameworkObj.GetActiveTrackingEntryValue().getUrl();
			
			var frm = document.createElement("<FORM METHOD=POST ACTION=\""+str+"\"> </FORM>");
			
			var target = document.createElement("<INPUT TYPE=\"hidden\" NAME=\"NavigationTarget\" value=\""+navTarget+"\">");
			frm.appendChild(target);
			
			var context = EPCM.getSAPTop().gHistoryFrameworkObj.GetActiveTrackingEntryValue().context;
		 	if (context != null && context.length > 0){
			 		ctxt = document.createElement("<INPUT TYPE=\"hidden\" NAME=\"NavigationContext\" value=\""+context+"\">");
			 		frm.appendChild(ctxt);
			}
			
			document.body.insertBefore(frm);
			frm.submit();
						
		}
	}
	catch(e){}
}

frameworkSupport.refreshContentArea = function()
{
    EPCM.raiseEvent('urn:com.sapportals:navigation','historyNavigate', 0);
}

frameworkSupport.refreshPersonalizePortal = function()
{
	EPCM.raiseEvent('urn:com.sapportals:navigation','historyNavigate', 0);
 	if (typeof window.opener.frameworkSupport != "undefined")
 	{
 		window.opener.frameworkSupport.refreshPortal();
 	}
 	else
 	{
 		window.opener.location.reload();
 	}
}


EPCM.subscribeEvent("urn:com.sapportals:navigation", "RefreshPortal", frameworkSupport.refreshPortal);
EPCM.subscribeEvent("urn:com.sapportals:navigation", "RefreshPersonalizePortal", frameworkSupport.refreshPersonalizePortal);
EPCM.subscribeEvent("urn:com.sapportals:navigation", "RefreshContentArea", frameworkSupport.refreshContentArea);





//Work area functions
var nodeid;
var fullTarget;
var relativeFlag;
var postBody = null;



function onNavigate(eventObj)
{
  EPCM.getSAPTop().postBody = null;
  relativeFlag = "false";
  postBody = eventObj.dataObject.postBody;
  if  ((eventObj.dataObject.mode == 0) || typeof (eventObj.dataObject.Type) ==  "string")
  {
    var params="";
    target = eventObj.dataObject.target;
    
    qm = target.indexOf("?");
    if (qm == -1)
    {
      nodeid = target;
    }
    else
    {
      	nodeid = target.substring(0,qm);
      	params = target.substr(qm+1);
      
    }
    EPCM.raiseEvent("urn:com.sapportals:navigation", "UpdateTLN", nodeid);
    navigateShowInPlace(params , eventObj.dataObject.postBody);
    try{
      EPCM.getSAPTop().navPanelStatus = "exp";
    }
    catch(e){
    }
  }
	else
	{
	    var contentAreaURL = frameworkSupport.contentAreaURL;
	    var portalUrl =      frameworkSupport.portalURL;
	    var navContext = eventObj.dataObject.context;
	    var windowId = eventObj.dataObject.windowId;
	    fullTarget = eventObj.dataObject.target;
	    
	    if ((fullTarget.indexOf("/irj") != 0) && (fullTarget.indexOf("http") != 0))
		{
			target = eventObj.dataObject.target;
			qm = target.indexOf("?");
			if (qm == -1)
			{
				nodeid = target;
    			params = "NavigationTarget=" + encodeURIComponent(nodeid); 
			}
			else
			{
				nodeid = target.substring(0,qm);
				params = "NavigationTarget=" + encodeURIComponent(nodeid) + "&" + target.substr(qm+1);
			}
			if (navContext != undefined && navContext != null && navContext !='')
				params += "&NavigationContext=" + encodeURIComponent(navContext);
			params=params+"&CurrentWindowId="+window.name;
			if (windowId != undefined && windowId != null)
				params += "&windowId=" + escape(windowId);
			if(eventObj.dataObject.mode != undefined && eventObj.dataObject.mode != null)
			{
				 params += "&NavMode=" + eventObj.dataObject.mode;
			}
			if(eventObj.dataObject.targetTitle != undefined && eventObj.dataObject.targetTitle != null && eventObj.dataObject.targetTitle != "")
		        {
		  		params += "&TarTitle=" + eventObj.dataObject.targetTitle;
		        }
			if(eventObj.dataObject.mode == 1)
				fullTarget = contentAreaURL + "?" + params;
			else
				fullTarget = portalUrl + "?" + params;
		}
		
		if (eventObj.dataObject.winfeatures != "")
		{
			winfeatures = eventObj.dataObject.winfeatures + ",";
		}
		else
		{
			winfeatures = "";
		}
    	navigationToExternalWin(winfeatures, eventObj);
	}
}

// Relative Navigation functions
// Implementating the relative navigation. resolved in server, therefore no TLN update here.
function onRelativeNavigate(eventObj)
{
	var params="";
	relativeFlag = "true";

	EPCM.getSAPTop().postBody = null;
	postBody = eventObj.dataObject.postBody;
		
	nodeid = eventObj.dataObject.basenodename;
    if(eventObj.dataObject.basenodename != undefined && eventObj.dataObject.basenodename != null)
    {
    	// if IE, the RelativeNavBase will be sent in post by submitting form, not added to regular params
    }
	else
    {
       	// if no relative base supplied, relative nav is impossible
       	return false;
    }
       
    if(eventObj.dataObject.levelsup != undefined && eventObj.dataObject.levelsup != null)
    {
    	params += "&RelativeLevelsup=" + escape(eventObj.dataObject.levelsup)
    }
        
    if(eventObj.dataObject.pathnameslist != undefined && eventObj.dataObject.pathnameslist != null)
    {
    	params += "&RelativePathlist=" + escape(eventObj.dataObject.pathnameslist);
    }

    if(eventObj.dataObject.history != undefined && eventObj.dataObject.history != null && eventObj.dataObject.history != "")
    {
  		params += "&HistoryMode=" + escape(eventObj.dataObject.history)
 		
    }
    
    if(eventObj.dataObject.context != undefined && eventObj.dataObject.context != null && eventObj.dataObject.context != "")
    {
    	params += "&NavigationContext=" + escape(eventObj.dataObject.context);
    }
    
    if(eventObj.dataObject.targetTitle != undefined && eventObj.dataObject.targetTitle != null && eventObj.dataObject.targetTitle != "")
    {
  		params += "&TarTitle=" + escape(eventObj.dataObject.targetTitle)
    }
    params=params+"&CurrentWindowId="+window.name;

    if(eventObj.dataObject.windowId != undefined && eventObj.dataObject.windowId != null)
    {
  		params += "&windowId=" + escape(eventObj.dataObject.windowId)
    }
    
    if(eventObj.dataObject.addParams != undefined && eventObj.dataObject.addParams != null)
    {
         params += "&" + eventObj.dataObject.addParams;
    }
    //Adding the mode as part of the request parameters!
    if(eventObj.dataObject.mode != undefined && eventObj.dataObject.mode != null)
	{
		 params += "&NavMode=" + eventObj.dataObject.mode;
	}	    
		
	if (eventObj.dataObject.winfeatures != "")
	{
		winfeatures = eventObj.dataObject.winfeatures + ",";
	}
	else
	{
		winfeatures = "";
	}		

	if (params.charAt(0) == "&")
		params = params.substr(1);
		
	var contentAreaURL = frameworkSupport.contentAreaURL;
	var portalUrl =      frameworkSupport.portalURL;
	
    
    if(typeof(eventObj.dataObject.mode) == "undefined" || eventObj.dataObject.mode <= 1)
    	fullTarget = contentAreaURL + "?" + params;
    else
    	fullTarget = portalUrl + "?" + params;
	
    if (eventObj.dataObject.mode == 0) {
	   	navigateShowInPlace(params, postBody);
	   	relativeFlag = "false";
    } else {
	    navigationToExternalWin(winfeatures, eventObj);
	}
    
}




function navigateShowInPlace(requestParams , postBody)
{
	
       frm = document.getElementById("frmChangeContent");
       
       
       if(frameworkSupport.frameworkPhase == "PERSONPORTAL")
       {
       		//remove the windowId parameter for new window
		
			requestParams = requestParams.replace(/\?windowId=[^&\n]*&/ , "?");//windowId is the first parameter but not last.
			requestParams = requestParams.replace(/(\?windowId=[^&\n]*)|(&?windowId=[^&\n]*)/ , "");//window is first and last, 
																					  // last or in the middle 
       } 
       var innerPage = frameworkSupport.innerPage;
       var frameURL  = frameworkSupport.innerPageFrameURL;
       var frameWinObj = pageSupport.getIvuFrameObj(innerPage);
       if(frameworkSupport.frameworkPhase == "framework" && frameWinObj != null)
       {
			frm.target = frameWinObj.name;
       		frm.action = frameURL + "?" + requestParams;
       }
       else if(frameworkSupport.quickLink != undefined)
       {
       		frm.target + "_self";
       		var locationStr = frameworkSupport.portalURL;
       		frm.action = locationStr + "?standAlone=true&" + requestParams;
       }
       else
       {
       		frm.target + "_self";
       		var locationStr  = document.location.href;
      		var index = locationStr.indexOf("?");
      		if (index > 0)
        		locationStr = locationStr.substr(0, index);
       		frm.action = locationStr + "?standAlone=true&" + requestParams;
       }
       
       frm.NavigationTarget.value = nodeid;
       if (relativeFlag == "true")
       	   frm.RelativeNavBase.value = nodeid;
       else
       	   frm.RelativeNavBase.value = "";	

	   var oldHTML = frm.innerHTML;
       if(postBody)
       {
       		
       		var innerHTML = frm.innerHTML;
       		var str = "<input type=hidden name='UsePost' id='UsePost' value='true'></input>\n";
			
			innerHTML += str;
       		for(var i = 0 ; i < postBody.length ; i++)
       		{
       			var paramName = postBody[i].name;
       			var paramValue = postBody[i].value;
       			
       			var str = "<input type=hidden name='"+paramName+"' id='"+paramName+"' value='"+paramValue+"'></input>\n";
       			innerHTML += str;
       		}
       		frm.innerHTML = innerHTML;
       		EPCM.getSAPTop().postBody = postBody;
       }

	var sessionTermination = "";
	try {
	   sessionTermination = getSessionTerminationKeys();
	   if(sessionTermination != "")
	   {
		   frm.innerHTML = frm.innerHTML + sessionTermination;
	   }
	}
	catch(e) {}

       frm.submit();
       
	   if(postBody || sessionTermination!= "")
	   {
	   		frm.innerHTML = oldHTML;
	   }    
   
}

//Set the focus back in the new window
var newWin = null;

function navigationToExternalWin(windowFeatures, eventObj)
{
  winname = eventObj.dataObject.winname;
  if (winname == "DefaultExternal" || winname == "") { 
	var curDate = new Date();
	winname = winname+curDate.getTime();
  }
  // since the window name must begin with a letter ([A-Za-z]) 
  // and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), and colons (":") we encode it
  // it will not change leagal names
  winname = encodeURIComponent(winname).replace(/%/g,"");  
  winname = winname.replace(".","");
  var path = frameworkSupport.serverPath+frameworkSupport.tlnComp + "/html/child.html";
  newwin = window.open(path, winname, windowFeatures)
  //Set the focus back in the new window
  window.setTimeout("newwin.focus()",1500);
    
}

// This function is called from the child.html file.
function fillFrmDetails(frm) 
{
	frm.NavigationTarget.value = nodeid;
	if (relativeFlag == "true")
	{
		frm.RelativeNavBase.value = nodeid;
		fullTarget += "&RelativeNavBase=" + nodeid;
	}
	
	
	//remove the windowId parameter for new window
		
	fullTarget = fullTarget.replace(/\?windowId=[^&\n]*&/ , "?");//windowId is the first parameter but not last.
	fullTarget = fullTarget.replace(/(\?windowId=[^&\n]*)|(&?windowId=[^&\n]*)/ , "");//window is first and last, 
																					  // last or in the middle 
	//fullTarget = fullTarget.replace(/(\?|&)windowId=[^&\n]*$/ , "");
	//fullTarget = fullTarget.replace(/(\?|&)windowId=[^&\n]*&/ , RegExp.$1);
	
	frm.action = fullTarget;
	if(postBody)
   {
   		var innerHTML = frm.innerHTML;
   		var str = "<input type=hidden name='UsePost' id='UsePost' value='true'></input>\n";
		
		innerHTML += str;
   		for(var i = 0 ; i < postBody.length ; i++)
   		{
   			var paramName = postBody[i].name;
   			var paramValue = postBody[i].value;
   			
   			var str = "<input type=hidden name='"+paramName+"' id='"+paramName+"' value='"+paramValue+"'></input>\n";
   			innerHTML += str;
   		}
   		frm.innerHTML = innerHTML;
   		EPCM.getSAPTop().postBody = postBody;
   }
   relativeFlag = "false"; 
}


EPCM.subscribeEvent("urn:com.sapportals:navigation", "Navigate", onNavigate);
EPCM.subscribeEvent("urn:com.sapportals:navigation", "RelativeNavigate", onRelativeNavigate);


// Object Based Navigation functions
function onObjBasedNavigate(eventObj)
{
	var obnForm = document.getElementById("obnNavForm");
	obnForm.operation.value = "";
	obnForm.action = frameworkSupport.ObjBasedNavigationURL;
	obnForm.systemAlias.value = eventObj.dataObject.systemAlias;
	obnForm.businessObjName.value = eventObj.dataObject.businessObjName;
	obnForm.objValue.value = eventObj.dataObject.objValue;

	if (typeof(eventObj.dataObject.operation) != "undefined" &&  eventObj.dataObject.operation != null)
	{
  		obnForm.operation.value = eventObj.dataObject.operation;
  	}
  	
  	if (typeof(eventObj.dataObject.resolvingMode) != "undefined" &&  eventObj.dataObject.resolvingMode != null)
	{
  		obnForm.resolvingMode.value = eventObj.dataObject.resolvingMode;
  	} 
  	else
  	{
	  	obnForm.resolvingMode.value = "Default";
	  	
	  	if (typeof(eventObj.dataObject.postBody) != "undefined" &&
	  		eventObj.dataObject.postBody != null &&
	  		typeof(eventObj.dataObject.postBody) == "string")
		{
	  		obnForm.resolvingMode.value = eventObj.dataObject.postBody;
	  	}
  	}
  	
  	//source for GP and SourceRole mode
	try {
	  	obnForm.source.value=EPCM.getSAPTop().gHistoryFrameworkObj.GetActiveTrackingEntryValue().URL;
	} catch(e) {
		obnForm.source.value="";
	}
  	
  	var obnPostBody = eventObj.dataObject.postBody;
  	
  	if(obnPostBody != null && typeof(obnPostBody) == "object")
  	{
  		obnForm.usePost.value = "true";
  		var innerHTML = obnForm.innerHTML;
  		var oldInnerHTML = innerHTML;
  		for(var i = 0 ; i < obnPostBody.length ; i++)
   		{
   			var paramName = obnPostBody[i].name;
   			var paramValue = obnPostBody[i].value;
   			
   			var str = "<input type=hidden name='"+paramName+"' id='"+paramName+"' value='"+paramValue+"'></input>\n";
   			innerHTML += str;
   		}
   		obnForm.innerHTML = innerHTML;
  		
  	}
  	else
  	{
  		obnForm.usePost.value = "false";
  	}
    obnForm.submit(); 
    if(obnPostBody != null && typeof(obnPostBody) == "object")
    {
    	obnForm.innerHTML = oldInnerHTML;
    }
   	
}



EPCM.subscribeEvent("urn:com.sapportals:navigation", "ObjBasedNavigate", onObjBasedNavigate);


function favoritesFinished()
{
	EPCM.raiseEvent("urn:con.sap.portal.navigation" , "newFavoriteItem" , null);
}

function AddToPortalFavorites(target , title, mode)
{
	try
	{
		
		var obj = EPCM.getSAPTop().gHistoryFrameworkObj.GetActiveTrackingEntryValue();
		var context = obj.context;
		if(! target)
		{
			target = obj.getUrl();
			title = GetUnescapedTitle(obj.title);
		}
		var url = "/irj/servlet/prt/portal/prtroot/com.sap.km.cm.remote?ServiceType=PortalFavorites&";
		url += ("NavigationTarget=" + escape(target));
		url += ("&Title=" + encodeURI(title));
		url += ("&Mode=" + mode);
		if (context != null && context.length > 0)
  			url = url + "&Context="+encodeURI(context);
		var favIFrame = document.getElementById("favoritesIframe");
		if(! favIFrame)
		{
			var favIFrame = document.createElement("IFRAME");
	    	favIFrame.style.visibility = "hidden";
	    	favIFrame.width=0;
	    	favIFrame.height=0;
	    	favIFrame.id = "favoritesIframe";
	    	if(EPCM.getUAType() == EPCM.MSIE)//using IE event model
	    		favIFrame.attachEvent("onload" , favoritesFinished);
	    	else// using W3C DOM:
	    		favIFrame.onload = favoritesFinished;
			favIFrame.src=url;
	    	favIFrame = document.body.appendChild(favIFrame);
	    }
	    favIFrame.src = url;
	}
	catch(e){}
}

function getSessionTerminationKeys()
{
	var frame = pageSupport._getContentWindow(pageSupport.getIvuFrameObj(frameworkSupport.innerPage));
	//fix - use new handshake mechansm for the DSM - keep backup of keys and send them until we get
	//confirmation, when the EPCM.getSAPTop().termDataBackup is empty.
	//we clear EPCM.getSAPTop().termDataBackup in the WorkArea.js when the content is retrived.
	var innerPageData = frame.EPCM.DSM.getTerminationData( true );
	var termDataBackup = EPCM.getSAPTop().termDataBackup;
	var data = frame.EPCM.DSM.mergeTerminationData(termDataBackup, innerPageData);
	EPCM.getSAPTop().termDataBackup = data;
	var str = "";
	for (var i in data)
	{
		var key = i; 
		var value = data[i];
		str += "<input type=hidden name='"+key+"' id='"+key+"' value='"+value+"'></input>\n";
	}

	// If there are session keys add a unique parameter to identify it for later use.
	if(str != "")
	{
		str += "<input type=hidden name='SessionKeysAvailable' id='SessionKeysAvailable' value='true'></input>"
	}
	return str;
}
function clearBackupSessionTerminationKeys()
{
	EPCM.getSAPTop().termDataBackup = null; 
}

EPCM.subscribeEvent("urn:com.sapportals:navigation", "clearDSMKeys", clearBackupSessionTerminationKeys);

function nav_skip(sId,oEvt) 
{
	var sCt=nav_getControlType(sId);
	if(sCt=="AX" || sCt=="AP" || sCt=="IF" || sCt=="T" )
		sId+="-r";
	var oR=nav_get(sId);
	var oN=null;
	var oF=null;
	
	
	if( (oEvt.shiftKey && oEvt.ctrlKey && oEvt.keyCode==9) || (oEvt.shiftKey && oEvt.altKey && oEvt.keyCode==90) )
	{
		while(oR!=null && oF==null){
			while(oR!=null && oR.previousSibling==null)
				oR=oR.parentNode;
			if(oR==null)
				break;
			oN=oR.previousSibling;
			while(oN!=null && oF==null){
				oF=nav_findFirstFocus(oN,true);
				if(oF==null)
					oN=oN.previousSibling;
			}
			if(oF==null)
				oR=oR.parentNode;
			else
				break;
		}
	}	 
	
	else if( (oEvt.ctrlKey && oEvt.keyCode==9) || (oEvt.altKey && oEvt.keyCode==90) ){
		while(oR!=null && oF==null){
			while(oR!=null && oR.nextSibling==null)
				oR=oR.parentNode;
			if(oR==null)
				break;				
			oN=oR.nextSibling;
			while(oN!=null && oF==null){
				oF=nav_findFirstFocus(oN);
				if(oF==null)
					oN=oN.nextSibling;
			}
			if(oF==null)
				oR=oR.parentNode;
			else
				break;
		}
	}
	else if( (oEvt.altKey && oEvt.keyCode==98) || (oEvt.altKey && oEvt.keyCode==66) ){
		if(oR != null)
			oF = oR;
	}
	if(oF!=null)
	{
		try {oF.focus();} 
			catch (ex){}
	}	
}

function nav_getControlType(sId) {
	try {
	  aId=sId.split("-");
	  var sCt=nav_get(aId[0]).getAttribute("ct");
	  if(sCt==null) sCt=nav_get(aId[0]+"-r").getAttribute("ct");
	  return sCt;
	} catch (ex) {return ""};
}

function nav_get(sId) {
  if(sId!="") return document.getElementById(sId);
}
function nav_findFirstFocus(o,bLast) {
  var oChild=o;
  if (o==null) return null;
  if (nav_Focus_canFocus(o)) {
		return o;
  }
  
  if (ur_system.direction=="rtl" || bLast) {
   	for (var i=oChild.childNodes.length-1;i>=0;i--) {
      var oTmp=oChild.childNodes.item(i);
	  if (nav_Focus_canFocus(oTmp)) {
	    return oTmp;
      }
      var oTmp=nav_findFirstFocus(oTmp);
      if (oTmp!=null) {
        return oTmp;
      }
    }  
  } else {    
    for (var i=0;i<oChild.childNodes.length;i++) {
      var oTmp=oChild.childNodes.item(i);
	  if (nav_Focus_canFocus(oTmp)) {
	    return oTmp;
      }
      var oTmp=nav_findFirstFocus(oTmp);
      if (oTmp!=null) {
        return oTmp;
      }
    }  
  }
  return null;
}
function nav_Focus_canFocus(o) {
	if (o==null) return;
	if (!o.tagName) return;
	var tag=","+o.tagName+",";
  
	if((tag==",INPUT,")&&(o.type=="hidden"||o.disabled)){ 
		return false;
	}
	var search=",A,BODY,BUTTON,FRAME,IFRAME,INPUT,ISINDEX,OBJECT,SELECT,TEXTAREA,";
	if (search.indexOf(tag)>-1) return (o.tabIndex>=0);
	if (!o.getAttribute) return;
	if (o.getAttribute("ti")!=null) return (parseInt(o.getAttribute("ti"))>=0);
}


//Since all titles are double encoded before getting placed in the history we need to decode them.
//The following method is used to un-escape the titles. 
function GetUnescapedTitle(oldTitle)
{	
	var newTitle = oldTitle.replace(/\\\'/g,"'");	newTitle = newTitle.replace(/\\u003e/g,">");	
	return newTitle;
}



