// 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. //Maintain the undo information var TYPE_XTAB_MEASURE = 1; var TYPE_ROW = 2; var TYPE_COLUMN = 3; var TYPE_NEST_ROWS = 4; var TYPE_NEST_COLS = 5; var TYPE_REORDER_ROW = 6; var TYPE_REORDER_COLUMN = 7; var TYPE_CHANGE_DIMBAR_FILTER = 9; var TYPE_NONE = 0; var NEST_BETWEEN_CATEGORY_SENSITIVITY = 3; var previousOper = TYPE_NONE; var previousLevel = -1; var selectedMeasureCell = null; var overCategoryHeader = null; function getOper(type, obj, event) { if (type == "dimbar") return TYPE_CHANGE_DIMBAR_FILTER; if (type == "d" || type == "m") return TYPE_XTAB_MEASURE; else if (type == "r" || type.indexOf("lr") >= 0) { if (isReordering(type, event, obj)) return TYPE_REORDER_ROW; else return TYPE_ROW; } else if (type == "c" || type.indexOf("lc") >= 0) { if (isReordering(type, event, obj)) return TYPE_REORDER_COLUMN; else return TYPE_COLUMN; } else if (type == "rn") return TYPE_NEST_ROWS; else if (type == "cn") return TYPE_NEST_COLS; else return TYPE_NONE; } function getLevel(type, obj, event) { var oper = getOper(type, obj, event); if (oper == TYPE_NEST_ROWS || oper == TYPE_NEST_COLS) return obj.getAttribute("level"); else if (oper == TYPE_ROW || oper == TYPE_COLUMN || oper == TYPE_REORDER_ROW || oper == TYPE_REORDER_COLUMN) if (type == "r" || type == "c") return obj.getAttribute("mylevel"); else return parseLevelNumber(type); else return -1; } function isNestLeftOfCategory(event, obj) { return (parseInt(event.clientX - getOffsetLeft(obj)) <= NEST_BETWEEN_CATEGORY_SENSITIVITY); } function isNestRightOfCategory(event, obj) { return (parseInt(getOffsetLeft(obj) + obj.offsetWidth - event.clientX) <= NEST_BETWEEN_CATEGORY_SENSITIVITY); } function isNestAboveCategory(event, obj) { return (parseInt(event.clientY - getOffsetTop(obj)) <= NEST_BETWEEN_CATEGORY_SENSITIVITY); } function isNestBelowCategory(event, obj) { return (parseInt(getOffsetTop(obj) + obj.offsetHeight - event.clientY) <= NEST_BETWEEN_CATEGORY_SENSITIVITY); } function processDragOverOrEnter(event) { if (!topparent.allFramesInitialized()) return; var eventM = new eventManager(event); eventM.cancelBubble(); if ( !isValidDragAndDropObject() ) return; var obj = bubbletoDragAndDropSensitiveObject(eventM.getSrc()); if (obj == null) return; type = obj.getAttribute("type"); //Get operation and Level var oper = getOper(type, obj, event); var level = getLevel(type, obj, event); //Check if we need to undo the previous drag drop effect if ((oper != TYPE_CHANGE_DIMBAR_FILTER) && (oper != previousOper || level != previousLevel)) { dragLeave(event, previousOper, previousLevel); if (oper == TYPE_REORDER_ROW || oper == TYPE_REORDER_COLUMN) overCategoryHeader = obj; else overCategoryHeader = null; switch (oper) { case TYPE_XTAB_MEASURE: onDragOverXtabMeasure(event); break; case TYPE_ROW: onDragOverRow(event, level); break; case TYPE_COLUMN: onDragOverColumn(event, level); break; case TYPE_NEST_ROWS: onDragOverRowNestZone(event, level); break; case TYPE_NEST_COLS: onDragOverColNestZone(event, level); break; case TYPE_REORDER_ROW: case TYPE_REORDER_COLUMN: onDragOverCategoryNestBetween(event, obj); break; } } if (eventM.theEvent.dataTransfer) processDragCursor(type, obj, event); previousOper = oper; previousLevel = level; eventM.preventDefault(); } function dragLeave(event, oper, level) { switch (oper) { case TYPE_XTAB_MEASURE: onDragLeaveXtabMeasure(); break; case TYPE_ROW: onDragLeaveRow(event, level); break; case TYPE_COLUMN: onDragLeaveColumn(event, level); break; case TYPE_NEST_ROWS: onDragLeaveRowNestZone(level); break; case TYPE_NEST_COLS: onDragLeaveColNestZone(level); break; case TYPE_REORDER_ROW: case TYPE_REORDER_COLUMN: onDragLeaveCategoryNestBetween(event); break; } } function processDragCursor(type, obj, event) { var eventM = new eventManager(event); if (getOper(type, obj, event) == TYPE_CHANGE_DIMBAR_FILTER) eventM.theEvent.dataTransfer.dropEffect = "move"; else if (getOper(type, obj, event) == TYPE_ROW || getOper(type, obj, event) == TYPE_COLUMN) eventM.theEvent.dataTransfer.dropEffect = "move"; else if (getOper(type, obj, event) == TYPE_REORDER_ROW || getOper(type, obj, event) == TYPE_REORDER_COLUMN) eventM.theEvent.dataTransfer.dropEffect = "move"; else if (getOper(type, obj, event) == TYPE_NEST_ROWS || getOper(type, obj, event) == TYPE_NEST_COLS) eventM.theEvent.dataTransfer.dropEffect = "copy"; else if (getOper(type, obj, event) == TYPE_XTAB_MEASURE && isDraggingMeasure()) eventM.theEvent.dataTransfer.dropEffect = "move"; else eventM.theEvent.dataTransfer.dropEffect = "none"; } function processDragLeave(event) { if (!topparent.allFramesInitialized()) return; var eventM = new eventManager(event); eventM.cancelBubble(); if (eventM.theEvent.clientX < document.getElementById("innerNiceMain-tab0").offsetLeft || eventM.theEvent.clientY < document.getElementById("innerNiceMain-tab0").offsetTop) { dragLeave(event, previousOper, previousLevel); previousOper = TYPE_NONE; previousLevel = -1; } eventM.preventDefault(); } function processDragEnter(event) { processDragOverOrEnter(event); } function processDragOver(event) { processDragOverOrEnter(event); } function processNestBetweenOverOrEnter(event) { var eventM = new eventManager(event); eventM.cancelBubble(); eventM.theEvent.dataTransfer.dropEffect = "move"; eventM.preventDefault(); } function processDrop(event) { if (!topparent.allFramesInitialized()) return; var eventM = new eventManager(event); eventM.cancelBubble(); if ( !isValidDragAndDropObject() ) return; var obj = bubbletoDragAndDropSensitiveObject(eventM.getSrc()); if (obj == null) { //Dump the object from the drop framework topparent.getGlobal("dndManager").cancelDrag(); return; } var oper = getOper(type, obj, event); var level = getLevel(type, obj, event); switch (oper) { case TYPE_XTAB_MEASURE: onDropMeasure(parseInt(obj.getAttribute("measureno"))); break; case TYPE_ROW: onDropRowReplace(event, obj.getAttribute("code"), level); break; case TYPE_COLUMN: onDropColumnReplace(obj.getAttribute("code"), level); break; case TYPE_NEST_ROWS: onDropRowNest(event, obj.getAttribute("code"), level, obj.getAttribute("dimIdx")); break; case TYPE_NEST_COLS: onDropColumnNest(obj.getAttribute("code"), level , obj.getAttribute("dimIdx")); break; case TYPE_REORDER_ROW: case TYPE_REORDER_COLUMN: onDropCategoryNestBetween(event, obj); break; case TYPE_CHANGE_DIMBAR_FILTER: onDropMeasuresOnDimbar(event); break; } topparent.getGlobal("dndManager").cancelDrag(); eventM.preventDefault(); } function processNestBetweenDrop(event) { var eventM = new eventManager(event); eventM.cancelBubble(); if (overCategoryHeader != null) { onDropCategoryNestBetween(eventM.theEvent, overCategoryHeader); } topparent.getGlobal("dndManager").cancelDrag(); onDragLeaveCategoryNestBetween(eventM.theEvent); eventM.preventDefault(); } function bubbletoDragAndDropSensitiveObject( obj ) { var target = obj; if (!obj) return null; if (!obj.getAttribute || !obj.getAttribute("type") || obj.getAttribute("type") == "") target = bubbletoDragAndDropSensitiveObject( obj.parentNode ); return target; } function isValidDragAndDropObject() { var retValue = true; var text = topparent.getGlobal("dndManager").getData(); if (!text) retValue = false; return retValue; } function onDragOverCategoryNestBetween(event, obj) { showXtabDragNestBetweenDiv(event, obj); } function onDragLeaveCategoryNestBetween(event) { hideXtabDragNestBetweenDiv(); } function onDropCategoryNestBetween(event, obj) { var dndManager = topparent.getGlobal("dndManager"); var catInfo = new DragInfo (dndManager.getData()); var RC = obj.getAttribute("type") == "r"? "R" : "C"; var cmd = ""; if (obj.getAttribute("parent_code")) { //We want to drill up on the summary, //hide all categories but the target category and source category, //and then reorder the categories accordingly. var level = parseInt(obj.getAttribute("mylevel")); cmd += "DG:" + RC + level + "\t" + constructOperandId(obj.getAttribute("parent_id"),obj.getAttribute("dimIdx"),obj.getAttribute("parent_code")); cmd += "\t\tMS:1\t" + RC + level + "\t" + constructOperandId(catInfo['ppds_id'],obj.getAttribute("dimIdx"),catInfo['code']) + "\t" + constructOperandId(obj.getAttribute("ppdsId"),obj.getAttribute("dimIdx"),obj.getAttribute("code")); if (level) cmd += "\t\tES:" + RC + level; else cmd += "\t\tET:" + RC + "0"; } else { //Show the dragged category in case it is hidden cmd += "MS:0\t" + constructOperandId(catInfo['ppds_id'],catInfo['dim'],catInfo['code']); } cmd += "\t\t" + constructReorderCategoryCommand(catInfo['ppds_id'], catInfo['code'], obj); doit (cmd); } function onDropMeasuresOnDimbar(event) { var dndManager = topparent.getGlobal("dndManager"); var catInfo = new DragInfo (dndManager.getData()); var cmd = "DC:" + catInfo['ppds_id'] + "," + catInfo['dim'] + "," + catInfo['code']; doit (cmd); } function onDragOverRowNestZone(event, level) { var eventM = new eventManager(event); var id; id = "rowNest" + level; var tags = document.getElementsByName(id); for (var i=0; i < tags.length; i++) { if (tags[i].parentNode.className.indexOf(" nest-area") >= 0) return; //no point in processing, it's already selected... else { tags[i].parentNode.className += " nest-area"; } } } function onDragOverColNestZone(event, level) { var eventM = new eventManager(event); var id; id = "columnNest" + level; var tags = document.getElementsByName(id); for (var i=0; i < tags.length; i++) { if (tags[i].parentNode.className.indexOf(" nest-area") >= 0) return; //no point in processing, it's already selected... else { tags[i].parentNode.className += " nest-area"; } } } function onDragLeaveRowNestZone(level) { var id; id = "rowNest" + level; var tags = document.getElementsByName(id); for (var i=0; i < tags.length; i++) { if (tags[i].parentNode.className.indexOf(" nest-area") >= 0) tags[i].parentNode.className = tags[i].parentNode.className.replace(RegExp(" nest-area", "g"), ""); else return; } } function onDragLeaveColNestZone(level) { var id; id = "columnNest" + level; var tags = document.getElementsByName(id); for (var i=0; i < tags.length; i++) { if (tags[i].parentNode.className.indexOf(" nest-area") >= 0) tags[i].parentNode.className = tags[i].parentNode.className.replace(RegExp(" nest-area", "g"), ""); else return; } } function onDropColumnReplace(code, level) { doColumnReplaceCommand (code, level); } function onDropColumnNest(code, level, dimIdx) { doColumnNestCommand (code, level, dimIdx); } function onDragOverColumn(event, level) { var obj = document.getElementById("lc" + level); deselectAllXtab(event); selectLevel(event, obj, true); } function onDragLeaveColumn(event,level) { var obj = document.getElementById("lc" + level); selectLevel(event, obj, false ); } function onDropRowReplace(event, code, level ) { var eventM = new eventManager(event); doRowReplaceCommand (code, level); eventM.cancelBubble(); } function onDropRowNest(event, code, level, dimIdx) { var eventM = new eventManager(event); doRowNestCommand (code, level, dimIdx); eventM.cancelBubble(); } function onDragOverRow(event,level) { var obj = document.getElementById("lr" + level); deselectAllXtab(event); selectLevel(event, obj, true ); } function onDragLeaveRow(event, level) { var obj = document.getElementById("lr" + level); selectLevel(event, obj, false ); } function onDropMeasure(measureNo) { if ( !isDraggingMeasure() ) return; doReplaceMeasureCommand(measureNo); } function onDragOverXtabMeasure(event) { if ( isDraggingMeasure() ) { var eventM = new eventManager(event); var obj = bubbletoDragAndDropSensitiveObject(eventM.getSrc()); if (obj && obj.getAttribute("type") == "m") obj.className += " measure-drag-over"; selectedMeasureCell = obj; } } function onDragLeaveXtabMeasure() { if (selectedMeasureCell) { var name = selectedMeasureCell.className; name = name.replace(RegExp(" measure-drag-over", "g"), ""); selectedMeasureCell.className = name; selectedMeasureCell = null; } } function hideErrorDialog() { el = document.getElementById('testDivError'); el.parentElement.removeChild(el); } function isDraggingMeasure() { var dndManager = topparent.getGlobal("dndManager"); var catInfo = new DragInfo (dndManager.getData()); var dim = parseInt(catInfo['dim']); var sCmd = "gDimensionInfo[" + dim + "]"; var dimInfo = topparent.getGlobal(sCmd); if (dimInfo.isMeasureDimension) return true; return false; } function getParentOfDraggedCategory() { //Since we are draggin from the tree, we have to get the parent from the tree. var dndManager = topparent.getGlobal("dndManager"); var catInfo = new DragInfo (dndManager.getData()); return catInfo['parentId']; } function getDraggedCategory() { var dndManager = topparent.getGlobal("dndManager"); var catInfo = new DragInfo (dndManager.getData()); var dim = parseInt(catInfo['dim']); var code = catInfo['code']; return dimCache.getCategory(dim,code); } function getIdofDraggedCategory() { var dndManager = topparent.getGlobal("dndManager"); var catInfo = new DragInfo(dndManager.getData()); return catInfo['ppds_id']; } function isReordering(type, event, obj) { if (!event || !type || !obj) return false; if (parseInt(obj.getAttribute("ppdsId")) == parseInt(getIdofDraggedCategory())) return false; if (obj.getAttribute("summary") && !topparent.getGlobal("gDimensionInfo[" + obj.getAttribute("dimIdx") + "]").isMeasureDimension) return false; if (parseInt(obj.getAttribute("parent_id")) != parseInt(getParentOfDraggedCategory())) return false; if (topparent.getGlobal("gDimensionInfo[" + obj.getAttribute("dimIdx") + "]").isTimeDimension) return false; if (type == "r") { if (isNestAboveCategory(event, obj) || isNestBelowCategory(event, obj)) return true; } else if (type == "c") { if (isNestLeftOfCategory(event, obj) || isNestRightOfCategory(event, obj)) return true; } return false; } function DimensionInfo (isTime, isMeasure) { this.isTimeDimension = isTime; this.isMeasureDimension = isMeasure; }