// Licensed Materials - Property of IBM
//
// IBM Cognos Products: pps
//
// (C) Copyright IBM Corp. 2005, 2017
//
// US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
// This forms the javascript functions used for the Calculation pane of
// PowerPlay Studio.
// The functions handle any minor browser differences.
var rightPane;
var addrightPane;
var subrightPane;
var forrightPane;
var forExplain;
var accrightPane;
var rollrightPane;
var addSelect;
var subSelect1;
var subSelect2;
var accSelect;
var rollSelect;
var operationSelect;
var calcOpTypesSelect;
var rc;
var dim;
var selecteddim;
var selections;
var catarr;
var calcID;
var editCode; //calculation being editing
var errorMsg = "";
var calcTypeIndex; //remember the calc type
var calcOpTypesIndex; //remember the calc operation type
var calcTypesArray = new Array();
var calcOpTypesArray= new Array();
var categories = new Array();
categories["R"] = new Array();
categories["C"] = new Array();
var lowestDimInAxis = new Array();
function addToArray(rc, dim, name, code, calc, rankBased, top_of_dim, POB_nonbaseable) {
if (!categories[rc][dim]) {
categories[rc][dim] = new Array();
}
//Use the fact that the lowest level categories are added last to the array
lowestDimInAxis[rc] = dim;
categories[rc][dim][categories[rc][dim].length] = new categoryRecord(name, code, calc, rankBased, top_of_dim, POB_nonbaseable);
}
function categoryRecord(name, code, calc, rankBased, top_of_dim, POB_nonbaseable) {
this._name = name;
this._calc = calc;
this._code = code;
this._rankBased = rankBased;
this._top_of_dim = top_of_dim;
this._POB_nonbaseable = POB_nonbaseable;
if (!calc)
{
var comma = code.search(',');
if (comma > -1)
{
var dimIdx = parseInt(code.substr(comma+1));
this._isMeasure = topparent.getGlobal("gDimensionInfo")[dimIdx].isMeasureDimension;
}
}
}
function initVars() {
rightPane = document.getElementById("details");
//Store Each calculation type's sub-dom tree.
addrightPane = document.getElementById("addDetails");
subrightPane = document.getElementById("subDetails");
forrightPane = document.getElementById("forDetails");
accrightPane = document.getElementById("accDetails");
rollrightPane = document.getElementById("rollDetails");
pctbaserightPane = document.getElementById("PctBaseDetails");
addSelect = document.getElementById("addCatSel");
subSelect1 = document.getElementById("subCatSel1");
subSelect2 = document.getElementById("subCatSel2");
accSelect = document.getElementById("accCatSel");
pctBaseSelect = document.getElementById("pctBaseSel");
pctBaseBaseSelect = document.getElementById("pctBaseBase");
rollSelect = document.getElementById("rollCatSel");
forExplain = document.getElementById("forecastExplanation");
operationSelect = document.getElementById("calcType");
calcOpTypesSelect = document.getElementById("calcOpType");
//Remove each calculations sub-dom tree.
rightPane.removeChild(addrightPane);
rightPane.removeChild(subrightPane);
rightPane.removeChild(forrightPane);
rightPane.removeChild(accrightPane);
rightPane.removeChild(rollrightPane);
rightPane.removeChild(pctbaserightPane);
calcOpTypesIndex = -1;
calcTypeIndex = -1;
}
function init() {
topparent.openActionPane();
ContextMenu.initialize(true,false);
document.getElementById("calcOpType").selectedIndex = 0;
document.getElementById("calcType").selectedIndex = 0;
initVars();
initErrorVars();
createCategoryRecords();
resetDialog();
}
function refresh() {
resetDialog();
}
function resetDialog() {
removeMessage();
displayContent();
if (document.getElementById("applyButton"))
document.getElementById("applyButton").disabled = true;
if (calcOpTypesSelect)
calcOpTypesSelect.disabled = true;
if (operationSelect)
operationSelect.disabled = true;
if (document.preCalculation) {
document.preCalculation.delete_calc.checked=true;
document.preCalculation.edit.checked=false;
document.preCalculation.rename.checked=false;
document.preCalculation.insert.checked=false;
}
popSelections();
var rowcolswitch = false;
var rowSelections = getSelected("r");
var colSelections = getSelected("c");
if (rowSelections.length && colSelections.length) { //Both rows and columns selected
handleError(strNoSelectionsMsg , true);
return;
} else if (!rowSelections.length && !colSelections.length) {//No rows or columns selected
if( !isLevelSelected("r") && !isLevelSelected("c") ) {
handleError(strNoSelectionsMsg, true);
return;
}
else {
if( isLevelSelected("r") ) {
rc = "R";
}
else {
rc = "C";
}
}
}
if (rowSelections.length || isLevelSelected("r")) {
if (rc != "R")
rowcolswitch = true;
rc = "R";
if (isLevelSelected("r"))
dim = getSelectedLevel().getAttribute("dimIdx");
else if (!resetRowColArray(rowSelections))
return;
} else {
if (rc != "C")
rowcolswitch = true;
rc = "C";
if (isLevelSelected("c"))
dim = getSelectedLevel().getAttribute("dimIdx");
else if (!resetRowColArray(colSelections))
return;
}
catarr = categories[rc][dim];
if (!catarr || !catarr.length) {
handleError(strNoSelectionsMsg, true);
return;
}
//if the editingCalc is true, then user is editting a calculation (value of 2 is for renaming calculation only).
var editCalc = topparent.getGlobal("editingCalc");
//the only selection is a non-isolated calculation, so render the preContent to ask user to
//choose it is going to be an insert or edit.
if(catarr != null){
if(catarr.length > 1 && (rowSelections.length == 1 ^ colSelections.length == 1)){
if(editCalc == -1) {
var theSel = rowSelections.length > 0 ? rowSelections[0] : colSelections[0];
if(theSel.getAttribute("calculation") == 'true' && theSel.getAttribute("rank") != 'true'){
selecteddim = null;
clearDialogs();
displayPreContent();
return;
}
}
}
}
calcID = "0";
editCode = "";
if(editCalc == 1 || editCalc == 2 || editCalc == 3){
editCode = rowSelections.length == 1 ? rowSelections[0].getAttribute("ppdsId") : colSelections[0].getAttribute("ppdsId");
if(editCode.charAt(0) == 'T')
calcID = editCode.substring(1, editCode.length);//will be used in the command sent to server when apply changes.
}
// While editing calculations, we need to preserve this variable so as to not allow replacement of any calculation by forecast.
if(editCalc != 1)
topparent.setGlobal("editingCalc", -1);
if (rowSelections.length && resetforCalc(rowSelections, editCalc))
return;
else if (resetforCalc(colSelections, editCalc))
return;
document.getElementById("calcOpType").disabled = false;
document.getElementById("calcType").disabled = false;
document.getElementById("applyButton").disabled = false;
if (((dim == selecteddim) && (!rowcolswitch)) && (calcID == "0")) {
if (getCurrentCalc()._type == 0) {//refresh add or roll selections
preSelectOptions(document.getElementById("addCatSel"));
} else if (getCurrentCalc()._type == 3) {
preSelectOptions(document.getElementById("rollCatSel"));
}
return;
} else {
selecteddim = dim;
}
clearDialogs();
var sCmd = "gDimensionInfo[" + dim + "].isTimeDimension";
popCalcOpTypes();
popCalcTypes(topparent.getGlobal(sCmd),isOnlyRanks());
setCalcType(true);
}
function resetforCalc(categ, editCalc) {
if(calcID == "0")
return false;
if ((categ.length != 1) || (categ[0].getAttribute("ppdsId").charAt(0) != 'T')) //not a calculation edit
return false;
//set the calcId to new calculation;
dim = categ[0].getAttribute("dimIdx");
catarr = categories[rc][dim];
if(editCalc == 1) {
popDialogWithCalcInfo(categ[0].getAttribute("ppdsId")); //We have to populate for the calculation.
displayContent();
}
else if (editCalc == 2) {
displayRenameContent(); //change label only
popRenameInfo(categ[0].getAttribute("ppdsId"));
document.getElementById("labelRenameField").select()
}
else if( editCalc == 3 )
{
//close the dialog and delete the calc!!
if (categ[0].getAttribute("dependent_cats") != null) {
displayDeleteContent();
popDeleteInfo(categ[0].getAttribute("dependent_cats"));
} else {
topparent.closeActionPane();
var del = 'MK:' + categ[0].getAttribute("ppdsId");
topparent.getXtabFrame().doit(del);
}
return true;
}
if (document.getElementById("calcOpType"))
document.getElementById("calcOpType").disabled = false;
if (document.getElementById("calcType"))
document.getElementById("calcType").disabled = false;
if (document.getElementById("applyButton"))
document.getElementById("applyButton").disabled = false;
return true;
}
function popDeleteInfo(dependents) {
var div = document.getElementById("referencedCalcs");
var deps = dependents.split("\t");
for (var i = 0; i < deps.length; i++) {
div.appendChild(document.createTextNode(deps[i]));
div.appendChild(document.createElement("BR"));
}
}
function resetRowColArray(array) {
dim = array[0].getAttribute("dimIdx");
for (var i = 1;i < array.length;i++) {
var tempdim = array[i].getAttribute("dimIdx");
if (tempdim != dim) {
handleError(strIncorrectSelectionsMsg, true);
return false;
}
}
return true;
}
function clearDialogs() {
if (document.getElementById("labelField"))
document.getElementById("labelField").value = "";
}
function getCurrentCalcOpType() {
return operationsTypesArray[document.getElementById("calcOpType").options[document.getElementById("calcOpType").selectedIndex].value];
}
function setCalcOpType(preselect) {
//we pop only calculations that belong to selected operation type
//and we preselect the very first calculation type
var sCmd = "gDimensionInfo[" + dim + "].isTimeDimension";
popCalcTypes(topparent.getGlobal(sCmd),isOnlyRanks());
operationSelect.selectedIndex = 0;
setCalcType(true);
}
function getCurrentCalc() {
return operationsArray[document.getElementById("calcType").options[document.getElementById("calcType").selectedIndex].value];
}
function setCalcType(preselect) {
calcTypeIndex = operationSelect.selectedIndex;
var calc = getCurrentCalc();
if (rightPane.childNodes.length > 0)
rightPane.removeChild(rightPane.childNodes[0]);
switch (calc._type) {
case 0:
rightPane.appendChild(addrightPane);
document.getElementById("labelDiv").style.visibility = "visible";
break;
case 2:
rightPane.appendChild(subrightPane);
document.getElementById("subtagSpot").innerHTML = "
" + CEncodingUtil.HtmlEncode(calc._tag);
document.getElementById("labelDiv").style.visibility = "visible";
break;
case 1:
rightPane.appendChild(accrightPane);
document.getElementById("labelDiv").style.visibility = "visible";
break;
case 3:
rightPane.appendChild(rollrightPane);
document.getElementById("labelDiv").style.visibility = "visible";
break;
case 4:
rightPane.appendChild(forrightPane);
document.getElementById("labelDiv").style.visibility = "hidden";
document.getElementById("forecastExplanation").style.visibility = "visible";
break;
case 5:
rightPane.appendChild(pctbaserightPane);
document.getElementById("labelDiv").style.visibility = "visible";
break;
}
popCategories(calc, preselect, editCode.length); //If editing then remove dependents of current calc
}
function operRec(tag, type, opType, rankApplicable) {
this._tag = tag;
this._type = type;
this._opType = opType;
if (rankApplicable != '')
this._rankApplicable = true;
else
this._rankApplicable = false;
}
function calcOpTypeRec(name, opType) {
this._name = name;
this._opType = opType;
}
function calcTypeRec(name, value, opType, isOnlyTime,isRankApplicable) {
this._name = name;
this._value = value;
this._opType = opType;
if (isOnlyTime != '')
this._isOnlyTime = true;
else
this._isOnlyTime = false;
if (isRankApplicable != '')
this._isRankApplicable = true;
else
this._isRankApplicable = false;
}
function addToOpTypeOptionArray(name, opType) {
calcOpTypesArray[calcOpTypesArray.length] = new calcOpTypeRec(name,opType);
}
function addToOptionArray(name, value, opType, isOnlyTime, isRankApplicable) {
calcTypesArray[calcTypesArray.length] = new calcTypeRec(name,value,opType, isOnlyTime,isRankApplicable);
}
function isOnlyRanks() {
var onlyRanks = true;
if (catarr != null) {
for (var i = 0; i < catarr.length && onlyRanks; i++)
if (!catarr[i]._rankBased)
onlyRanks = false;
}
return onlyRanks;
}
function popOptions(select, incCalcs, incRanks, restrictCurrentCalc) {
var idx = select.options.length;
while (idx > 0) {
select.options[--idx] = null;
}
var selIdx = 0;
var showCat;
if (catarr != null) {
for (var i = 0; i < catarr.length; i++){
showCat = true;
if (catarr[i]._top_of_dim == true)
showCat = false;
if (catarr[i]._code == editCode)
showCat = false;
if (catarr[i]._calc && (!incCalcs || isForcastCalc(catarr[i]._code)))
showCat = false;
if (catarr[i]._rankBased && !incRanks)
showCat = false;
if (restrictCurrentCalc && catarr[i]._calc && isBasedOnCalc(catarr[i]._code,"T" + calcID))
showCat = false;
if (showCat) {
select.options[selIdx] = new Option(catarr[i]._name,i);
select.options[selIdx++].label = catarr[i]._name;
}
}
}
return selIdx;
}
function popOtherAxisOptions(select) {
var dimArray = categories[ ((rc == "R")? "C" : "R") ][lowestDimInAxis[ ((rc == "R")? "C" : "R")] ];
var selIdx = 0;
var idx = select.options.length;
while (idx > 0) {
select.options[--idx] = null;
}
if (dimArray) {
for (var i = 0; i < dimArray.length; i++) {
if (!dimArray[i]._POB_nonbaseable) {
select.options[selIdx] = new Option(dimArray[i]._name,i);
select.options[selIdx++].label = CEncodingUtil.HtmlEncode(dimArray[i]._name);
}
}
}
}
function clearOtherAxisOptions(select) {
var idx = select.options.length;
while (idx > 0) {
select.options[--idx] = null;
}
}
function isForcastCalc(id) {
var calcInfo = getcalcInfo(id);
if (calcInfo && (calcInfo._oper == "f")) {
return true;
}
return false;
}
function popCalcOpTypes() {
var select = document.getElementById("calcOpType");
var idx = select.options.length;
while (idx > 0) {
select.options[--idx] = null;
}
var nIdx = 0;
for (var i = 0; i < calcOpTypesArray.length; i++)
{
select.options[nIdx] = new Option(calcOpTypesArray[i]._name,calcOpTypesArray[i]._opType);
select.options[nIdx].label = CEncodingUtil.HtmlEncode(calcOpTypesArray[i]._name);
nIdx++;
}
if(calcOpTypesIndex != -1)
select.selectedIndex = calcOpTypesIndex;
else
select.selectedIndex = 0;
}
function popCalcTypes(isTimeDim, isOnlyRanks) {
var select = document.getElementById("calcType");
var idx = select.options.length;
while (idx > 0) {
select.options[--idx] = null;
}
var selectedOpTypesIndex = 1; //initialize to one just in case
//we'll pop only calculations that belong to selected operation type
var selectedOpType = getCurrentCalcOpType();
if(typeof selectedOpType != "undefined")
selectedOpTypesIndex = selectedOpType._opType;
//when poping calculation, first check if we are currently editing existing calc
//in that case we do not want to pop forecast
var excludeForecast = false;
if(catarr != null){
var editCalc = topparent.getGlobal("editingCalc");
if(editCalc == 1){
var rowSelections = getSelected("r");
var colSelections = getSelected("c");
if(catarr.length > 0 && (rowSelections.length == 1 ^ colSelections.length == 1))
{
var id = rowSelections.length == 1 ? rowSelections[0].getAttribute("ppdsId") : colSelections[0].getAttribute("ppdsId");
if(id.charAt(0) == 'T')
{
var calcInfo = getcalcInfo(id);
excludeForecast = operationsArray[calcInfo._oper]._type != 4;
}
}
}
}
var nIdx = 0;
for (var i = 0; i < calcTypesArray.length; i++) {
if ((!calcTypesArray[i]._isOnlyTime || isTimeDim) &&
(calcTypesArray[i]._isRankApplicable || !isOnlyRanks) &&
(calcTypesArray[i]._value != 'f' || !excludeForecast) &&
(calcTypesArray[i]._opType == selectedOpTypesIndex)) { //No forecast option for edits
select.options[nIdx] = new Option(calcTypesArray[i]._name,calcTypesArray[i]._value);
select.options[nIdx].label = CEncodingUtil.HtmlEncode(calcTypesArray[i]._name);
nIdx++;
}
}
if(calcTypeIndex != -1 && calcTypeIndex < select.childNodes.length) {
select.selectedIndex = calcTypeIndex;
}
}
function popCategories(calc, preselect, restrictCurrentCalc) {
var currentSelectionIndex = 0;
switch (calc._type) {
case 0:
currentSelectionIndex = popOptions(addSelect,true,calc._rankApplicable,restrictCurrentCalc);
if (preselect && currentSelectionIndex)
preSelectOptions(addSelect);
break;
case 2:
currentSelectionIndex = popOptions(subSelect1,true,calc._rankApplicable,restrictCurrentCalc);
if( currentSelectionIndex )
currentSelectionIndex = popOptions(subSelect2,true,calc._rankApplicable,restrictCurrentCalc);
break;
case 1:
currentSelectionIndex = popOptions(accSelect,true,calc._rankApplicable,restrictCurrentCalc);
if (preselect && currentSelectionIndex)
preSelectOptions(accSelect);
break;
case 3:
currentSelectionIndex = popOptions(rollSelect,false,calc._rankApplicable,restrictCurrentCalc);
if (preselect && currentSelectionIndex)
preSelectOptions(rollSelect);
break;
case 5:
currentSelectionIndex = popOptions(pctBaseSelect, true, calc._rankApplicable, restrictCurrentCalc);
if (preselect && currentSelectionIndex)
preSelectOptions(pctBaseSelect);
clearOtherAxisOptions(pctBaseBaseSelect);
break;
}
if( !currentSelectionIndex && calc._type != 4) {
handleError(strNoSelectionsMsg, true);
return;
}
}
function preSelectOptions(select) {
for (var i = 0; i < select.length; i++) {
var val = select[i].value;
if (catarr[val])
{
var catCode = catarr[val]._code;
if(catCode.charAt(0) == 'T')
select[i].selected = selections[catCode];
else
select[i].selected = selections[parseInt(catarr[val]._code)];
}
}
}
function popSelections() {
var selects = getSelected("r");
if (selects.length == 0)
selects = getSelected("c");
selections = new Array();
for (var i = 0; i < selects.length; i++)
selections[selects[i].getAttribute("ppdsId")] = true;
}
function onRenameCalculation() {
if (document.getElementById("labelRenameField").value == "") {
topparent.closeActionPane();
return;
}
var label = document.getElementById("labelRenameField").value;
var cmd = 'MN:' + editCode;
cmd += "\t";
cmd += '"' + CEncodingUtil.EncodeStrOperand(label) + '"';
topparent.closeActionPane();
topparent.getXtabFrame().doit(cmd);
}
function onDeleteCalculation() {
if (document.getElementById("delCalc").checked) {
topparent.closeActionPane();
var cmd = 'MK:' + editCode;
topparent.getXtabFrame().doit(cmd);
} else {
topparent.closeActionPane();
var cmd = 'MH:0\t' + editCode;
topparent.getXtabFrame().doit(cmd);
}
}
function applyChanges() {
if (!validateInput()) {
if(errorMsg != ""){
calcOpTypesIndex = calcOpTypesSelect.selectedIndex;
calcTypeIndex = operationSelect.selectedIndex;
handleError(errorMsg, false);
}
return;
}
var cmd = "C" + operationSelect.options[operationSelect.selectedIndex].value + ":";
var label = document.getElementById("labelField").value;
cmd += (label && getCurrentCalc()._type != 4) ? ('"' + CEncodingUtil.EncodeStrOperand(label) + '"') : "";
cmd += "\t" + calcID;
cmd += "\t" + "-1\t";
cmd += (document.getElementById("customPosition").checked)? ("2\t" + ((rc == 'R')? "1" : "0")) : "0\t0";
topparent.getXtabFrame().fh.ACTPANE.value = 0;
switch(getCurrentCalc()._type)
{
case 0:
cmd = getAddCmd(cmd);break;
case 1:
cmd = getAccCmd(cmd); break;
case 2:
cmd = getSubCmd(cmd);break;
case 3:
cmd = getRollCmd(cmd);break;
case 4:
cmd = getForCmd(cmd);break;
case 5:
cmd = getPctBaseCmd(cmd);break;
}
if (cmd.charAt(0) == '!') {
return;
} else {
topparent.getXtabFrame().doit(cmd);
}
topparent.closeActionPane();
}
function getCatFromDimIdxPair(catNo) {
var dimArray = categories[ ((rc == "R")? "C" : "R") ][ lowestDimInAxis[ ((rc == "R")? "C" : "R")] ];
return dimArray[catNo];
}
function getAccCmd(cmd) {
cmd += "\t" + catarr[document.getElementById("accCatSel").options[document.getElementById("accCatSel").selectedIndex].value]._code;
return cmd;
}
function getPctBaseCmd(cmd) {
cmd += "\t" + catarr[document.getElementById("pctBaseSel").options[document.getElementById("pctBaseSel").selectedIndex].value]._code;
if (document.getElementById("pctBaseTypeBase").checked) {
var cat = getCatFromDimIdxPair(document.getElementById("pctBaseBase").options[document.getElementById("pctBaseBase").selectedIndex].value);
cmd += "\t" + cat._code;
}
return cmd;
}
function getSubCmd(cmd) {
var error = false;
if (document.getElementById("rcat1").checked)
cmd += "\t" + catarr[document.getElementById("subCatSel1").options[document.getElementById("subCatSel1").selectedIndex].value]._code;
else {
if (document.getElementById("subNum1").value)
cmd += "\t" + CNumUtil.normalizeDecimal(document.getElementById("subNum1").value);
else
error = true;
}
if (document.getElementById("rcat2").checked)
cmd += "\t" + catarr[document.getElementById("subCatSel2").options[document.getElementById("subCatSel2").selectedIndex].value]._code;
else {
if (document.getElementById("subNum2").value)
cmd += "\t" + CNumUtil.normalizeDecimal(document.getElementById("subNum2").value);
else
error = true;
}
if (error)
cmd = "!:" + strProvideNumbersMsg;
return cmd;
}
function getAddCmd(cmd) {
var ctr = numSelected(document.getElementById("addCatSel"));
cmd += getListCmd(document.getElementById("addCatSel"));
if (document.getElementById("userNumberCB").checked)
{
ctr++;
cmd += "\t" + CNumUtil.normalizeDecimal(document.getElementById("addNum1").value);
}
if (ctr < 2)
cmd = "!:" + strSelectMoreCatMsg;
return cmd;
}
function getRollCmd(cmd) {
var ctr = numSelected(document.getElementById("rollCatSel"));
if (ctr == 0)
cmd = "!:" + strSelectCatMsg;
else
cmd += getListCmd(document.getElementById("rollCatSel"));
return cmd;
}
function getForCmd(cmd) {
var i = 0;
while (catarr[i]._top_of_dim)
i++;
cmd += "\t" + catarr[i]._code + "\t";
cmd += document.getElementById("ForMethod").value + "\t";
cmd += document.getElementById("ForNum").value;
return cmd;
}
function numSelected(list) {
var ctr = 0;
for (var i = 0; i < list.options.length; i++) {
if (list.options[i].selected)
ctr++;
}
return ctr;
}
function getListCmd(list) {
var cmd = "";
for (var i = 0; i < list.options.length; i++) {
if (list.options[i].selected)
cmd += "\t" + catarr[list.options[i].value]._code;
}
return cmd;
}
function dialogOperand(type, code) {
this._type = type;
this._code = code;
}
function dialogInfo(oper, label, operands) {
this._oper = oper;
this._label = label;
this._operands = operands;
this._defaultPosition = true;
}
function getcalcInfo(id) {
var idx = parseInt(id.substring(1));
if (topparent.getXtabFrame().fh && topparent.getXtabFrame().fh.PT) {
var calcs = topparent.getXtabFrame().fh.PT.value.split("\t\t");
var dim;
for (var i = 0; i < calcs.length; i++) {
var x = calcs[i].split("\t");
var j = 0;
if (x[j].charAt(0) == 'D') dim = x[j++].substring(1);
if (i == idx - 1) {
var rIdx = 0;
var op = x[j++];
var opt = op.substring(2).split(",");
var pos = opt[0];
var label = opt[1];
var operands = new Array;
for (;j < x.length; j++) {
if (x[j].charAt(0) == 'D') {
x[j] = x[j].substr(x[j].indexOf(',') + 1);
}
if (x[j].charAt(0) == 'T') {
operands[operands.length] = new dialogOperand('T',x[j]);
} else {
var p = x[j].split(",");
if (p.length == 1)
operands[operands.length] = new dialogOperand('N', x[j]);
else
operands[operands.length] = new dialogOperand('C', p[0] + "," + dim + "," + p[1]);
}
}
var result = new dialogInfo(op.charAt(0),label,operands);
if (pos.length > 1 && (pos.charAt(pos.indexOf(';') + 1) == '1' || pos.charAt(pos.indexOf(';') + 1) == '2'))
result._defaultPosition = false;
return(result);
}
}
}
return null;
}
function isBasedOnCalc(calc,ancestorCalc) {
//Get the Info for this calc.
var calcInfo = getcalcInfo(calc);
//Loop through each of its operands and for each calc, if it's the ancestor or is based
//on the ancestor return true;
for (var i = 0; i < calcInfo._operands.length; i++) {
if (calcInfo._operands[i]._type == "T")
if (calcInfo._operands[i]._code == ancestorCalc ||
isBasedOnCalc(calcInfo._operands[i]._code,ancestorCalc))
return true;
}
return false;
}
function popRenameInfo(id) {
// adjust the size of the action pane for the rename calculation pane.
topparent.setActionPaneHeight("180");
var calcInfo = getcalcInfo(id);
if(calcInfo._label != "") {
document.getElementById("labelRenameField").value = calcInfo._label;
}
else {
for (var i = 0; i < catarr.length; i++) {
var temp = catarr[i]._code.split(",");
if(temp[0] == id)
document.getElementById("labelRenameField").value = catarr[i]._name;
}
}
}
function popPctBaseOtherAxisDropDown() {
if (pctBaseBaseSelect.options.length == 0) {
popOtherAxisOptions(pctBaseBaseSelect);
}
}
function popDialogWithCalcInfo(id) {
var sCmd = "gDimensionInfo[" + dim + "].isTimeDimension";
var calcInfo = getcalcInfo(id);
popCalcOpTypes();
//find and select proper operation type
for (var i = 0; i < calcOpTypesSelect.options.length; i++) {
if (calcOpTypesSelect.options[i].value == operationsArray[calcInfo._oper]._opType) {
calcOpTypesSelect.selectedIndex = i;
break;
}
}
popCalcTypes(topparent.getGlobal(sCmd),isOnlyRanks());
//find and select proper calculation type;
for (var i = 0; i < operationSelect.options.length; i++) {
if (operationSelect.options[i].value == calcInfo._oper) {
operationSelect.selectedIndex = i;
break;
}
}
//fill in label field if not a forcast
if (operationsArray[calcInfo._oper]._type != 4)
document.getElementById("labelField").value = calcInfo._label;
if (!calcInfo._defaultPosition)
document.getElementById("customPosition").checked = true;
//populate menus
setCalcType(false);
// fill in operands based on calculation type;
switch (operationsArray[calcInfo._oper]._type) {
case 0: //Add type
var allFound = true;
for (var i = 0; i < calcInfo._operands.length;i++) {
var found = false;
if (calcInfo._operands[i]._type == 'N') {
document.getElementById("userNumberCB").checked = true;
document.getElementById("addNum1").value = CNumUtil.localizeDecimal(calcInfo._operands[i]._code);
found = true;
} else {
for (var j = 0; j < document.getElementById("addCatSel").options.length; j++) {
if (compareCategory(catarr[document.getElementById("addCatSel").options[j].value]._code, calcInfo._operands[i]._code)) {
found = true;
document.getElementById("addCatSel").options[j].selected = true;
j = addSelect.options.length;
}
}
}
if (!found)
allFound = false;
}
if (!allFound) {
displayCommonMessage(strCalcCatsNotExist, MESSAGE_TYPE_INFO, [message_ok_button_text, message_cancel_button_text], [function() {removeMessage();}, function() {topparent.closeActionPane();}]);
}
break;
case 2: //Subtract type
var oper1 = calcInfo._operands[0];
var oper2 = calcInfo._operands[1];
var found1 = false;
var found2 = false;
if (calcInfo._oper == "g") {
// Special case: For percent growth, the operands are in reverse order.
// Like what was done in the javascript for dynamic mode, switch them around.
oper1 = calcInfo._operands[1];
oper2 = calcInfo._operands[0];
}
if (oper1._type == 'N') {
document.getElementById("subNum1").value = CNumUtil.localizeDecimal(oper1._code);
document.getElementById("rcat1").checked = false;
document.getElementById("rnum1").checked = true;
found1 = true;
} else {
for (var j = 0; j < document.getElementById("subCatSel1").options.length; j++) {
if (compareCategory(catarr[document.getElementById("subCatSel1").options[j].value]._code, oper1._code)) {
found1 = true;
document.getElementById("subCatSel1").options[j].selected = true;
j = document.getElementById("subCatSel1").options.length; //break out
}
}
}
if (oper2._type == 'N') {
document.getElementById("subNum2").value = CNumUtil.localizeDecimal(oper2._code);
document.getElementById("rcat2").checked = false;
document.getElementById("rnum2").checked = true;
found2 = true;
} else {
for (var j = 0; j < document.getElementById("subCatSel2").options.length; j++) {
if (compareCategory(catarr[document.getElementById("subCatSel2").options[j].value]._code, oper2._code)) {
found2 = true;
document.getElementById("subCatSel2").options[j].selected = true;
j = document.getElementById("subCatSel2").options.length;
}
}
}
if (!found1 || !found2) {
displayCommonMessage(strCalcCatsNotExist, MESSAGE_TYPE_INFO, [message_ok_button_text, message_cancel_button_text], [function() {removeMessage();}, function() {topparent.closeActionPane();}]);
}
break;
case 1: //Accumulate type
var found = false;
for (var j = 0; j < document.getElementById("accCatSel").options.length; j++) {
if (compareCategory(catarr[document.getElementById("accCatSel").options[j].value]._code, calcInfo._operands[0]._code)) {
found = true;
document.getElementById("accCatSel").options[j].selected = true;
j = document.getElementById("accCatSel").options.length;
}
}
if (!found) {
displayCommonMessage(strCalcCatsNotExist, MESSAGE_TYPE_INFO, [message_ok_button_text, message_cancel_button_text], [function() {removeMessage();}, function() {topparent.closeActionPane();}]);
}
break;
case 3: //rollup style
var allFound = true;
for (var i = 0; i < calcInfo._operands.length;i++) {
var found = false;
for (var j = 0; j < document.getElementById("rollCatSel").options.length; j++) {
if (compareCategory(catarr[document.getElementById("rollCatSel").options[j].value]._code,calcInfo._operands[i]._code)) {
found = true;
document.getElementById("rollCatSel").options[j].selected = true;
j = document.getElementById("rollCatSel").options.length;
}
}
if (!found)
allFound = false;
}
if (!allFound) {
displayCommonMessage(strCalcCatsNotExist, MESSAGE_TYPE_INFO, [message_ok_button_text, message_cancel_button_text], [function() {removeMessage();}, function() {topparent.closeActionPane();}]);
}
break;
case 4: //Forcast
document.getElementById("labelDiv").style.visibility = "hidden";
document.getElementById("ForMethod").value = calcInfo._operands[1]._code;
document.getElementById("ForNum").value = CNumUtil.localizeDecimal(calcInfo._operands[2]._code);
break;
case 5: //Percent Base type
popOtherAxisOptions(pctBaseBaseSelect);
var foundOper = false;
for (var j = 0; j < document.getElementById("pctBaseSel").options.length; j++) {
if (compareCategory(catarr[document.getElementById("pctBaseSel").options[j].value]._code, calcInfo._operands[0]._code)) {
foundOper = true;
document.getElementById("pctBaseSel").options[j].selected = true;
j = document.getElementById("pctBaseSel").options.length;
}
}
if (calcInfo._operands.length > 1) {
document.getElementById("pctBaseTypeBase").checked = true;
var found = !foundOper;
for (var j = 0; j < document.getElementById("pctBaseBase").options.length; j++) {
var cat = getCatFromDimIdxPair(document.getElementById("pctBaseBase").options[j].value);
if (compareCategory(cat._code, calcInfo._operands[1]._code)) {
found = true;
document.getElementById("pctBaseBase").options[j].selected = true;
j = document.getElementById("pctBaseBase").options.length;
}
}
if (!foundOper) {
displayCommonMessage(strCalcCatsNotExist, MESSAGE_TYPE_INFO, [message_ok_button_text, message_cancel_button_text], [function() {removeMessage();}, function() {topparent.closeActionPane();}]);
}
if (!found) {
displayCommonMessage(strPrcntBaseBaseNotExist, MESSAGE_TYPE_INFO, [message_ok_button_text, message_cancel_button_text], [function() {removeMessage();}, function() {topparent.closeActionPane();}]);
}
}
break;
}
}
function validateInput() {
var validChars = "/[^0-9" + decimalpt + "\-]/";
switch(getCurrentCalc()._type) {
case 0: //validate Add
if(document.getElementById("userNumberCB").checked && document.getElementById("addNum1").value == ""){
errorMsg = strProvideNumbersMsg;
return false;
}
if (!CNumUtil.validateNumField(document.getElementById("addNum1"),true, validChars )) {
errorMsg = strInvalidNumbersMsg;
return false;
}
document.getElementById("addNum1").value = CNumUtil.normalizeDecimal(document.getElementById("addNum1").value);
var ctr = numSelected(document.getElementById("addCatSel"));
var num = document.getElementById("userNumberCB").checked ? 1 : 0;
if( ctr + num < 2){
errorMsg = strSelectMoreCatMsg;
return false;
}
break;
case 2: //Validate Subtract
if(document.getElementById("rnum1").checked && document.getElementById("subNum1").value == ""){
errorMsg = strProvideNumbersMsg;
return false;
}
if(document.getElementById("rnum2").checked && document.getElementById("subNum2").value == ""){
errorMsg = strProvideNumbersMsg;
return false;
}
if (!CNumUtil.validateNumField(document.getElementById("subNum1"),true, validChars) || !CNumUtil.validateNumField(document.getElementById("subNum2"),true, validChars)) {
errorMsg = strInvalidNumbersMsg;
return false;
}
if((document.getElementById("rnum1").checked && CNumUtil.validateNumField(document.getElementById("subNum1"),true, validChars)) &&
(document.getElementById("rnum2").checked && CNumUtil.validateNumField(document.getElementById("subNum2"),true, validChars)) ){
errorMsg = strInvalidCalcMsg;
return false;
}
document.getElementById("subNum1").value = CNumUtil.normalizeDecimal(document.getElementById("subNum1").value);
document.getElementById("subNum2").value = CNumUtil.normalizeDecimal(document.getElementById("subNum2").value);
document.getElementById("rnum1").value = CNumUtil.normalizeDecimal(document.getElementById("rnum1").value);
document.getElementById("rnum2").value = CNumUtil.normalizeDecimal(document.getElementById("rnum2").value);
break;
case 3: //rollup style
if (!numSelected(document.getElementById("rollCatSel"))) {
errorMsg = strSelectMoreCatMsg;
return false;
}
break;
case 4: //Validate Forcast
if (!CNumUtil.validateNumField(document.getElementById("ForNum"),false, validChars) || document.getElementById("ForNum").value <= 0) {
errorMsg = strInvalidNumbersMsg;
return false;
}
break;
}
return true;
}
function ableFormField(event, owner,field) {
if (!owner.checked)
field.value = "";
}
function selectAll(event, box) {
var box = document.getElementById(box);
for (var i = 0; i < box.options.length; i++) {
box.options[i].selected = true;
}
var mgr = new eventManager(event);
mgr.cancelBubble();
}
function unselectAll(event, box) {
var box = document.getElementById(box);
for (var i = 0; i < box.options.length; i++) {
box.options[i].selected = false;
}
var mgr = new eventManager(event);
mgr.cancelBubble();
}
function submitPreCalcDialog() {
topparent.setGlobal("editingCalc", 0);
if(document.preCalculation.edit.checked)
topparent.setGlobal("editingCalc", 1);
else if(document.preCalculation.insert.checked)
topparent.setGlobal("editingCalc", 0);
else if(document.preCalculation.rename.checked)
topparent.setGlobal("editingCalc", 2);
else if(document.preCalculation.delete_calc.checked)
topparent.setGlobal("editingCalc", 3);
resetDialog();
}
function handleError(sError, closeActionPane){
selecteddim = null;
if (closeActionPane)
displayCommonMessage(sError, MESSAGE_TYPE_INFO, [], []);
else
displayCommonMessage(sError, MESSAGE_TYPE_INFO, [message_ok_button_text], [function() {removeMessage();}]);
}
function explainForecast(selectedOption) {
var selectedVal = selectedOption.selectedIndex;
document.getElementById("forecastExplanation").style.visibility = "visible";
switch (selectedVal) {
case 0:
document.getElementById("forecastExplanation").innerHTML = "
 | " + CEncodingUtil.HtmlEncode(strForcastExplTrend)+" |
";
break;
case 1:
document.getElementById("forecastExplanation").innerHTML = " | " + CEncodingUtil.HtmlEncode(strForcastExplGrowth)+" |
";
break;
case 2:
document.getElementById("forecastExplanation").innerHTML = " | " + CEncodingUtil.HtmlEncode(strForcastExplAutoreg)+" |
";
break;
default:
//alert("explain trend");
break;
}
return;
}
function compareCategory(code1, code2) {
if(code1.charAt(0) == 'T')
return code1 == code2;
else
return parseInt(code1) == parseInt(code2);
}