/*
*+------------------------------------------------------------------------+
*| Licensed Materials - Property of IBM
*| IBM Cognos Products: Viewer
*| (C) Copyright IBM Corp. 2001, 2017
*|
*| US Government Users Restricted Rights - Use, duplication or
*| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*|
*+------------------------------------------------------------------------+
*/
/**
* CViewerToolbar
* @constructor
*/
function CViewerToolbar()
{
this.m_specification = null;
this.m_oCBar = null;
this.m_sWebContentRoot = null;
this.m_sSkin = null;
}
/**
* Returns the namespace defined in the JSON specification
* @return (string)
*/
CViewerToolbar.prototype.getNamespace = function()
{
if(this.m_specification && typeof this.m_specification.namespace != "undefined")
{
return this.m_specification.namespace;
}
return "";
};
/**
* Returns the webContentRoot
* @return (string)
*/
CViewerToolbar.prototype.getSkin = function()
{
if (this.m_sSkin == null)
{
var oCV = null;
try
{
oCV = getCognosViewerObjectRef(this.getNamespace());
}
catch(exception){}
if (oCV)
{
this.m_sSkin = oCV.getSkin();
}
else
{
this.m_sSkin = this.getWebContentRoot() + "/skins/corporate";
}
}
return this.m_sSkin;
};
/**
* Returns the webContentRoot
* @return (string)
*/
CViewerToolbar.prototype.getWebContentRoot = function()
{
if (this.m_sWebContentRoot == null)
{
var oCV = null;
try
{
oCV = getCognosViewerObjectRef(this.getNamespace());
}
catch(exception){}
if (oCV)
{
this.m_sWebContentRoot = oCV.getWebContentRoot();
}
else
{
this.m_sWebContentRoot = "..";
}
}
return this.m_sWebContentRoot;
};
/**
* Returns the div id where the toolbar renders itself
* @return (string)
*/
CViewerToolbar.prototype.getDivId = function()
{
if(this.m_specification && typeof this.m_specification.divId != "undefined")
{
return this.m_specification.divId;
}
return "";
};
/**
* Returns the local defined style used by the viewer front end
* @return (string)
*/
CViewerToolbar.prototype.getStyle = function()
{
if(this.m_specification && typeof this.m_specification.style != "undefined")
{
return this.m_specification.style;
}
return "";
};
/**
* Returns the toolbar specification (CViewerToolbarSpecification) defined by the JSON specification passed in to the initialize method
* @return CViewerToolbarSpecification
*/
CViewerToolbar.prototype.getToolbarSpecification = function()
{
if(this.m_specification && typeof this.m_specification.S != "undefined")
{
return new CViewerToolbarSpecification(this,this.m_specification.S);
}
return null;
};
/**
* Returns the ui item specified by the id (the id should not contain the namespace, the viewer toolbar will look after appending it
* @return UI item (CMenuItem, CToolbarButton, StaticText, etc)
*/
CViewerToolbar.prototype.getItem = function(sId)
{
if(this.m_oCBar)
{
var numItems = this.m_oCBar.getNumItems();
sId = this.getNamespace() + sId;
for(var index = 0; index < numItems; ++index)
{
var uiItem = this.m_oCBar.get(index);
if(typeof uiItem.getId == "function" && uiItem.getId() == sId)
{
return uiItem;
}
}
}
return null;
};
/**
* Initializes the viewer toolbar
* @param jsonSpecification - JSON object specification
*/
CViewerToolbar.prototype.init = function(jsonSpecification)
{
if(typeof jsonSpecification != "undefined" && typeof jsonSpecification == "object" && jsonSpecification != null)
{
this.m_specification = jsonSpecification;
}
};
/**
* Returns the CBar object
*/
CViewerToolbar.prototype.getCBar = function()
{
if (!this.m_oCBar && this.m_specification)
{
this.load();
}
return this.m_oCBar;
};
/**
* Creates a CBar object using the json specification
*/
CViewerToolbar.prototype.load = function()
{
var toolbar = null;
if(this.m_specification != null)
{
var divId = this.getDivId();
var divNode = document.getElementById(divId);
var toolbarSpecification = this.getToolbarSpecification();
if(divNode && toolbarSpecification)
{
toolbar = toolbarSpecification.draw();
}
}
this.m_oCBar = toolbar;
return toolbar;
};
/**
* Renders the viewer toolbar within the containing
element.
*/
CViewerToolbar.prototype.draw = function()
{
if (this.m_oCBar)
{
this.m_oCBar.draw();
}
};
/**
* CViewerToolbarSpecification
* @constructor
*/
function CViewerToolbarSpecification(viewerToolbar, jsonSpecification)
{
this.m_viewerToolbar = viewerToolbar;
this.m_toolbarSpecification = jsonSpecification;
}
/**
* Builds ui elements using the toolbar specification
*/
CViewerToolbarSpecification.prototype.draw = function()
{
if(this.m_toolbarSpecification)
{
var toolbarStyle = gToolbarStyle;
if (this.m_viewerToolbar.getStyle() === 'banner')
{
toolbarStyle = gBannerToolbarStyle;
}
var toolbar = new CBar(this.m_viewerToolbar.getDivId(), toolbarStyle, null, this.m_viewerToolbar.getWebContentRoot());
toolbar.setMenuType(cHorizonalBar); // TODO: Where is cHorizontalBar defined?
toolbar.style = this.m_viewerToolbar.getStyle();
toolbar.setAlign("right");
// have we placed a button, menuItem on the toolbar yet
var bToolbarHasItem = false;
// keeps the seperatorSpec until we go to place the next item
var oSeperatorObj = null;
var oSeperatorSpecification = null;
for (var iIndex=0; iIndex < this.m_toolbarSpecification.length; iIndex++)
{
for(var uiItem in this.m_toolbarSpecification[iIndex])
{
try
{
var object = eval("new " + uiItem + "();");
// P = Seperator
if (uiItem == "P")
{
if (bToolbarHasItem && oSeperatorSpecification == null)
{
oSeperatorObj = object;
oSeperatorSpecification = this.m_toolbarSpecification[iIndex][uiItem];
}
}
else
{
var itemSpec = this.m_toolbarSpecification[iIndex][uiItem];
if (itemSpec.N !== 'openWith' || !window.isIOS()) {
bToolbarHasItem = true;
if (oSeperatorSpecification != null && oSeperatorObj != null) {
oSeperatorObj.load(toolbar, oSeperatorSpecification, this.m_viewerToolbar);
oSeperatorObj = null;
oSeperatorSpecification = null;
}
object.load(toolbar, itemSpec, this.m_viewerToolbar);
}
}
}
catch(exception){}
}
}
return toolbar;
}
return null;
};
// CVButton
function B(){}
B.prototype.isValid = function(jsonSpecification)
{
if(jsonSpecification != null)
{
return true;
}
return false;
};
B.prototype.load = function(parentObject, jsonSpecification, viewerToolbar)
{
if(this.isValid(jsonSpecification))
{
var sTooltip = "";
var sImage = "";
var sAction = "";
var sName = jsonSpecification.N;
var menuItems = null;
if (typeof jsonSpecification.M != "undefined" && jsonSpecification.M.IS != "undefined")
{
menuItems = jsonSpecification.M.IS;
}
// if we don't have an icon defined, then use the first menu item for the button
if (typeof jsonSpecification.C == "undefined")
{
if(menuItems)
{
var firstMenuItem = menuItems[0]["I"];
if (firstMenuItem != null && this.isValid(firstMenuItem))
{
sTooltip = firstMenuItem.O;
if (typeof sTooltip == "undefined" || sTooltip == "")
{
sTooltip = firstMenuItem.E;
}
sImage = firstMenuItem.C;
sAction = firstMenuItem.A;
}
}
}
else
{
sTooltip = jsonSpecification.O;
sImage = jsonSpecification.C;
sAction = jsonSpecification.A;
}
var toolbarButton = null;
if (viewerToolbar.getStyle() === "banner")
{
toolbarButton = new CMenuItem(parentObject, "", sAction, sImage, gBannerButtonStyle, viewerToolbar.getWebContentRoot(), viewerToolbar.getSkin());
toolbarButton.setDropDownArrow("dropdown_arrow_banner.gif");
}
else
{
toolbarButton = new CMenuItem(parentObject, "", sAction, sImage, gMenuItemStyle, viewerToolbar.getWebContentRoot(), viewerToolbar.getSkin());
toolbarButton.setDropDownArrow("dropdown_arrow_narrow.gif");
}
toolbarButton.setId(viewerToolbar.getNamespace() + sName);
toolbarButton.setToolTip(sTooltip);
if (typeof jsonSpecification.ALT != "undefined")
{
toolbarButton.setAltText(jsonSpecification.ALT);
}
if(typeof jsonSpecification.D != "undefined" && jsonSpecification.D == "true")
{
toolbarButton.disable();
}
if(typeof jsonSpecification.M != "undefined")
{
var menuSpecification = jsonSpecification.M;
// only add the menu if there's more then one entry, or we have a callback to populate the menu
if (
typeof menuSpecification.Y != "undefined" &&
(
typeof menuSpecification.A != "undefined" ||
(menuItems && menuItems.length > 1) ||
(typeof menuSpecification.H == "undefined" || menuSpecification.H == "false")
)
)
{
var menu = new M();
toolbarButton.m_menu = menu.load(parentObject, menuSpecification, viewerToolbar);
toolbarButton.m_menu.setParent(toolbarButton);
toolbarButton.m_menuType = menuSpecification.Y;
}
}
return toolbarButton;
}
return null;
};
// Menu Item
function I(){}
I.prototype.isValid = function(jsonSpecification)
{
if(typeof jsonSpecification != "undefined" && jsonSpecification != null)
{
return true;
}
return false;
};
I.prototype.load = function(parentObject, jsonSpecification, viewerToolbar)
{
if(this.isValid(jsonSpecification))
{
var sText = jsonSpecification.E;
var sImage = jsonSpecification.C;
var sAction = jsonSpecification.A;
var sName = jsonSpecification.N;
var menuItems = null;
if (typeof jsonSpecification.M != "undefined" && jsonSpecification.M.IS != "undefined")
{
menuItems = jsonSpecification.M.IS;
}
// if we don't have an icon defined, then use the first menu item for the button
if (typeof jsonSpecification.E == "undefined")
{
if(menuItems && menuItems[0])
{
var firstMenuItem = menuItems[0]["I"];
if (firstMenuItem != null && this.isValid(firstMenuItem))
{
sText = firstMenuItem.E;
if (typeof sText == "undefined" || sText == "")
{
sText = firstMenuItem.O;
}
sAction = firstMenuItem.A;
}
}
else {
return null;
}
}
else
{
sText = jsonSpecification.E;
sImage = jsonSpecification.C;
sAction = jsonSpecification.A;
}
var menuStyle = null;
if (parentObject.style && parentObject.style === "banner")
{
menuStyle = gBannerItemStyle;
}
else
{
menuStyle = gMenuItemStyle;
}
var menuItem = new CMenuItem(parentObject, sText, sAction, sImage, menuStyle, viewerToolbar.getWebContentRoot(), viewerToolbar.getSkin());
if(typeof jsonSpecification.ALT != "undefined")
{
menuItem.setAltText(jsonSpecification.ALT);
}
if (parentObject.style && parentObject.style === "banner")
{
menuItem.setDropDownArrow("dropdown_arrow_banner.gif");
}
else
{
menuItem.setDropDownArrow("dropdown_arrow_narrow.gif");
}
menuItem.setId(viewerToolbar.getNamespace() + sName);
if(typeof jsonSpecification.D != "undefined" && jsonSpecification.D == "true")
{
menuItem.disable();
}
if(typeof jsonSpecification.M != "undefined")
{
var menuSpecification = jsonSpecification.M;
// only add the menu if there's more then one entry, or we have a callback to populate the menu
if (
typeof menuSpecification.Y != "undefined" &&
(
typeof menuSpecification.A != "undefined" ||
(menuItems && menuItems.length > 1) ||
(typeof menuSpecification.H == "undefined" || menuSpecification.H == "false")
)
)
{
var menu = new M();
menuItem.m_menu = menu.load(parentObject, menuSpecification, viewerToolbar);
menuItem.m_menu.setParent(menuItem);
menuItem.m_menuType = jsonSpecification.M.Y;
}
}
return menuItem;
}
return null;
};
// Menu
function M(){}
M.prototype.isValid = function(jsonSpecification)
{
return (typeof jsonSpecification != "undefined" && jsonSpecification != null && typeof jsonSpecification.id != "undefined");
};
M.prototype.load = function(parentObject, jsonSpecification, viewerToolbar)
{
if(this.isValid(jsonSpecification))
{
var menu = new CMenu(jsonSpecification.id, gMenuStyle, viewerToolbar.getWebContentRoot());
menu.setParent(parentObject);
if (typeof jsonSpecification.ALT != "undefined")
{
menu.setAltText(jsonSpecification.ALT);
}
try
{
menu.m_oCV = getCognosViewerObjectRef(viewerToolbar.getNamespace());
}
catch(e){}//if we can't get the cognos viewr object, eat the exception
if(typeof jsonSpecification.A != "undefined")
{
menu.registerCallback(jsonSpecification.A);
}
var menuItems = jsonSpecification.IS;
if (menuItems)
{
for(var iIndex=0; iIndex < menuItems.length; iIndex++)
{
for(var uiItem in menuItems[iIndex])
{
try
{
var menuItem = new I();
menuItem.load(menu, menuItems[iIndex][uiItem], viewerToolbar);
}
catch(exception){}
}
}
}
return menu;
}
return null;
};
// StaticText
function T(){}
T.prototype.isValid = function(jsonSpecification)
{
return (typeof jsonSpecification != "undefined" && jsonSpecification != null && typeof jsonSpecification.E != "undefined");
};
T.prototype.load = function(parentObject, jsonSpecification, viewerToolbar)
{
if(this.isValid(jsonSpecification))
{
var textStyle = null;
if (viewerToolbar.getStyle() === "banner")
{
textStyle = gBannerStaticText;
}
else
{
//todo
}
if (jsonSpecification.E && jsonSpecification.E.length > 0) {
var oStaticText = new CStaticText(jsonSpecification.E, textStyle);
if (jsonSpecification.N == "userName")
{
oStaticText.setId("userNameTD" + viewerToolbar.getNamespace());
}
if (jsonSpecification.ALT) {
oStaticText.setLabelledBy(jsonSpecification.ALT + " " + jsonSpecification.E);
}
parentObject.add(oStaticText);
}
}
return null;
};
// Link
function L(){}
L.prototype.isValid = function(jsonSpecification)
{
return (typeof jsonSpecification != "undefined" && jsonSpecification != null && typeof jsonSpecification.E != "undefined");
};
L.prototype.load = function(parentObject, jsonSpecification, viewerToolbar)
{
if(this.isValid(jsonSpecification))
{
var linkStyle = null;
if (viewerToolbar.getStyle() === "banner")
{
linkStyle = gBannerLink;
}
else
{
//todo
}
var sAction = jsonSpecification.A;
// todo: for now simply use the CMenuItem class
var menuItem = new CMenuItem(parentObject, jsonSpecification.E, sAction, "", linkStyle, viewerToolbar.getWebContentRoot(), viewerToolbar.getSkin());
// Workaround since CMenuItem currently looks at all its siblings to see if one has an icon
menuItem.iconPlaceholder = false;
if (jsonSpecification.ALT != "undefined")
{
menuItem.setAltText(jsonSpecification.ALT);
}
return menuItem;
}
return null;
};
// Seperator
function P() {}
P.prototype.isValid = function(jsonSpecification)
{
return (typeof jsonSpecification != "undefined" && jsonSpecification != null && typeof jsonSpecification.Y != "undefined");
};
P.prototype.load = function(parentObject, jsonSpecification, viewerToolbar)
{
if(this.isValid(jsonSpecification))
{
var seperator = new CSeperator(jsonSpecification.Y, "", "", viewerToolbar.getWebContentRoot());
if (viewerToolbar.getStyle() === "banner")
{
seperator.setToolbarSeperatorClass("bannerDivider");
}
else
{
seperator.setToolbarSeperatorClass("toolbarDivider");
}
parentObject.add(seperator);
return seperator;
}
return null;
};