
function TrackingStack()
{
this.TrackingStackContainer = new Array();
this.PushEntry = PushEntry;this.PopEntry = PopEntry;this.GetEntry = GetEntry;this.PopEntryByIndex = PopEntryByIndex;this.GetEntryByIndex = GetEntryByIndex;this.PopEntryByIndex = PopEntryByIndex;this.GetEntryIndexByValue	= GetEntryIndexByValue;this.emptyStack = emptyStack;this.sliceStack = sliceStack;this.size = size;
}
function PushEntry(newEntry)
{this.TrackingStackContainer.push(newEntry);}
function PopEntry()
{return this.TrackingStackContainer.pop();}
function GetEntry()
{return this.TrackingStackContainer[this.TrackingStackContainer.length-1];}
function PopEntryByIndex(index)
{return this.TrackingStackContainer.splice(index , 1)[0];}
function GetEntryByIndex(index)
{return this.TrackingStackContainer[index];}
function GetEntryIndexByValue(TrackingEntryForSearch)
{var index = 0;while(index< this.TrackingStackContainer.length)
{
if(this.TrackingStackContainer[index].getUrl() == TrackingEntryForSearch.getUrl())
return index;++index;}
return -1;}
function sliceStack(begin , end)
{this.TrackingStackContainer.splice(begin , end-begin);}
function emptyStack(index)
{return this.TrackingStackContainer[index];}
function size()
{return this.TrackingStackContainer.length;}
function HistoryFramework()
{
this.TrackingEntries = new TrackingStack;
this.LastVisitedEntries = new TrackingStack;
this.NoDuplicationArray = new Array();
this.ActiveTrackingEntryIndex = -1;
this.AddTrackingEntry = AddTrackingEntry;this.AddTrackingEntryAllowDuplicate	= AddTrackingEntryAllowDuplicate;this.SetActiveTrackingEntryIndex	= SetActiveTrackingEntryIndex;this.GetTrackingListPreActive = GetTrackingListPreActive;this.GetTrackingListPostActive = GetTrackingListPostActive;this.GetActiveTrackingEntryIndex	= GetActiveTrackingEntryIndex;this.GetActiveTrackingEntryValue	= GetActiveTrackingEntryValue;this.TrackingEntryBack = TrackingEntryBack;this.TrackingEntryForward = TrackingEntryForward;this.GetLastVisitedList = GetLastVisitedList;this.CutLastVisitedListByIndex = CutLastVisitedListByIndex;this.AddToLastVisitedList = AddToLastVisitedList;this.GetEntryIndexByValue = FrameworkGetEntryIndexByValue;this.GetEntryValueByIndex = GetEntryValueByIndex;this.Navigate = NavigateToHistory;this.checkLength = checkLength;
}
function AddTrackingEntry(newTrackingEntryUrl , newTrackingEntryTitle , newTrackingEntryParams , newTrackingEntryContext, newPathIndexes)
{
if(newTrackingEntryUrl != null && newTrackingEntryUrl != "")
{
var comparableNewTrackingEntryParams = newTrackingEntryParams;if (comparableNewTrackingEntryParams != null && comparableNewTrackingEntryParams != ""){comparableNewTrackingEntryParams = "&"+comparableNewTrackingEntryParams;}
if(this.TrackingEntries.size() == 0 || (newTrackingEntryUrl + comparableNewTrackingEntryParams) != this.TrackingEntries.GetEntryByIndex(this.TrackingEntries.size()-1).getUrl())
{var newTrackingObject = new HistoryEntry(newTrackingEntryUrl , newTrackingEntryTitle , newTrackingEntryParams , newTrackingEntryContext , EPCM.getSAPTop().postBody, newPathIndexes);
var indexOf = this.TrackingEntries.GetEntryIndexByValue(newTrackingObject);if(indexOf == -1)
{
if(this.TrackingEntries.size() > this.GetActiveTrackingEntryIndex()+1)
this.TrackingEntries.sliceStack(this.GetActiveTrackingEntryIndex()+1 , this.TrackingEntries.size());
this.checkLength();this.TrackingEntries.PushEntry(newTrackingObject);this.SetActiveTrackingEntryIndex(this.TrackingEntries.size()-1);}
else
{this.SetActiveTrackingEntryIndex(indexOf);}
}
else
{this.SetActiveTrackingEntryIndex(this.TrackingEntries.size()-1);}
var newBreadObject = new HistoryEntry(newTrackingEntryUrl , newTrackingEntryTitle , newTrackingEntryParams , newTrackingEntryContext , EPCM.getSAPTop().postBody, newPathIndexes);this.AddToLastVisitedList(newBreadObject);
}
}
function AddTrackingEntryAllowDuplicate(newTrackingEntryUrl , newTrackingEntryTitle , newTrackingEntryParams , newTrackingEntryContext, newPathIndexes)
{if(newTrackingEntryUrl != null && newTrackingEntryUrl != "")
{
var comparableNewTrackingEntryParams = newTrackingEntryParams;if (comparableNewTrackingEntryParams != null && comparableNewTrackingEntryParams != ""){comparableNewTrackingEntryParams = "&"+comparableNewTrackingEntryParams;}
if(this.TrackingEntries.size() == 0 || (newTrackingEntryUrl + comparableNewTrackingEntryParams) != this.TrackingEntries.GetEntryByIndex(this.TrackingEntries.size()-1).getUrl())
{var newTrackingObject = new HistoryEntry(newTrackingEntryUrl , newTrackingEntryTitle , newTrackingEntryParams , newTrackingEntryContext , EPCM.getSAPTop().postBody, newPathIndexes);
if(this.TrackingEntries.size() > this.GetActiveTrackingEntryIndex()+1)
this.TrackingEntries.sliceStack(this.GetActiveTrackingEntryIndex()+1 , this.TrackingEntries.size());
this.checkLength();
this.TrackingEntries.PushEntry(newTrackingObject);this.SetActiveTrackingEntryIndex(this.TrackingEntries.size()-1);
}
else
{this.SetActiveTrackingEntryIndex(this.TrackingEntries.size()-1);}
var newBreadObject = new HistoryEntry(newTrackingEntryUrl , newTrackingEntryTitle , newTrackingEntryParams , newTrackingEntryContext , EPCM.getSAPTop().postBody, newPathIndexes);this.AddToLastVisitedList(newBreadObject);}
}
function SetActiveTrackingEntryIndex(index)
{if(index >= 0 && index < this.TrackingEntries.size())
{this.ActiveTrackingEntryIndex = index;}
}
function GetTrackingListPreActive()
{return this.TrackingEntries.TrackingStackContainer.slice(0, this.ActiveTrackingEntryIndex);}
function GetTrackingListPostActive()
{return this.TrackingEntries.TrackingStackContainer.slice(this.ActiveTrackingEntryIndex + 1);}
function GetActiveTrackingEntryIndex()
{return this.ActiveTrackingEntryIndex;}
function GetActiveTrackingEntryValue()
{return this.TrackingEntries.TrackingStackContainer[this.GetActiveTrackingEntryIndex()];}
function TrackingEntryBack()
{var activeIndex = this.GetActiveTrackingEntryIndex();
if(activeIndex != 0 )
{--this.ActiveTrackingEntryIndex;var activeValue = this.GetActiveTrackingEntryValue();
var newBreadObject = new HistoryEntry(activeValue.URL , activeValue.title , activeValue.params , activeValue.context , activeValue.postBody, activeValue.pathIndexes);this.AddToLastVisitedList(newBreadObject);return activeValue;}
else
{return null;}
}
function TrackingEntryForward()
{var activeIndex = this.GetActiveTrackingEntryIndex();
if(activeIndex < this.TrackingEntries.size()-1 )
{++this.ActiveTrackingEntryIndex;var activeValue = this.GetActiveTrackingEntryValue();var newBreadObject = new HistoryEntry(activeValue.URL , activeValue.title , activeValue.params , activeValue.context , activeValue.postBody, activeValue.pathIndexes);this.AddToLastVisitedList(newBreadObject);return activeValue;}
else
{return null;}
}
function GetLastVisitedList()
{return this.LastVisitedEntries.TrackingStackContainer;}
function CutLastVisitedListByIndex(index)
{if(index >= 0 && index < this.LastVisitedEntries.size())
{var newStack = this.LastVisitedEntries.TrackingStackContainer.slice(0 , index+1);this.LastVisitedEntries.TrackingStackContainer = newStack;}
}
function AddToLastVisitedList(obj)
{if(this.LastVisitedEntries.size() > 0)
{if(this.LastVisitedEntries.GetEntry().getUrl() == obj.getUrl())
return;}
this.LastVisitedEntries.PushEntry(obj);}
function FrameworkGetEntryIndexByValue(obj)
{return this.TrackingEntries.GetEntryIndexByValue(obj)
}
function GetEntryValueByIndex(ind)
{var obj = null;var currentIndex = this.GetActiveTrackingEntryIndex();if(ind == 0)
{obj = this.GetActiveTrackingEntryValue();}
else if(ind > 0 )
{var arr = this.GetTrackingListPostActive();if(ind > arr.length)
return null;obj = arr[ind-1];}
else
{ind = -ind;var arr = this.GetTrackingListPreActive();if(ind > arr.length)
return null;obj = arr[arr.length - ind];
}
return obj;
}
function NavigateToHistory(ind)
{var obj = null;var currentIndex = this.GetActiveTrackingEntryIndex();var obj = this.GetEntryValueByIndex(ind);
if(obj != null)
{this.SetActiveTrackingEntryIndex(currentIndex + parseInt(ind));this.AddToLastVisitedList(obj);obj.navigate();}
}
function checkLength()
{if(this.TrackingEntries.size() > 12)
this.TrackingEntries.PopEntryByIndex(0);if(this.LastVisitedEntries.size() > 12)
this.LastVisitedEntries.PopEntryByIndex(0);
}
var gHistoryFrameworkObj;
function init()
{gHistoryFrameworkObj = new HistoryFramework();EPCM.subscribeEvent('urn:com.sapportals:navigation','AddNavTarget', onNewNavigationTarget);EPCM.subscribeEvent('urn:com.sapportals:navigation','AddNavTargetAllowDuplicate', onNewNavigationTargetAllowDuplicate);EPCM.subscribeEvent('urn:com.sapportals:navigation','setNavTargetPanel', onNavPanelChanged);EPCM.subscribeEvent('urn:com.sapportals:navigation','historyNavigate', onHistoryNavigate);
}
function onNewNavigationTarget(evt)
{gHistoryFrameworkObj.AddTrackingEntry(evt.dataObject.URL , evt.dataObject.title , evt.dataObject.params, evt.dataObject.context, evt.dataObject.pathIndexes);}
function onNewNavigationTargetAllowDuplicate(evt)
{gHistoryFrameworkObj.AddTrackingEntryAllowDuplicate(evt.dataObject.URL , evt.dataObject.title , evt.dataObject.params, evt.dataObject.context, evt.dataObject.pathIndexes);}
function onNavPanelChanged(evt)
{gHistoryFrameworkObj.GetActiveTrackingEntryValue().setNavPanelMode(evt.dataObject);}
function onHistoryNavigate(evt)
{gHistoryFrameworkObj.Navigate(evt.dataObject);}
init();
function HistoryEntry(URL , title , params, context , postBody, pathIndexes)
{
this.URL = URL;this.title = title;this.params = params;this.context = null;this.postBody = null;this.pathIndexes = pathIndexes;
if(context)
this.context = context;if(postBody)
this.postBody = postBody
this.getUrl = function()
{if(this.params != null && this.params != "")
return this.URL + "&" + this.params;else
return this.URL;}
this.navigate = function()
{var mode = EPCM.getSAPTop().isPerson;if(typeof(mode) == 'undefined')
mode = "2";EPCM.doNavigate(this.getUrl(),'','','',mode,'',this.context , this.postBody);}
this.noDuplicateEntry = gHistoryFrameworkObj.NoDuplicationArray[this.getUrl()];if(! this.noDuplicateEntry)
{this.noDuplicateEntry = new NoDuplicateEntry();gHistoryFrameworkObj.NoDuplicationArray[this.getUrl()] = this.noDuplicateEntry;}
else
{}
this.setNavPanelMode = function(str)
{this.noDuplicateEntry.navPanelMode = str;}
this.getNavPanelMode = function()
{return this.noDuplicateEntry.navPanelMode;}
this.getPathIndexes = function(){return this.pathIndexes.split(',');}
}
function NoDuplicateEntry()
{this.navPanelMode = null;}