dndXtab.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. // Licensed Materials - Property of IBM
  2. //
  3. // IBM Cognos Products: pps
  4. //
  5. // (C) Copyright IBM Corp. 2005, 2017
  6. //
  7. // US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  8. var CHART_TYPE_PIE = 1;
  9. var CHART_TYPE_CORRELATION = 12;
  10. //Xtab components
  11. var XTABOBJ_TYPE_NOTHING = 0;
  12. var XTABOBJ_TYPE_LEVEL_SELECTOR = 1;
  13. var XTABOBJ_TYPE_NEST_ZONE = 2;
  14. var XTABOBJ_TYPE_CAT_HEADER = 3;
  15. var XTABOBJ_TYPE_CAT_HEADER_MEASURE = 4;
  16. var XTABOBJ_TYPE_MEASURE_CELL = 6;
  17. var XTABOBJ_TYPE_DATA_CELL = 7;
  18. var XTABOBJ_TYPE_FORCE_CANT_DROP = 8;
  19. var xtabDragCursor = null;
  20. var xtabDragCursorOffsetTop = 17;
  21. var xtabDragCursorOffsetLeft = 1;
  22. var xtabCursorIMGHeight = 20;
  23. var xtabCursorIMGWidth = 20;
  24. var xtabDragCursorArray = null;
  25. var XTAB_DRAG_DELAY_COUNT = 3;
  26. var XTAB_NO_DRAG = -1;
  27. var isXtabDragging = XTAB_NO_DRAG;
  28. var dragObj = null;
  29. //Ugly but necessary to improve browser performance
  30. var XTAB_DRAG_SELECTION_CHANGE_COUNT = 2;
  31. var xtabDragPreviousSelection = null;
  32. var xtabDragSelectionChangeCounter = XTAB_NO_DRAG;
  33. var xtabNestBetweenDiv;
  34. var XTAB_NEST_DIV_THICKNESS = 5;
  35. var XTAB_NEST_BETWEEN_NONE = 0;
  36. var XTAB_NEST_BETWEEN_BEFORE = 1;
  37. var XTAB_NEST_BETWEEN_AFTER = 2;
  38. var xtabNestBetweenLoc = XTAB_NEST_BETWEEN_NONE;
  39. var xtabDivOverObj = null;
  40. function onXtabDragStart(event)
  41. {
  42. if (!topparent.allFramesInitialized())
  43. return;
  44. if (PP_ContextPopUpcss)
  45. PP_ContextPopUpcss.style.visibility = "hidden";
  46. var eventM = new eventManager(event);
  47. obj = bubbletoXtabDragAndDropSensitiveObject(eventM.getSrc());
  48. if (!obj)
  49. return false;
  50. var objType = getXtabObjType(obj);
  51. //We can't drag a nest zone, so bubble top the parent cell
  52. if (objType == XTABOBJ_TYPE_NEST_ZONE)
  53. obj = bubbletoXtabDragAndDropSensitiveObject(obj.parentNode);
  54. if (objType != XTABOBJ_TYPE_MEASURE_CELL &&
  55. objType != XTABOBJ_TYPE_DATA_CELL &&
  56. objType != XTABOBJ_TYPE_NOTHING &&
  57. objType != XTABOBJ_TYPE_FORCE_CANT_DROP) {
  58. eventM.cancelBubble();
  59. isXtabDragging = XTAB_DRAG_DELAY_COUNT;
  60. dragObj = obj;
  61. document.body.onmousemove = onXtabDragMove;
  62. document.body.onmouseover = onXtabDragEnter;
  63. document.body.onmouseout = onXtabDragLeave;
  64. }
  65. }
  66. function doDragStart(event, obj) {
  67. topparent.getGlobal("dndManager").setXtabElementDrag(obj);
  68. var target = bubbletoXtabDragAndDropSensitiveObject(obj);
  69. displayDragCursor(event, target);
  70. moveDragCursor(event);
  71. setDragCursor(event, target);
  72. onXtabDragEnter(event, obj);
  73. }
  74. function onXtabDragDrop(event)
  75. {
  76. if (!topparent.allFramesInitialized())
  77. return;
  78. isXtabDragging = XTAB_NO_DRAG;
  79. document.body.onmousemove = null;
  80. document.body.onmouseover = null;
  81. document.body.onmouseout = null;
  82. onXtabDragLeave(event);
  83. if (topparent.getGlobal("dndManager").isXtabElementDragging) {
  84. var eventM = new eventManager(event);
  85. eventM.cancelBubble();
  86. var source = topparent.getGlobal("dndManager").getData();
  87. var sourceType = getXtabObjType(source);
  88. topparent.getGlobal("dndManager").cancelDrag();
  89. hideDragCursor();
  90. var target = eventM.getSrc();
  91. if (eventM.getSrc().id == "xtabNestBetweenHeadersDiv") {
  92. makeReorderCategoryCommand(source, xtabDivOverObj);
  93. return true;
  94. }
  95. target = bubbletoXtabDragAndDropSensitiveObject(eventM.getSrc());
  96. if (!source || !canDrop(source, target))
  97. return false;
  98. var targetType = getXtabObjType(target);
  99. var sourceType = getXtabObjType(source);
  100. var ctrlPressed = (topparent.getGlobal("MacGecko"))? eventM.theEvent.altKey : eventM.theEvent.ctrlKey;
  101. //Drag and drop behavior
  102. if (isValidCategoryReordering(source, target)) {
  103. makeReorderCategoryCommand(source, target);
  104. } else if (targetType == XTABOBJ_TYPE_LEVEL_SELECTOR ||
  105. targetType == XTABOBJ_TYPE_CAT_HEADER ||
  106. targetType == XTABOBJ_TYPE_CAT_HEADER_MEASURE) {
  107. if (!ctrlPressed)
  108. swapLevels(source, target);
  109. else
  110. replaceLevel(source, target);
  111. } else if (targetType == XTABOBJ_TYPE_NEST_ZONE) {
  112. if (!ctrlPressed)
  113. moveLevelasNest(source, target);
  114. else
  115. moveCopyOfLevelasNest(source, target);
  116. } else if (targetType == XTABOBJ_TYPE_NOTHING) {
  117. if (sourceType == XTABOBJ_TYPE_LEVEL_SELECTOR)
  118. deleteXtabLevel(source);
  119. }
  120. }
  121. }
  122. function canDrop(source, target) {
  123. var targetType = getXtabObjType(target);
  124. var sourceType = getXtabObjType(source);
  125. if (targetType == XTABOBJ_TYPE_FORCE_CANT_DROP)
  126. return false;
  127. if (targetType == XTABOBJ_TYPE_DATA_CELL ||
  128. targetType == XTABOBJ_TYPE_MEASURE_CELL)
  129. return false;
  130. if (targetType != XTABOBJ_TYPE_NOTHING) {
  131. sourceLevel = getLevelSelector(source);
  132. targetLevel = getLevelSelector(target);
  133. if (sourceLevel == targetLevel && targetType != XTABOBJ_TYPE_NEST_ZONE &&
  134. !isValidCategoryReordering(source, target))
  135. return false;
  136. } else {
  137. if (sourceType == XTABOBJ_TYPE_LEVEL_SELECTOR) {
  138. source = getLevelSelector(source);
  139. var totalLevels = numRowLevels;
  140. if (source.id.charAt(1) == "c")
  141. totalLevels = numColLevels;
  142. if (totalLevels == 1)
  143. return false;
  144. } else
  145. return false;
  146. }
  147. return true;
  148. }
  149. //Required for highlighting
  150. function onXtabDragEnter(event) {
  151. if (topparent.getGlobal("dndManager").isXtabElementDragging) {
  152. var eventM = new eventManager(event);
  153. eventM.cancelBubble();
  154. if (xtabDragSelectionChangeCounter == XTAB_NO_DRAG)
  155. xtabDragSelectionChangeCounter = XTAB_DRAG_SELECTION_CHANGE_COUNT;
  156. setDragCursor(event, bubbletoXtabDragAndDropSensitiveObject(eventM.getSrc()));
  157. if (xtabDragCursor.src == xtabDragCursorArray[2].src) //Most efficient way to check
  158. hideXtabDragNestBetweenDiv();
  159. }
  160. return false;
  161. }
  162. function onXtabDragLeave(event) {
  163. if (topparent.getGlobal("dndManager").isXtabElementDragging) {
  164. var eventM = new eventManager(event);
  165. eventM.cancelBubble();
  166. if (eventM.theEvent.clientX < 0 || eventM.theEvent.clientY < 0)
  167. hideDragCursor();
  168. if (xtabDragSelectionChangeCounter == XTAB_NO_DRAG)
  169. xtabDragSelectionChangeCounter = XTAB_DRAG_SELECTION_CHANGE_COUNT;
  170. xtabDragCursor.src = xtabDragCursorArray[0].src;
  171. }
  172. return false;
  173. }
  174. function isSameSelection(oldObj, newObj) {
  175. if (!oldObj)
  176. return false;
  177. else if (getXtabObjType(oldObj) != getXtabObjType(newObj))
  178. return false;
  179. else if (isValidCategoryReordering(topparent.getGlobal("dndManager").getData(),newObj))
  180. return false;
  181. else
  182. return (getLevelSelector(oldObj).id == getLevelSelector(newObj).id)
  183. }
  184. function isValidCategoryReordering(source, target) {
  185. var dType = 0;
  186. var sourceType = getXtabObjType(source);
  187. var targetType = getXtabObjType(target);
  188. fh = topparent.getXtabFrame().document.fhidden;
  189. if (fh)
  190. {
  191. if (fh.Y)
  192. dType = fh.Y.value;
  193. if (fh.YS)
  194. dType = fh.YS.value;
  195. if (dType == CHART_TYPE_PIE || dType == CHART_TYPE_CORRELATION)
  196. return false;
  197. }
  198. if (source == target)
  199. return false;
  200. if ((sourceType != XTABOBJ_TYPE_CAT_HEADER_MEASURE && sourceType != XTABOBJ_TYPE_CAT_HEADER) ||
  201. (targetType != XTABOBJ_TYPE_CAT_HEADER_MEASURE && targetType != XTABOBJ_TYPE_CAT_HEADER))
  202. return false;
  203. if (source.getAttribute("calculation") != null) {
  204. //Calculation, so simply ensure we are not dropping on a non-moved calculation, and
  205. //we are dropping in the same dimension. And this isn't a forecast.
  206. if (source.getAttribute("calculation_moved") != "true")
  207. return false;
  208. if (source.getAttribute("forecast") == "true")
  209. return false;
  210. if (target.getAttribute("calculation") != null && target.getAttribute("calculation_moved") != "true")
  211. return false;
  212. if (source.getAttribute("dimIdx") != target.getAttribute("dimIdx"))
  213. return false;
  214. if (target.getAttribute("summary"))
  215. return false;
  216. } else {
  217. if (topparent.getGlobal("gDimensionInfo[" + source.getAttribute("dimIdx") + "]").isTimeDimension)
  218. return false;
  219. if (target.getAttribute("calculation") != null) {
  220. if (target.getAttribute("calculation_moved") != "true")
  221. return false;
  222. }
  223. if (source.getAttribute("parent_id") != target.getAttribute("parent_id"))
  224. return false;
  225. if (getLevelSelector(source) != getLevelSelector(target))
  226. return false;
  227. if (target.getAttribute("summary"))
  228. return false;
  229. if (getLevelSelector(source).id.charAt(2) == '0') //top level so return true
  230. return true;
  231. var sourceParent = xtabCache.getRowColHeaderParent(parseRowId(source.id),parseColId(source.id));
  232. var targetParent = xtabCache.getRowColHeaderParent(parseRowId(target.id),parseColId(target.id));
  233. if (!sourceParent || !targetParent || sourceParent != targetParent)
  234. return false;
  235. }
  236. return true;
  237. }
  238. function onXtabDragMove(event) {
  239. if (typeof event == "undefined")
  240. event = window.event;
  241. var eventM = new eventManager(event);
  242. eventM.cancelBubble();
  243. if (topparent.getGlobal("nn7")) {
  244. var selection = window.getSelection();
  245. if (selection && selection.toString().length)
  246. selection.removeAllRanges();
  247. }
  248. if (isXtabDragging != XTAB_NO_DRAG) {
  249. if (isXtabDragging)
  250. isXtabDragging--;
  251. else {
  252. if (!topparent.getGlobal("dndManager").isXtabElementDragging) {
  253. doDragStart(event, dragObj);
  254. }
  255. moveDragCursor(event);
  256. if (xtabDragSelectionChangeCounter != XTAB_NO_DRAG) {
  257. var src = bubbletoXtabDragAndDropSensitiveObject(eventM.getSrc());
  258. if (xtabDragSelectionChangeCounter) {
  259. if (isSameSelection(xtabDragPreviousSelection,src)) //If we return to the same selection, stop the countdown
  260. xtabDragSelectionChangeCounter = XTAB_NO_DRAG;
  261. else
  262. xtabDragSelectionChangeCounter--;
  263. } else {
  264. if (!isSameSelection(xtabDragPreviousSelection,src)) {
  265. XtabDragSelection(event, xtabDragPreviousSelection, false);
  266. XtabDragSelection(event, src, true);
  267. xtabDragSelectionChangeCounter = XTAB_NO_DRAG;
  268. }
  269. }
  270. }
  271. }
  272. }
  273. return false;
  274. }
  275. function XtabDragSelection(event, obj, selecting) {
  276. var source = topparent.getGlobal("dndManager").getData();
  277. if (!obj || !canDrop(source, obj)) {
  278. if (selecting)
  279. xtabDragPreviousSelection = null;
  280. return false;
  281. }
  282. hideXtabDragNestBetweenDiv();
  283. var objType = getXtabObjType(obj);
  284. var source = topparent.getGlobal("dndManager").getData();
  285. if (objType != XTABOBJ_TYPE_NOTHING &&
  286. objType != XTABOBJ_TYPE_MEASURE_CELL &&
  287. objType != XTABOBJ_TYPE_DATA_CELL) {
  288. var level = getLevel(obj.getAttribute("type"),obj);
  289. if ((objType == XTABOBJ_TYPE_CAT_HEADER || objType == XTABOBJ_TYPE_CAT_HEADER_MEASURE) &&
  290. (getXtabObjType(source) == XTABOBJ_TYPE_CAT_HEADER || getXtabObjType(source) == XTABOBJ_TYPE_CAT_HEADER_MEASURE) &&
  291. isValidCategoryReordering(source, obj)) {
  292. if (selecting)
  293. showXtabDragNestBetweenDiv(event, obj);
  294. } else if (objType == XTABOBJ_TYPE_LEVEL_SELECTOR ||
  295. objType == XTABOBJ_TYPE_CAT_HEADER ||
  296. objType == XTABOBJ_TYPE_CAT_HEADER_MEASURE) {
  297. deselectAllXtab(event);
  298. var rc = obj.getAttribute("type");
  299. if (objType == XTABOBJ_TYPE_LEVEL_SELECTOR)
  300. rc = obj.getAttribute("type").charAt(1);
  301. xtabCache.dragOverLevel(rc,level,selecting);
  302. } else if (objType == XTABOBJ_TYPE_NEST_ZONE) {
  303. deselectAllXtab(event);
  304. if (selecting) {
  305. if (obj.getAttribute("type").charAt(0) == "r")
  306. onDragOverRowNestZone(null, level);
  307. else
  308. onDragOverColNestZone(null, level);
  309. } else {
  310. if (obj.getAttribute("type").charAt(0) == "r")
  311. onDragLeaveRowNestZone(level);
  312. else
  313. onDragLeaveColNestZone(level)
  314. }
  315. }
  316. if (selecting)
  317. xtabDragPreviousSelection = obj;
  318. } else if (selecting) {
  319. xtabDragPreviousSelection = null;
  320. }
  321. }
  322. function bubbletoXtabDragAndDropSensitiveObject(obj)
  323. {
  324. var target = obj;
  325. if (!obj)
  326. return null;
  327. try {
  328. if ((!obj.getAttribute || !obj.getAttribute("type") || obj.getAttribute("type") == "") && obj.id != "xtab" && obj.tagName != "AREA")
  329. target = bubbletoDragAndDropSensitiveObject( obj.parentNode );
  330. } catch (err) {}
  331. return target;
  332. }
  333. function getXtabObjType(obj)
  334. {
  335. if (!obj || !obj.getAttribute)
  336. return XTABOBJ_TYPE_NOTHING;
  337. if (obj.id == "xtab")
  338. return XTABOBJ_TYPE_FORCE_CANT_DROP;
  339. var type = obj.getAttribute("type");
  340. if (type == "d" || obj.tagName == "AREA")
  341. return XTABOBJ_TYPE_DATA_CELL;
  342. else if (type == "r" || type == "c") {
  343. if (obj.getAttribute && obj.getAttribute("dimIdx") && topparent.getGlobal("gDimensionInfo[" + obj.getAttribute("dimIdx") + "]").isMeasureDimension)
  344. return XTABOBJ_TYPE_CAT_HEADER_MEASURE;
  345. else {
  346. return XTABOBJ_TYPE_CAT_HEADER;
  347. }
  348. } else if (type == "rn" || type == "cn")
  349. return XTABOBJ_TYPE_NEST_ZONE;
  350. else if (type == "m")
  351. return XTABOBJ_TYPE_MEASURE_CELL;
  352. else if (type.indexOf("lr") >= 0 || type.indexOf("lc") >= 0)
  353. return XTABOBJ_TYPE_LEVEL_SELECTOR;
  354. else
  355. return XTABOBJ_TYPE_NOTHING;
  356. }
  357. function displayDragCursor(event, obj) {
  358. var eventM = new eventManager(event);
  359. eventM.cancelBubble();
  360. xtabDragCursor.style.height = xtabCursorIMGHeight;
  361. xtabDragCursor.style.width = xtabCursorIMGWidth;
  362. xtabDragCursor.style.visibility = "visible";
  363. xtabDragCursorDisplayed = true;
  364. }
  365. function setDragCursor(event, obj) {
  366. if (xtabDragCursor.style.visibility == "hidden") {
  367. displayDragCursor(event, obj);
  368. }
  369. var target = obj;
  370. var source = topparent.getGlobal("dndManager").getData();
  371. var targetType = getXtabObjType(target);
  372. var sourceType = getXtabObjType(source);
  373. var eventM = new eventManager(event);
  374. var ctrlPressed = (topparent.getGlobal("MacGecko"))? eventM.theEvent.altKey : eventM.theEvent.ctrlKey;
  375. if (!canDrop(source, target)) {
  376. xtabDragCursor.src = xtabDragCursorArray[2].src;
  377. } else if (targetType == XTABOBJ_TYPE_NEST_ZONE || (ctrlPressed && targetType != XTABOBJ_TYPE_NOTHING))
  378. xtabDragCursor.src = xtabDragCursorArray[1].src;
  379. else
  380. xtabDragCursor.src = xtabDragCursorArray[0].src;
  381. }
  382. function hideDragCursor() {
  383. xtabDragCursor.style.visibility = "hidden";
  384. xtabDragCursor.style.height = 0;
  385. xtabDragCursor.style.width = 0;
  386. xtabDragCursor.style.top = 0;
  387. xtabDragCursor.style.left = 0;
  388. xtabDragCursorDisplayed = false;
  389. }
  390. function moveDragCursor(event) {
  391. var eventM = new eventManager(event);
  392. eventM.cancelBubble();
  393. xtabDragCursor.style.top = eventM.theEvent.clientY + xtabDragCursorOffsetTop;
  394. xtabDragCursor.style.left = eventM.theEvent.clientX + xtabDragCursorOffsetLeft;
  395. }
  396. function InitDragCursor() {
  397. xtabDragCursorArray = new Array();
  398. xtabDragCursorArray[0] = new Image();
  399. xtabDragCursorArray[0].src = topparent.getGlobal("imgPath") + "dragmovecursor.gif";
  400. xtabDragCursorArray[1] = new Image();
  401. xtabDragCursorArray[1].src = topparent.getGlobal("imgPath") + "draginsertcursor.gif";
  402. xtabDragCursorArray[2] = new Image();
  403. xtabDragCursorArray[2].src = topparent.getGlobal("imgPath") + "dragnocursor.gif";
  404. xtabDragCursor = document.getElementById("xtabdragcursor");
  405. xtabNestBetweenDiv = document.getElementById("xtabNestBetweenHeadersDiv");
  406. }
  407. function deleteXtabLevel(obj) {
  408. var rc = (obj.getAttribute("type").charAt(1) == "r")? "R" : "C";
  409. var totalLevels = numRowLevels;
  410. if (rc == "C")
  411. totalLevels = numColLevels;
  412. if (totalLevels > 1)
  413. doit(makeDeleteLevelCommand(rc, getLevel(obj.getAttribute("type",obj))));
  414. }
  415. function swapLevels(source, target) {
  416. source = getLevelSelector(source);
  417. target = getLevelSelector(target);
  418. var targetRC = (target.getAttribute("type").charAt(1) == "r")? "R" : "C";
  419. var sourceRC = (source.getAttribute("type").charAt(1) == "r")? "R" : "C";
  420. var targetLevel = getLevel(target.getAttribute("type"),target);
  421. var sourceLevel = getLevel(source.getAttribute("type"),source);
  422. if ((targetRC == sourceRC) && (targetLevel == sourceLevel))
  423. return false;
  424. var com = makeReplaceLevelCommand(targetRC, targetLevel, source.getAttribute("dimIdx"),getLastItemStr(source.getAttribute("ppdsId")),getLastItemStr(source.getAttribute("code")));
  425. //Drill the level down as far as is needed
  426. for (var i = 1; i < source.getAttribute("groupLevel"); i++) {
  427. com += "\t\t" + makeDrillDownCommand(targetRC, targetLevel);
  428. }
  429. if (source.getAttribute("summaries_hidden")) {
  430. com += "\t\t" + makeHideSummariesCommand(targetRC, targetLevel);
  431. }
  432. com += "\t\t" + makeReplaceLevelCommand(sourceRC, sourceLevel, target.getAttribute("dimIdx"),getLastItemStr(target.getAttribute("ppdsId")),getLastItemStr(target.getAttribute("code")));
  433. //Drill the level down as far as is needed
  434. for (var i = 1; i < target.getAttribute("groupLevel"); i++) {
  435. com += "\t\t" + makeDrillDownCommand(sourceRC, sourceLevel);
  436. }
  437. if (target.getAttribute("summaries_hidden")) {
  438. com += "\t\t" + makeHideSummariesCommand(sourceRC, sourceLevel);
  439. }
  440. doit(com);
  441. }
  442. function replaceLevel(source, target) {
  443. //replaces the source with the target level
  444. source = getLevelSelector(source);
  445. targetLevel = getLevel(target.getAttribute("type"),target);
  446. var rc = target.getAttribute("type").charAt(0);
  447. if (rc == "l")
  448. rc =target.getAttribute("type").charAt(1);
  449. rc = (rc == "r")? "R" : "C";
  450. var com = makeReplaceLevelCommand(rc, targetLevel, source.getAttribute("dimIdx"),getLastItemStr(source.getAttribute("ppdsId")),getLastItemStr(source.getAttribute("code")));
  451. //Drill the level down as far as is needed
  452. for (var i = 1; i < source.getAttribute("groupLevel"); i++) {
  453. com += "\t\t" + makeDrillDownCommand(rc, targetLevel);
  454. }
  455. if (source.getAttribute("summaries_hidden")) {
  456. com += "\t\t" + makeHideSummariesCommand(rc, targetLevel);
  457. }
  458. doit(com);
  459. }
  460. function moveLevelasNest(source, target) {
  461. var targetLevel = getLevel(target.getAttribute("type"),target);
  462. source = getLevelSelector(source);
  463. target = getLevelSelector(target);
  464. var sourceLevel = getLevel(source.getAttribute("type"),source);
  465. var targetRC = (target.getAttribute("type").charAt(1) == "r")? "R" : "C";
  466. var cmd = makeLevelNestCommand(targetRC,targetLevel,source.getAttribute("groupLevel"),source.getAttribute("dimIdx"));
  467. if (source.getAttribute("summaries_hidden")) {
  468. cmd += "\t\t" + makeHideSummariesCommand(targetRC, parseInt(targetLevel) + 1);
  469. }
  470. sourceRC = (source.getAttribute("type").charAt(1) == "r")? "R" : "C";
  471. var totalLevels = numRowLevels;
  472. if (sourceRC == "C")
  473. totalLevels = numColLevels;
  474. //Make the delete command
  475. if (!((totalLevels == 1) || (targetRC == sourceRC && (targetLevel == sourceLevel || targetLevel == sourceLevel - 1)))) {
  476. var sLevel = sourceLevel;
  477. if (targetRC == sourceRC && targetLevel < sourceLevel)
  478. sLevel++;
  479. cmd += "\t\t" + makeDeleteLevelCommand(sourceRC, sLevel);
  480. }
  481. doit(cmd);
  482. }
  483. function moveCopyOfLevelasNest(source, target) {
  484. var targetLevel = getLevel(target.getAttribute("type"),target);
  485. source = getLevelSelector(source);
  486. target = getLevelSelector(target);
  487. var targetRC= (target.getAttribute("type").charAt(1) == "r")? "R" : "C";
  488. var sourceRC= (source.getAttribute("type").charAt(1) == "r")? "R" : "C";
  489. var sourceLevel = getLevel(source.getAttribute("type"),source);
  490. var cmd = makeLevelNestCommand(targetRC,targetLevel,source.getAttribute("groupLevel"),source.getAttribute("dimIdx"));
  491. if (source.getAttribute("summaries_hidden")) {
  492. cmd += "\t\t" + makeHideSummariesCommand(targetRC, parseInt(targetLevel) + 1);
  493. }
  494. doit(cmd);
  495. }
  496. function measureCat(category) {
  497. this.ppdsId = category.substr(0,category.indexOf(','));
  498. this.code = category.substr(category.indexOf(',') + 1);
  499. }
  500. function makeReorderCategoryCommand(source, target) {
  501. if (source.getAttribute("calculation") != null &&
  502. target.getAttribute("beginning_of_axis") != null &&
  503. (xtabNestBetweenLoc == XTAB_NEST_BETWEEN_BEFORE))
  504. doit(constructDockCategoryCommand(source.getAttribute("ppdsId"), source.getAttribute("code"), target));
  505. else
  506. doit(constructReorderCategoryCommand(source.getAttribute("ppdsId"), source.getAttribute("code"), target));
  507. }
  508. function getSortedSelection() {
  509. //Assumes all selection in the same level, of the same axis.
  510. var selections = getSelected("r");
  511. if (!selections.length) {
  512. selections = getSelected("c");
  513. }
  514. return sortSelections(selections);
  515. }
  516. function sortSelections(selections) {
  517. var sortedSelections = new Array();
  518. var idx;
  519. for (var i = 0; i < selections.length; i++) {
  520. idx = 0;
  521. while (idx < sortedSelections.length && getAxisPos(selections[i]) > getAxisPos(sortedSelections[idx]))
  522. idx++;
  523. //insert this selection at this position.
  524. sortedSelections.splice(idx,0,selections[i]);
  525. }
  526. return sortedSelections;
  527. }
  528. function getAxisPos(item) {
  529. var axisPositions = item.id.split('-');
  530. if (item.getAttribute("type") == "r")
  531. return parseInt(axisPositions[0]);
  532. else
  533. return parseInt(axisPositions[1]);
  534. }
  535. function constructReorderCategoryCommand(sourceId, sourceCode, target) {
  536. var command = "MR:";
  537. command += (xtabNestBetweenLoc == XTAB_NEST_BETWEEN_BEFORE)? "0" : "1";
  538. command += "\t" + '"' + target.getAttribute("parent_id") + '"';
  539. command += "\t" + constructOperandId(sourceId,target.getAttribute("dimIdx"),sourceCode);
  540. command += "\t" + constructOperandId(target.getAttribute("ppdsId"),target.getAttribute("dimIdx"),target.getAttribute("code"));
  541. return command;
  542. }
  543. function constructDockCategoryCommand(sourceId, sourceCode, target) {
  544. //To dock a calculation move it under parent 0
  545. var command = "MR:";
  546. command += '1\t"0"';
  547. command += "\t" + constructOperandId(sourceId,target.getAttribute("dimIdx"),sourceCode);
  548. return command;
  549. }
  550. function constructOperandId(id,dimIdx,code) {
  551. var str = id;
  552. if (id.charAt(0) != 'T') {
  553. if(dimIdx >= 0)
  554. str += ',' + dimIdx;
  555. if(code)
  556. str += ',' + code;
  557. }
  558. return str;
  559. }
  560. function getLastItemStr(str) {
  561. var codeSep = topparent.getGlobal("codeSeparator");
  562. if (str.indexOf(codeSep)) {
  563. var subs = str.split(codeSep);
  564. return subs[subs.length - 1];
  565. } else {
  566. return str;
  567. }
  568. }
  569. function getLevelSelector(obj) {
  570. if (obj.getAttribute("type").charAt(0) != "l") {
  571. var level = getLevel(obj.getAttribute("type"),obj);
  572. if (level == -1)
  573. level = 0;
  574. obj = document.getElementById("l" + obj.getAttribute("type").charAt(0) + level);
  575. }
  576. return obj;
  577. }
  578. function makeDeleteLevelCommand(rc, level) {
  579. return "EK:" + rc + level;
  580. }
  581. function makeReplaceLevelCommand(rc, level, dimIdx, ppdsId, code) {
  582. return "ER:" + rc + level + "\tD" + dimIdx + "\t" + ppdsId + "," + dimIdx + ";" + code;
  583. }
  584. function makeLevelNestCommand(rc, targetlevel, sourcelevel, dimIdx) {
  585. return "EN:" + rc + targetlevel + "\tD" + dimIdx + "\t" + sourcelevel;
  586. }
  587. function makeDrillDownCommand(rc, level) {
  588. return "ED:" + rc + level;
  589. }
  590. function makeDrillUpCommand(rc, level) {
  591. return "EU:" + rc + level;
  592. }
  593. function makeHideSummariesCommand(rc, level) {
  594. if (parseInt(level) != 0)
  595. return "ES:" + rc + level;
  596. else
  597. return "ET:" + rc + "0";
  598. }
  599. function hideXtabDragNestBetweenDiv() {
  600. xtabNestBetweenDiv.style.visibility = "hidden";
  601. xtabNestBetweenDiv.style.top = 0;
  602. xtabNestBetweenDiv.style.left = 0;
  603. xtabNestBetweenDiv.style.height = 0;
  604. xtabNestBetweenDiv.style.width = 0;
  605. xtabNestBetweenLoc = XTAB_NEST_BETWEEN_NONE;
  606. }
  607. function showXtabDragNestBetweenDiv(event, obj) {
  608. var rc = obj.getAttribute("type").charAt(0);
  609. var objTop = getOffsetTop(obj);
  610. var objLeft = getOffsetLeft(obj);
  611. var x = event.clientX;
  612. var y = event.clientY;
  613. if (rc == 'r') {
  614. xtabNestBetweenDiv.style.height = XTAB_NEST_DIV_THICKNESS;
  615. xtabNestBetweenDiv.style.width = obj.offsetWidth;
  616. xtabNestBetweenDiv.style.left = objLeft;
  617. if (parseInt(y - objTop) < parseInt(obj.offsetHeight/2)) {
  618. xtabNestBetweenDiv.style.top = objTop - (XTAB_NEST_DIV_THICKNESS/2);
  619. xtabNestBetweenLoc = XTAB_NEST_BETWEEN_BEFORE;
  620. } else {
  621. xtabNestBetweenDiv.style.top = objTop + obj.offsetHeight - (XTAB_NEST_DIV_THICKNESS/2);
  622. xtabNestBetweenLoc = XTAB_NEST_BETWEEN_AFTER;
  623. }
  624. } else {
  625. xtabNestBetweenDiv.style.height = obj.offsetHeight;
  626. xtabNestBetweenDiv.style.width = XTAB_NEST_DIV_THICKNESS;
  627. xtabNestBetweenDiv.style.top = objTop;
  628. if (parseInt(x - objLeft) < parseInt(obj.offsetWidth/2)) {
  629. xtabNestBetweenDiv.style.left = objLeft - (XTAB_NEST_DIV_THICKNESS/2);
  630. xtabNestBetweenLoc = XTAB_NEST_BETWEEN_BEFORE;
  631. } else {
  632. xtabNestBetweenDiv.style.left = objLeft + obj.offsetWidth - (XTAB_NEST_DIV_THICKNESS/2);
  633. xtabNestBetweenLoc = XTAB_NEST_BETWEEN_AFTER;
  634. }
  635. }
  636. xtabDivOverObj = obj;
  637. xtabNestBetweenDiv.style.visibility = "visible";
  638. }
  639. function getOffsetTop(obj) {
  640. var offsetTop = obj.offsetTop;
  641. var parent = obj.offsetParent;
  642. while(parent && typeof parent != "undefined") {
  643. if (parent.offsetTop)
  644. offsetTop += parseInt(parent.offsetTop);
  645. parent = parent.offsetParent;
  646. }
  647. return offsetTop - document.getElementById("innerNice1-tab0").scrollTop;
  648. }
  649. function getOffsetLeft(obj) {
  650. var offsetLeft = obj.offsetLeft;
  651. var parent = obj.offsetParent;
  652. while(parent && typeof parent != "undefined") {
  653. if (parent.offsetLeft)
  654. offsetLeft += parseInt(parent.offsetLeft);
  655. parent = parent.offsetParent;
  656. }
  657. return offsetLeft - document.getElementById("innerNice1-tab0").scrollLeft;
  658. }