PageRenderTime 60ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/js/vsm.js

https://github.com/positivesum/vsm
JavaScript | 907 lines | 717 code | 72 blank | 118 comment | 110 complexity | 29bbd68a735c7a780fdb4d182d69bcc4 MD5 | raw file
  1. //colors
  2. var lineColor = '#000000';
  3. var backgroundColor = '#8F8E8D';
  4. var nodeColor = '#CDCDCD';
  5. var selectedColor = '#87FF76';
  6. var childrenColor0 = '#CDCDCD';
  7. var childrenColor1 = '#F5FF79';
  8. var childrenColor2 = '#118D38';
  9. var maxwidth = 100;
  10. var maxlength = 40;
  11. var maxsize = 2000;
  12. var st;
  13. var json;
  14. var tab = 'pages';
  15. var canvaswidth;
  16. var canvasheight;
  17. var recently_edited;
  18. function showPage(id) {
  19. if (id == 0) {
  20. jQuery('#menu-item-name-wrap').hide();
  21. jQuery('#titlewrap').show();
  22. jQuery('#title').val('');
  23. } else {
  24. jQuery('#menu-item-name-wrap').show();
  25. jQuery('#titlewrap').hide();
  26. }
  27. }
  28. function init(jsonTree) {
  29. json = jsonTree;
  30. /*
  31. canvaswidth = maxwidth*(json.count+1);
  32. canvasheight = maxlength*(json.count+1);
  33. canvaswidth = objDiv.clientWidth*2;
  34. canvasheight = objDiv.clientHeight*2;
  35. */
  36. //load json data
  37. st.loadJSON(json);
  38. //compute node positions and layout
  39. st.compute();
  40. setST();
  41. var node_active_id = jQuery.cookie("vsm_active_node_id");
  42. if (node_active_id) {
  43. // var TUtil = TreeUtil;
  44. var TUtil = $jit.json;
  45. var node = TUtil.getSubtree(json, node_active_id);
  46. if (node != null) {
  47. st.onClick(node_active_id);
  48. } else {
  49. st.onClick(st.root);
  50. }
  51. } else if (recently_edited != '') {
  52. st.onClick('menu-'+recently_edited);
  53. } else {
  54. st.onClick(st.root);
  55. }
  56. calcSize();
  57. scrollMap();
  58. }
  59. //canvas height function
  60. function setCanvas(){
  61. if(jQuery('#viewPort').size()>0) jQuery('#viewPort').height(jQuery(window).height() - (jQuery('#viewPort').get(0).scrollTop + 150));
  62. }
  63. function calcSize() {
  64. var levels = 0;
  65. var GUtil = $jit.Graph.Util;
  66. GUtil.eachNode(st.graph, function(n) {
  67. if (levels < n._depth) {
  68. levels = n._depth;
  69. }
  70. });
  71. var nodeArray = [];
  72. for (var i=0;i<levels;i++) {
  73. nodeArray[i] = 0;
  74. }
  75. GUtil.eachNode(st.graph, function(n) {
  76. var count = 0;
  77. GUtil.eachSubnode(n, function(elem) {
  78. count++;
  79. });
  80. if (nodeArray[n._depth] < count) {
  81. nodeArray[n._depth] = count;
  82. }
  83. });
  84. var maxcount = 1;
  85. for (var i=0;i<nodeArray.length;i++) {
  86. maxcount += nodeArray[i];
  87. }
  88. var objDiv = document.getElementById("viewPort");
  89. if (view.state == 'map') {
  90. canvaswidth = maxcount*st.config.Node.width/2;
  91. canvasheight = (levels+1)*st.config.Node.height*2+objDiv.clientHeight/2;
  92. } else {
  93. canvaswidth = maxcount*st.config.Node.height/2;
  94. canvasheight = (levels+1)*st.config.Node.width*2+objDiv.clientHeight/2;
  95. }
  96. if (canvaswidth < objDiv.clientWidth) {
  97. canvaswidth = objDiv.clientWidth;
  98. }
  99. if (canvasheight < objDiv.clientHeight) {
  100. canvasheight = objDiv.clientHeight;
  101. }
  102. st.canvas.resize(parseInt(canvaswidth), parseInt(canvasheight));
  103. }
  104. function setST(){
  105. var maxtext = '';
  106. // var GUtil = Graph.Util;
  107. var GUtil = $jit.Graph.Util;
  108. GUtil.eachNode(st.graph, function(n) {
  109. if (maxtext.length < n.name.length) {
  110. maxtext = n.name;
  111. }
  112. });
  113. var div = document.createElement('div');
  114. div.setAttribute('id', 'Test');
  115. div.style.fontSize = '0.9em';
  116. div.style.width = 'auto';
  117. div.style.height = st.config.Node.height + 'px';
  118. div.style.position = 'absolute';
  119. div.style.visibility = 'hidden';
  120. document.body.appendChild(div);
  121. div.innerHTML = maxtext;
  122. var test = document.getElementById("Test");
  123. var width = test.clientWidth;
  124. if (width > maxwidth) {
  125. width = maxwidth;
  126. }
  127. var height = test.clientHeight;
  128. st.config.Node.width = width;
  129. document.body.removeChild(div);
  130. }
  131. //VIEW STATE TRACKING
  132. var view = {
  133. state: 'map',
  134. screen: 'normal',
  135. map: function(){
  136. if (this.getState() == 'outline') {
  137. jQuery('#viewPort, #viewToggles ul').addClass('map').removeClass('outline');
  138. this.state = 'map';
  139. calcSize();
  140. st.switchPosition('top', "animate", {
  141. onComplete: function(){
  142. // st.refresh();
  143. }
  144. });
  145. }
  146. },
  147. outline: function(){
  148. if (this.getState() == 'map') {
  149. jQuery('#viewPort, #viewToggles ul').addClass('outline').removeClass('map');
  150. this.state = 'outline';
  151. calcSize();
  152. st.switchPosition('left', "animate", {
  153. onComplete: function(){
  154. // st.refresh();
  155. }
  156. });
  157. }
  158. },
  159. fullscreen: function(){
  160. if (this.getScreen() == 'normal') {
  161. this.screen = 'full';
  162. jQuery('#wphead').hide();
  163. jQuery('#adminmenuback').hide();
  164. jQuery('#adminmenu').hide();
  165. jQuery('#footer').hide();
  166. jQuery('#wpcontent').css("margin-left", "0");
  167. jQuery('body').css("overflow","hidden");
  168. jQuery('#wrap').addClass('fullscreen');
  169. } else {
  170. this.screen = 'normal';
  171. jQuery('#wphead').show();
  172. jQuery('#adminmenuback').show();
  173. jQuery('#adminmenu').show();
  174. jQuery('#footer').show();
  175. jQuery('#wpcontent').css("margin-left", "165px");
  176. jQuery('body').css("overflow","auto");
  177. jQuery('#wrap').removeClass('fullscreen');
  178. }
  179. scrollMap();
  180. },
  181. toggle: function(){
  182. if(this.state == 'map') {this.outline();}
  183. else {this.map();}
  184. },
  185. getState: function(){
  186. return this.state;
  187. },
  188. getScreen: function(){
  189. return this.screen;
  190. }
  191. };
  192. function scrollMap(){
  193. var objDiv = document.getElementById("viewPort");
  194. objDiv.scrollTop = 9*(objDiv.scrollHeight - objDiv.clientHeight) / 10;
  195. objDiv.scrollLeft = (objDiv.scrollWidth - objDiv.clientWidth) / 2;
  196. }
  197. function showPageInfo(event, id){
  198. var TUtil = $jit.json;
  199. var node = TUtil.getSubtree(json, id);
  200. var patt=/menu/g;
  201. if (node.id == '0') {
  202. jQuery('#menu-item-settings').css('min-width', '200px');
  203. jQuery('#menu-item-settings').css('max-width', '200px');
  204. document.getElementById('edit-menu-item-title').value = '';
  205. document.getElementById('menu-item-locations').style.display = 'inline';
  206. document.getElementById('span-locations').style.display = 'inline';
  207. document.getElementById('menu-item-url').style.display = 'none';
  208. document.getElementById('link-to-original').style.display = 'none';
  209. document.getElementById('menu-item-target').style.display = 'none';
  210. document.getElementById('span-save').style.display = 'none';
  211. document.getElementById('span-delete').style.display = 'none';
  212. document.getElementById('menu-item-locations').onclick = function(){
  213. locationsMenu();
  214. };
  215. document.getElementById('menu-item-add').onclick = function(){
  216. addMenu();
  217. };
  218. } else {
  219. jQuery('#menu-item-settings').css('min-width', '300px');
  220. jQuery('#menu-item-settings').css('max-width', '300px');
  221. document.getElementById('menu-item-locations').style.display = 'none';
  222. document.getElementById('span-locations').style.display = 'none';
  223. document.getElementById('link-to-original').style.display = 'none';
  224. document.getElementById('span-add').style.display = 'inline';
  225. document.getElementById('span-save').style.display = 'inline';
  226. document.getElementById('span-delete').style.display = 'inline';
  227. if (id.search('menu') != -1) {
  228. document.getElementById('edit-menu-item-title').value = decodeURIComponent(node.data.name);
  229. document.getElementById('menu-item-url').style.display = 'none';
  230. document.getElementById('menu-item-target').style.display = 'none';
  231. document.getElementById('link-to-original').style.display = 'none';
  232. document.getElementById('menu-item-add').onclick = function(){
  233. addMenuItem(node.id);
  234. };
  235. document.getElementById('menu-item-delete').onclick = function(){
  236. deleteMenu(node.data.term_id);
  237. };
  238. document.getElementById('menu-item-save').onclick = function(){
  239. saveMenu(node.data.term_id);
  240. };
  241. } else {
  242. document.getElementById('edit-menu-item-title').value = decodeURIComponent(node.data.title);
  243. document.getElementById('menu-item-target').style.display = 'block';
  244. switch (node.data.target) {
  245. case '_blank':
  246. document.getElementById('edit-menu-item-target').selectedIndex = 1;
  247. break;
  248. case '_nothing':
  249. document.getElementById('edit-menu-item-target').selectedIndex = 2;
  250. break;
  251. default:
  252. document.getElementById('edit-menu-item-target').selectedIndex = 0;
  253. }
  254. if (node.data.type_label != 'Custom') {
  255. document.getElementById('menu-item-url').style.display = 'none';
  256. document.getElementById('link-to-original').style.display = 'block';
  257. document.getElementById('menu-item-edit').href = '/wp-admin/post.php?post='+ node.data.object_id +'&action=edit';
  258. document.getElementById('menu-item-preview').href = decodeURIComponent(node.data.url);
  259. } else {
  260. // document.getElementById('span-add').style.display = 'none';
  261. document.getElementById('link-to-original').style.display = 'none';
  262. document.getElementById('menu-item-url').style.display = 'block';
  263. document.getElementById('edit-menu-item-url').value = decodeURIComponent(node.data.url);
  264. }
  265. document.getElementById('menu-item-add').onclick = function(){
  266. addMenuItem(node.id);
  267. };
  268. document.getElementById('menu-item-save').onclick = function(){
  269. saveMenuItem(node.data.ID);
  270. };
  271. document.getElementById('menu-item-delete').onclick = function(){
  272. deleteMenuItem(node.data.menu, node.data.ID);
  273. };
  274. }
  275. }
  276. var tempPageMeta = jQuery('#menu-item-settings').attr('parentID', node.id).positionInfo().fadeIn(400);
  277. if (!event.cancelBubble) {
  278. event.cancelBubble = true;
  279. } else {
  280. event.stopPropagation();
  281. }
  282. }
  283. jQuery.fn.positionInfo = function(){
  284. var thisParent = jQuery('#'+jQuery(this).attr('parentID'));
  285. var parentLoc = thisParent.offset();
  286. jQuery(this).css('top', parentLoc.top + 50);
  287. jQuery(this).css('left', parentLoc.left - 50);
  288. return jQuery(this);
  289. }
  290. function locationsMenu(){
  291. jQuery('#menu-item-settings').fadeOut(400);
  292. var tempPageMeta = jQuery('#nav-menu-theme-locations').attr('parentID', 0).positionInfo().fadeIn(400);
  293. }
  294. function saveMenuLocations(){
  295. var locations = jQuery('#nav-menu-theme-locations form').serialize();
  296. if (locations != '') {
  297. jQuery('#nav-menu-theme-locations').fadeOut(400);
  298. jQuery.ajax({
  299. type: "POST",
  300. // url: "/wp-admin/admin-ajax.php",
  301. url: ajaxurl,
  302. data: locations,
  303. dataType: 'json',
  304. success: function(data){
  305. }
  306. });
  307. } else {
  308. alert('Theme locations are empty!');
  309. }
  310. }
  311. /*
  312. action=menu-locations-save&menu-settings-column-nonce=2c5703b410&menu-locations%5Bprimary%5D=13&menu-locations%5Btop-navigation%5D=12
  313. */
  314. function addMenu(){
  315. var name = document.getElementById('edit-menu-item-title').value;
  316. if (name != '') {
  317. jQuery('#menu-item-settings').fadeOut(400);
  318. jQuery.ajax({
  319. type: "POST",
  320. // url: "/wp-admin/admin-ajax.php",
  321. url: ajaxurl,
  322. data: 'action=vsm&operation=add-menu&menu=0&menu-name=' + encodeURIComponent(name),
  323. // url: "/wp-content/plugins/vsm/nav-menus-api.php",
  324. // data: 'action=add-menu&menu=0&menu-name=' + encodeURIComponent(name),
  325. dataType: 'json',
  326. success: function(data){
  327. var id = 'menu-'+data.menu_object.term_id;
  328. var node = {'id': id, 'name': name, 'data': data.menu_object, 'children': []};
  329. var menu = {'id' : 0, children : [node]};
  330. json.children.push(node);
  331. st.addSubtree(menu, "animate", {hideLabels: false,
  332. onAfterCompute: function() {
  333. st.onClick(id);
  334. scrollMap();
  335. st.refresh();
  336. var str = '';
  337. for (var i in data.messages) {
  338. str += data.messages[i];
  339. }
  340. jQuery("#messages").html(str);
  341. }
  342. });
  343. }
  344. });
  345. } else {
  346. alert('Menu name is empty!');
  347. }
  348. }
  349. function deleteMenu(id) {
  350. var r=confirm("You are about to permanently delete this menu.\n 'Cancel' to stop, 'OK' to delete.");
  351. if (r==true) {
  352. jQuery('#menu-item-settings').fadeOut(400);
  353. jQuery.ajax({
  354. type: "POST",
  355. // url: "/wp-admin/admin-ajax.php",
  356. url: ajaxurl,
  357. data: 'action=vsm&operation=delete&menu=' + id,
  358. // url: "/wp-content/plugins/vsm/nav-menus-api.php",
  359. // data: 'action=delete&menu=' + id,
  360. dataType: 'json',
  361. success: function(data){
  362. var menu_id = "menu-" + id;
  363. st.removeSubtree(menu_id, true, 'replot', {
  364. hideLabels: false,
  365. onAfterCompute: function() {
  366. jQuery.cookie("vsm_active_node_id", st.root ); //
  367. st.onClick(st.root);
  368. scrollMap();
  369. var str = '';
  370. for (var i in data.messages) {
  371. str += data.messages[i];
  372. }
  373. jQuery("#messages").html(str);
  374. }
  375. });
  376. }
  377. });
  378. }
  379. }
  380. function saveMenu(id){
  381. var name = document.getElementById('edit-menu-item-title').value;
  382. if (name != '') {
  383. jQuery('#menu-item-settings').fadeOut(400);
  384. jQuery.ajax({
  385. type: "POST",
  386. // url: "/wp-admin/admin-ajax.php",
  387. url: ajaxurl,
  388. data: 'action=vsm&operation=update-menu&menu='+id + '&menu-name=' + encodeURIComponent(name),
  389. // url: "/wp-content/plugins/vsm/nav-menus-api.php",
  390. // data: 'action=update-menu&menu='+id + '&menu-name=' + encodeURIComponent(name),
  391. dataType: 'json',
  392. success: function(data){
  393. var str = '';
  394. for (var i in data.messages) {
  395. str += data.messages[i];
  396. }
  397. jQuery("#messages").html(str);
  398. // var TUtil = TreeUtil;
  399. var TUtil = $jit.json;
  400. var node = TUtil.getSubtree(json, 'menu-'+id);
  401. node.name = name;
  402. node.data.name = name;
  403. jQuery('#menu-'+id).html('<a href="javascript:void(0)" onclick="showPageInfo(event, \'' + node.id + '\')">'+node.name+'</a>');
  404. }
  405. });
  406. } else {
  407. alert('Menu name is empty!');
  408. }
  409. }
  410. function getSubtree(subtree) {
  411. var ids = [subtree.id];
  412. for (var i=0;i<subtree.children.length;i++) {
  413. if (subtree.children[i].children.length > 0) {
  414. var aids = getSubtree(subtree.children[i]);
  415. for (var j=0;j<aids.length;j++) {
  416. ids.push(aids[j]);
  417. }
  418. } else {
  419. ids.push(subtree.children[i].id);
  420. }
  421. }
  422. return ids;
  423. }
  424. function deleteMenuItem(menu, id){
  425. var TUtil = $jit.json;
  426. var subtree = TUtil.getSubtree(json, id);
  427. var ids = [id];
  428. if (subtree != null) {
  429. ids = getSubtree(subtree);
  430. }
  431. var r=confirm("You are about to permanently delete this menu item.\n 'Cancel' to stop, 'OK' to delete.");
  432. if (r==true) {
  433. jQuery('#menu-item-settings').fadeOut(400);
  434. jQuery.ajax({
  435. type: "POST",
  436. // url: "/wp-admin/admin-ajax.php",
  437. url: ajaxurl,
  438. data: 'action=vsm&operation=delete-menu-item&menu=' + menu + '&menu-item=' + ids,
  439. /*
  440. url: "/wp-content/plugins/vsm/nav-menus-api.php",
  441. data: 'action=delete-menu-item&menu=' + menu
  442. + '&menu-item=' + id,
  443. */
  444. dataType: 'json',
  445. success: function(data){
  446. st.removeSubtree(id, true, 'animate', {
  447. hideLabels: false,
  448. onAfterCompute: function() {
  449. // var TUtil = TreeUtil;
  450. var TUtil = $jit.json;
  451. var node = TUtil.getParent(json, id);
  452. st.onClick(node.id);
  453. jQuery.cookie("vsm_active_node_id", node.id ); //
  454. /*
  455. st.onClick(node.id);
  456. scrollMap();
  457. */
  458. var str = '';
  459. for (var i in data.messages) {
  460. str += data.messages[i];
  461. }
  462. jQuery("#messages").html(str);
  463. }
  464. });
  465. }
  466. });
  467. }
  468. }
  469. function addMenuItem(id){
  470. document.getElementById('submenu-item-add').onclick = function(){
  471. addSubMenuItem(id);
  472. };
  473. jQuery('#menu-item-settings').fadeOut(400);
  474. var tempPageMeta = jQuery('#typediv').attr('parentID', id).positionInfo().fadeIn(400);
  475. }
  476. function addSubMenuItem(id){
  477. // var TUtil = TreeUtil;
  478. var TUtil = $jit.json;
  479. var node = TUtil.getSubtree(json, id);
  480. var menu = 0;
  481. var parent_id = 0;
  482. var type = 'post_type';
  483. var object_type = 'post';
  484. var object_id = 0;
  485. var name = '';
  486. var url = '';
  487. var str = String(id);
  488. if (str.search('menu') != -1) {
  489. menu = node.data.term_id;
  490. parent_id = 0;
  491. } else {
  492. menu = node.data.menu;
  493. parent_id = node.data.ID;
  494. }
  495. switch(tab) {
  496. case 'pages':
  497. object_type = 'page';
  498. var page = jQuery('input:radio[name=page]:checked').val();
  499. if (page == 'new_page') {
  500. name = document.getElementById('title').value;
  501. if (name == '') {
  502. alert('Page name is empty!');
  503. return false;
  504. }
  505. } else {
  506. var obj = document.getElementById('pages-list');
  507. if (obj.selectedIndex == -1) {
  508. alert('Pages list is empty!');
  509. return false;
  510. }
  511. if (obj.selectedIndex == 0) {
  512. alert('Select a page!');
  513. return false;
  514. }
  515. object_id = obj.options[obj.selectedIndex].value;
  516. name = obj.options[obj.selectedIndex].text;
  517. url = '/?page_id='+object_id;
  518. }
  519. break;
  520. case 'links':
  521. type = 'custom';
  522. object_type = 'custom';
  523. name = document.getElementById('custom-menu-item-name').value;
  524. if (name == '') {
  525. alert('Menu item name is empty!');
  526. return false;
  527. }
  528. url = document.getElementById('custom-menu-item-url').value;
  529. if (url == '') {
  530. alert('Menu item url is empty!');
  531. return false;
  532. }
  533. break;
  534. case 'posts':
  535. object_type = 'post';
  536. var obj = document.getElementById('posts-list');
  537. if (obj.selectedIndex == -1) {
  538. alert('Posts list is empty!');
  539. return false;
  540. }
  541. object_id = obj.options[obj.selectedIndex].value;
  542. name = obj.options[obj.selectedIndex].text;
  543. url = '/?p='+object_id;
  544. break;
  545. }
  546. jQuery('#typediv').fadeOut(400);
  547. if (tab == 'links') {
  548. var post = 'operation=add-menu-item&menu='
  549. + menu
  550. + '&menu-item[-1][menu-item-parent-id]=' + parent_id
  551. + '&menu-item[-1][menu-item-type]=' + type
  552. + '&menu-item[-1][menu-item-url]=' + encodeURIComponent(url)
  553. + '&menu-item[-1][menu-item-title]=' + encodeURIComponent(name);
  554. } else {
  555. var post = 'operation=add-menu-item&menu='
  556. + menu
  557. + '&menu-item[-1][menu-item-db-id]=0'
  558. + '&menu-item[-1][menu-item-object-id]=' + object_id
  559. + '&menu-item[-1][menu-item-object]=' + object_type
  560. + '&menu-item[-1][menu-item-parent-id]=' + parent_id
  561. + '&menu-item[-1][menu-item-type]=' + type
  562. + '&menu-item[-1][menu-item-url]=' + encodeURIComponent(url)
  563. + '&menu-item[-1][menu-item-title]=' + encodeURIComponent(name);
  564. }
  565. jQuery.ajax({
  566. type: "POST",
  567. // url: "/wp-admin/admin-ajax.php",
  568. url: ajaxurl,
  569. data: 'action=vsm&' + post,
  570. /*
  571. url: "/wp-content/plugins/vsm/nav-menus-api.php",
  572. data: post,
  573. */
  574. dataType: 'json',
  575. success: function(data){
  576. name = data.menu_items[0].title;
  577. var menu_item = {'id': data.menu_items[0].ID, 'name': name, 'data': data.menu_items[0], 'children': []};
  578. menu_item.data.menu = menu;
  579. var obj = {'id' : id, children : [menu_item]};
  580. node.children.push(menu_item);
  581. st.addSubtree(obj, "replot", {hideLabels: false,
  582. onAfterCompute: function() {
  583. /*
  584. st.refresh();
  585. st.onClick(id);
  586. scrollMap();
  587. */
  588. var str = '';
  589. for (var i in data.messages) {
  590. str += data.messages[i];
  591. }
  592. jQuery("#messages").html(str);
  593. if (tab == 'links') {
  594. document.getElementById('edit-menu-item-url').value = url;
  595. }
  596. document.getElementById('edit-menu-item-title').value = name;
  597. saveMenuItem(data.menu_items[0].ID);
  598. }
  599. });
  600. }
  601. });
  602. }
  603. function selectTab(id) {
  604. tab = id;
  605. jQuery('#add-menu-item-tabs li').removeClass('tabs');
  606. jQuery('#tab-'+id).addClass('tabs');
  607. jQuery('.tabs-panel').removeClass('tabs-panel-active').addClass('tabs-panel-inactive');
  608. jQuery('#tabs-panel-'+id).removeClass('tabs-panel-inactive').addClass('tabs-panel-active');
  609. }
  610. function saveMenuItem(id){
  611. // var TUtil = TreeUtil;
  612. var TUtil = $jit.json;
  613. var node = TUtil.getSubtree(json, id);
  614. var name = document.getElementById('edit-menu-item-title').value;
  615. if (name == '') {
  616. alert('Menu item name is empty!');
  617. return false;
  618. }
  619. var url = node.data.url;
  620. if (node.data.type_label == 'Custom') {
  621. url = document.getElementById('edit-menu-item-url').value;
  622. if (url == '') {
  623. alert('Menu item url is empty!');
  624. return false;
  625. }
  626. }
  627. var obj = document.getElementById('edit-menu-item-target');
  628. var target = obj.options[obj.selectedIndex].value;
  629. /*
  630. if (target == '_nothing') {
  631. url = '#';
  632. }
  633. */
  634. jQuery('#menu-item-settings').fadeOut(400);
  635. jQuery.ajax({
  636. type: "POST",
  637. // url: "/wp-admin/admin-ajax.php",
  638. url: ajaxurl,
  639. data: 'action=vsm&operation=update-menu-item&menu='
  640. + node.data.menu
  641. + '&menu-item-id=' + id
  642. + '&menu-item-object-id=' + node.data.object_id
  643. + '&menu-item-object=' + node.data.object
  644. + '&menu-item-parent-id=' + node.data.menu_item_parent
  645. + '&menu-item-position=' + node.data.menu_order
  646. + '&menu-item-type=' + node.data.type
  647. + '&menu-item-target=' + target
  648. + '&menu-item-url=' + encodeURIComponent(url)
  649. + '&menu-item-db-id=' + node.data.db_id
  650. + '&menu-item-title=' + encodeURIComponent(name),
  651. /*
  652. url: "/wp-content/plugins/vsm/nav-menus-api.php",
  653. data: 'action=update-menu-item&menu='
  654. + node.data.menu
  655. + '&menu-item-id=' + id
  656. + '&menu-item-object-id=' + node.data.object_id
  657. + '&menu-item-object=' + node.data.object
  658. + '&menu-item-parent-id=' + node.data.menu_item_parent
  659. + '&menu-item-position=' + node.data.menu_order
  660. + '&menu-item-type=' + node.data.type
  661. + '&menu-item-url=' + encodeURIComponent(url)
  662. + '&menu-item-db-id=' + node.data.db_id
  663. + '&menu-item-title=' + encodeURIComponent(name),
  664. */
  665. dataType: 'json',
  666. success: function(data){
  667. jQuery('#'+id).html('<a href="javascript:void(0)" onclick="showPageInfo(event, \'' + id + '\')">'+name+'</a>');
  668. node.name = name;
  669. node.data.title = name;
  670. node.data.url = url;
  671. node.data.target = target;
  672. var str = '';
  673. for (var i in data.messages) {
  674. str += data.messages[i];
  675. }
  676. jQuery("#messages").html(str);
  677. }
  678. });
  679. }
  680. /*-------------------------------------------------------------------------
  681. DOM READY EVENTS
  682. -------------------------------------------------------------------------*/
  683. jQuery(function(){
  684. /*----------------------------------
  685. BUTTON BAR
  686. ----------------------------------*/
  687. //TOGGLE MAP VIEW
  688. jQuery('#mapView').click(function(){
  689. view.map();
  690. return false;
  691. });
  692. //TOGGLE OUTLINE VIEW
  693. jQuery('#outlineView').click(function(){
  694. view.outline();
  695. return false;
  696. });
  697. //TOGGLE FULLSCREEN VIEW
  698. jQuery('#fullscreenView').click(function(){
  699. view.fullscreen();
  700. return false;
  701. });
  702. //HIDE TITLE PROMPT TEXT
  703. jQuery("#title").focus(function(){
  704. jQuery('#title-prompt-text').hide();
  705. jQuery(this).css({"background" : "none repeat scroll 0 0 #FFE8B6", "border-color": "#666666"});
  706. });
  707. //SHOW TITLE PROMPT TEXT
  708. jQuery("#title").focusout(function(){
  709. if (jQuery(this).val() == '') {
  710. jQuery('#title-prompt-text').show();
  711. }
  712. jQuery(this).css({"background" : "none repeat scroll 0 0 #FFFFFF", "border-color": "#DFDFDF"});
  713. });
  714. setCanvas();
  715. jQuery(window).resize(function () {setCanvas();});
  716. var viewPort = document.getElementById('viewPort');
  717. //Create a new ST instance
  718. st= new $jit.ST({
  719. injectInto:'viewPort',
  720. orientation: "top",
  721. levelsToShow: 1,
  722. withLabels: true,
  723. backgroundColor: backgroundColor,
  724. //change the animation/transition effect
  725. // transition: Trans.Quart.easeOut,
  726. //set node and edge colors
  727. Node: {
  728. height: 40,
  729. width: 100,
  730. type: 'rectangle',
  731. color: nodeColor,
  732. overridable: true
  733. },
  734. Edge: {
  735. type: 'bezier',
  736. overridable: true
  737. },
  738. /*
  739. Navigation: {
  740. enable:true,
  741. panning:true
  742. },
  743. */
  744. //This method is called on DOM label creation.
  745. //Use this method to add event handlers and styles to
  746. //your node.
  747. onCreateLabel: function(label, node){
  748. label.id = node.id;
  749. if (node.id != -1) {
  750. label.innerHTML = '<b><a href="javascript:void(0)" onclick="showPageInfo(event, \'' + node.id + '\')">'+node.name+'</a><b>';
  751. } else {
  752. label.innerHTML = '<b>'+node.name+'</b>';
  753. }
  754. label.onclick = function(){
  755. var node_active_id = jQuery.cookie("vsm_active_node_id");
  756. jQuery.cookie("vsm_active_node_id", node.id );
  757. st.onClick(node.id);
  758. scrollMap();
  759. };
  760. //set label styles
  761. var style = label.style;
  762. style.width = st.config.Node.width + 'px';
  763. style.height = st.config.Node.height + 'px';
  764. style.cursor = 'pointer';
  765. style.color = '#333';
  766. style.fontSize = '0.9em';
  767. style.lineHeight = '1em';
  768. style.textAlign= 'center';
  769. style.paddingTop = '1px';
  770. style.background = node.data.$color; // IE empty div fix
  771. },
  772. //This method is called right before plotting
  773. //a node. It's useful for changing an individual node
  774. //style properties before plotting it.
  775. //The data properties prefixed with a dollar
  776. //sign will override the global node style properties.
  777. onBeforePlotNode: function(node){
  778. //add some color to the nodes in the path between the
  779. //root node and the selected node.
  780. if (node.selected) {
  781. node.data.$color = selectedColor;
  782. }
  783. else {
  784. delete node.data.$color;
  785. //if the node belongs to the last plotted level
  786. if(!node.anySubnode("exist")) {
  787. //count children number
  788. var count = 0;
  789. node.eachSubnode(function(n) { count++; });
  790. //assign a node color based on
  791. //how many children it has
  792. if (count > 1) {
  793. count = 1;
  794. }
  795. node.data.$color = [childrenColor0, childrenColor1][count];
  796. }
  797. }
  798. jQuery('#'+node.id).css('background', node.data.$color); // IE empty div fix
  799. },
  800. //This method is called right before plotting
  801. //an edge. It's useful for changing an individual edge
  802. //style properties before plotting it.
  803. //Edge data proprties prefixed with a dollar sign will
  804. //override the Edge global style properties.
  805. onBeforePlotLine: function(adj){
  806. if (adj.nodeFrom.selected && adj.nodeTo.selected) {
  807. adj.data.$color = lineColor;
  808. adj.data.$lineWidth = 3;
  809. }
  810. else {
  811. delete adj.data.$color;
  812. delete adj.data.$lineWidth;
  813. }
  814. }
  815. });
  816. jQuery.ajax({
  817. type: "POST",
  818. // url: "/wp-admin/admin-ajax.php",
  819. url: ajaxurl,
  820. data: 'action=vsm&operation=load-nav-menus',
  821. // url: "/wp-content/plugins/vsm/nav-menus-api.php",
  822. // data: 'action=load-nav-menus',
  823. dataType: 'json',
  824. success: function(data){
  825. var str = '';
  826. for (var i in data.messages) {
  827. str += data.messages[i];
  828. }
  829. jQuery("#messages").html(str);
  830. recently_edited = data.recently_edited;
  831. init(data.json_menus);
  832. }
  833. });
  834. });