PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/BlogEngine/BlogEngine.NET/admin/widget.js

#
JavaScript | 339 lines | 262 code | 54 blank | 23 comment | 64 complexity | 2938d8622d133bf25c270338e226e3db MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, BSD-3-Clause
  1. /*-----------------------------------------------------------------------------
  2. WIDGET FRAMEWORK
  3. -----------------------------------------------------------------------------*/
  4. BlogEngine.widgetAdmin = {
  5. zoneNames: [],
  6. moveContainer: null,
  7. moveDropdown: null,
  8. moveContainerCurrentLocationWidgetId: null,
  9. moveContainerCurrentLocationWidgetZone: null
  10. ,
  11. positionMoveDropdown: function() {
  12. // Make sure the following conditions are met.
  13. if (!BlogEngine.widgetAdmin.moveContainer ||
  14. !BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId ||
  15. !BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetZone)
  16. return;
  17. var oWidget = BlogEngine.$("widget" + BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId);
  18. if (oWidget) {
  19. oWidget.insertBefore(BlogEngine.widgetAdmin.moveContainer, oWidget.firstChild);
  20. BlogEngine.widgetAdmin.moveContainer.style.display = ''; // unhide if hidden.
  21. }
  22. }
  23. ,
  24. moveComplete: function(response) {
  25. if (response) {
  26. var data = response.split(',');
  27. if (data.length == 4) {
  28. var oldZone = data[0];
  29. var widgetToMove = data[1];
  30. var newZone = data[2];
  31. var moveBeforeWidget = data[3];
  32. var divOldZone = BlogEngine.$("widgetzone_" + oldZone);
  33. var divWidgetToMove = BlogEngine.$("widget" + widgetToMove);
  34. var divNewZone = BlogEngine.$("widgetzone_" + newZone);
  35. var divMoveBeforeWidget = moveBeforeWidget && moveBeforeWidget.length > 0 ? BlogEngine.$("widget" + moveBeforeWidget) : null;
  36. // note: not actually using divOldZone.
  37. if (divOldZone && divWidgetToMove && divNewZone) {
  38. // Move widget in DOM.
  39. if (divMoveBeforeWidget)
  40. divNewZone.insertBefore(divWidgetToMove, divMoveBeforeWidget);
  41. else
  42. divNewZone.appendChild(divWidgetToMove);
  43. BlogEngine.widgetAdmin.clearWidgetList();
  44. }
  45. }
  46. }
  47. }
  48. ,
  49. processMoveWidget: function() {
  50. var selectedValue = BlogEngine.widgetAdmin.moveDropdown.value;
  51. if (selectedValue && selectedValue.length > 0) {
  52. // The selected value might either be a ZoneName or a Widget. If it is a ZoneName,
  53. // the widget will be placed at the bottom of that Zone. If it is a Widget, the widget
  54. // will be moved in front of the selected Widget.
  55. if (selectedValue != BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId) {
  56. var sZoneNamePrefix = "zone_";
  57. var sNewZoneName = null;
  58. var iIndex = BlogEngine.widgetAdmin.moveDropdown.selectedIndex;
  59. // Find the zone of the selected item by going up the list. If the selected item
  60. // is a zone, then sNewZoneName will be the selected zone.
  61. while (!sNewZoneName && iIndex >= 0) {
  62. if (BlogEngine.widgetAdmin.moveDropdown[iIndex].value &&
  63. BlogEngine.widgetAdmin.moveDropdown[iIndex].value.indexOf(sZoneNamePrefix) == 0) {
  64. sNewZoneName = BlogEngine.widgetAdmin.moveDropdown[iIndex].value.substr(sZoneNamePrefix.length);
  65. }
  66. iIndex--;
  67. }
  68. if (sNewZoneName) {
  69. // If a Zone was selected from the dropdown list, then set moveBeforeWidgetId to an empty string.
  70. var moveBeforeWidgetId = selectedValue.indexOf(sZoneNamePrefix) == 0 ? "" : selectedValue;
  71. // Pass 4 pieces of data back to the server.
  72. // (1) Old Zone, (2) Widget Id to move, (3) New Zone, (4) Move Before Widget Id.
  73. var sData =
  74. BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetZone + "," +
  75. BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId + "," +
  76. sNewZoneName + "," + moveBeforeWidgetId;
  77. BlogEngine.createCallback(BlogEngine.webRoot + "admin/WidgetEditor.aspx?move=" + sData + "&rnd=" + Math.random(), BlogEngine.widgetAdmin.moveComplete);
  78. }
  79. }
  80. }
  81. }
  82. ,
  83. hideMoveToList: function() {
  84. if (BlogEngine.widgetAdmin.moveContainer) {
  85. BlogEngine.widgetAdmin.moveContainer.style.display = 'none'; // hide dropdown container.
  86. }
  87. BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId = null;
  88. BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetZone = null;
  89. }
  90. ,
  91. clearWidgetList: function() {
  92. // After a widget is added, edited, moved, or removed, the moveDropdown list is cleared so
  93. // it can be reloaded with updated data the next time it is needed. Also hide dropdown container.
  94. BlogEngine.widgetAdmin.hideMoveToList();
  95. if (BlogEngine.widgetAdmin.moveDropdown && BlogEngine.widgetAdmin.moveDropdown.firstChild) {
  96. while (BlogEngine.widgetAdmin.moveDropdown.firstChild) {
  97. BlogEngine.widgetAdmin.moveDropdown.removeChild(BlogEngine.widgetAdmin.moveDropdown.firstChild);
  98. }
  99. }
  100. }
  101. ,
  102. createDropdownOption: function(text, value) {
  103. var oOption = document.createElement('option');
  104. oOption.value = value;
  105. oOption.appendChild(document.createTextNode(text));
  106. return oOption;
  107. }
  108. ,
  109. loadMoveDropdownItems: function(response) {
  110. if (!response || response.length == 0) {
  111. alert('Failed to retrieve list of zones and widgets.');
  112. return;
  113. }
  114. var oResponse = eval("(" + response + ")");
  115. if (!oResponse || typeof oResponse.zones == 'undefined') {
  116. alert('Failed to retrieve list of zones and widgets.');
  117. return;
  118. }
  119. var zoneAndChildWidgets = oResponse.zones;
  120. if (!BlogEngine.widgetAdmin.moveContainer) {
  121. BlogEngine.widgetAdmin.moveContainer = document.createElement('div');
  122. BlogEngine.widgetAdmin.moveContainer.id = 'moveWidgetToContainer';
  123. }
  124. if (!BlogEngine.widgetAdmin.moveDropdown) {
  125. BlogEngine.widgetAdmin.moveDropdown = document.createElement('select');
  126. BlogEngine.widgetAdmin.moveDropdown.id = 'moveWidgetTo';
  127. var oMoveBtn = document.createElement('input');
  128. oMoveBtn.id = 'moveWidgetToBtn';
  129. oMoveBtn.type = 'button';
  130. oMoveBtn.value = 'Move';
  131. oMoveBtn.onclick = BlogEngine.widgetAdmin.processMoveWidget;
  132. BlogEngine.widgetAdmin.moveContainer.appendChild(BlogEngine.widgetAdmin.moveDropdown);
  133. BlogEngine.widgetAdmin.moveContainer.appendChild(oMoveBtn);
  134. }
  135. BlogEngine.widgetAdmin.moveDropdown.appendChild(BlogEngine.widgetAdmin.createDropdownOption(oResponse.moveWidgetTo, ''));
  136. for (var z = 0; z < zoneAndChildWidgets.length; z++) {
  137. var zone = zoneAndChildWidgets[z];
  138. BlogEngine.widgetAdmin.moveDropdown.appendChild(BlogEngine.widgetAdmin.createDropdownOption("[" + zone.zoneName + "]", 'zone_' + zone.zoneName));
  139. for (var w = 0; w < zone.widgets.length; w++) {
  140. BlogEngine.widgetAdmin.moveDropdown.appendChild(BlogEngine.widgetAdmin.createDropdownOption(String.fromCharCode(160) + String.fromCharCode(160) + '-' + String.fromCharCode(160) + zone.widgets[w].desc, zone.widgets[w].id));
  141. }
  142. }
  143. BlogEngine.widgetAdmin.positionMoveDropdown();
  144. }
  145. ,
  146. getWidgetZoneNameFromElement: function(el) {
  147. // If the element passed in is a widgetzone, the zone name is extracted from the element's id and returned.
  148. var sIdPrefix = "widgetzone_";
  149. if (el.id && el.id.indexOf(sIdPrefix) == 0 && el.className && el.className == "widgetzone") {
  150. return el.id.substr(sIdPrefix.length);
  151. }
  152. return null;
  153. }
  154. ,
  155. sendRequestForMoveItems: function() {
  156. // The zoneNames need to be loaded only one time since new zones can't be added while
  157. // the document is loaded.
  158. if (BlogEngine.widgetAdmin.zoneNames.length == 0) {
  159. var oDivs = document.getElementsByTagName('div');
  160. for (var i = 0; i < oDivs.length; i++) {
  161. if (BlogEngine.widgetAdmin.getWidgetZoneNameFromElement(oDivs[i]))
  162. BlogEngine.widgetAdmin.zoneNames[BlogEngine.widgetAdmin.zoneNames.length] = BlogEngine.widgetAdmin.getWidgetZoneNameFromElement(oDivs[i]);
  163. }
  164. }
  165. BlogEngine.createCallback(BlogEngine.webRoot + "admin/WidgetEditor.aspx?getmoveitems=" + BlogEngine.widgetAdmin.zoneNames.join(",") + "&rnd=" + Math.random(), BlogEngine.widgetAdmin.loadMoveDropdownItems);
  166. }
  167. ,
  168. getWidgetsZoneName: function(id) {
  169. var oWidget = BlogEngine.$("widget" + id);
  170. var zoneName = null;
  171. if (oWidget) {
  172. while (!zoneName && oWidget.parentNode) {
  173. zoneName = BlogEngine.widgetAdmin.getWidgetZoneNameFromElement(oWidget.parentNode);
  174. oWidget = oWidget.parentNode;
  175. }
  176. }
  177. return zoneName;
  178. }
  179. ,
  180. initiateMoveWidget: function(id) {
  181. var sWidgetZoneName = BlogEngine.widgetAdmin.getWidgetsZoneName(id);
  182. if (BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId &&
  183. BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetZone &&
  184. id == BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId &&
  185. sWidgetZoneName == BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetZone) {
  186. // Move link was clicked on the same widget the moveContainer is already at. Just hide.
  187. BlogEngine.widgetAdmin.hideMoveToList();
  188. return;
  189. }
  190. BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetId = id;
  191. BlogEngine.widgetAdmin.moveContainerCurrentLocationWidgetZone = sWidgetZoneName;
  192. if (!BlogEngine.widgetAdmin.moveDropdown || BlogEngine.widgetAdmin.moveDropdown.childNodes.length == 0)
  193. BlogEngine.widgetAdmin.sendRequestForMoveItems();
  194. else
  195. BlogEngine.widgetAdmin.positionMoveDropdown();
  196. }
  197. ,
  198. editWidget: function(name, id) {
  199. window.scrollTo(0, 0);
  200. var width = document.documentElement.clientWidth + document.documentElement.scrollLeft;
  201. var height = document.documentElement.clientHeight + document.documentElement.scrollTop;
  202. var zone = BlogEngine.widgetAdmin.getWidgetsZoneName(id);
  203. var layer = document.createElement('div');
  204. layer.style.zIndex = 1002;
  205. layer.id = 'layer';
  206. layer.style.position = 'absolute';
  207. layer.style.top = '0px';
  208. layer.style.left = '0px';
  209. layer.style.height = document.documentElement.scrollHeight + 'px';
  210. layer.style.width = width + 'px';
  211. layer.style.backgroundColor = 'black';
  212. layer.style.opacity = '.6';
  213. layer.style.filter += ("progid:DXImageTransform.Microsoft.Alpha(opacity=60)");
  214. document.body.style.position = 'static';
  215. document.body.appendChild(layer);
  216. var size = { 'height': 500, 'width': 750 };
  217. var iframe = document.createElement('iframe');
  218. iframe.name = 'Widget Editor';
  219. iframe.id = 'WidgetEditor';
  220. iframe.src = BlogEngine.webRoot + 'admin/WidgetEditor.aspx?widget=' + name + '&id=' + id + "&zone=" + zone;
  221. iframe.style.height = size.height + 'px';
  222. iframe.style.width = size.width + 'px';
  223. iframe.style.position = 'fixed';
  224. iframe.style.zIndex = 1003;
  225. iframe.style.backgroundColor = 'white';
  226. iframe.style.border = '4px solid silver';
  227. iframe.frameborder = '0';
  228. iframe.style.top = ((height + document.documentElement.scrollTop) / 2) - (size.height / 2) + 'px';
  229. iframe.style.left = (width / 2) - (size.width / 2) + 'px';
  230. document.body.appendChild(iframe);
  231. }
  232. ,
  233. addWidget: function(type, zone) {
  234. BlogEngine.createCallback(BlogEngine.webRoot + "admin/WidgetEditor.aspx?add=" + type + "&zone=" + zone + "&rnd=" + Math.random(), BlogEngine.widgetAdmin.appendWidget);
  235. }
  236. ,
  237. appendWidget: function(response) {
  238. if (response == "reload") {
  239. location.reload();
  240. }
  241. else {
  242. var delimiterPos = response.indexOf('?');
  243. if (delimiterPos != -1) {
  244. var zoneId = response.substr(0, delimiterPos);
  245. response = response.substr(delimiterPos + 1);
  246. var zone = BlogEngine.$('widgetzone_' + zoneId);
  247. if (zone) {
  248. // clearWidgetList() BEFORE using innerHTML. If done after,
  249. // causes problems with losing a handle to the moveContainer
  250. // if the moveContainer is currently visible.
  251. BlogEngine.widgetAdmin.clearWidgetList();
  252. zone.innerHTML += response;
  253. }
  254. }
  255. }
  256. }
  257. ,
  258. widgetRemoved: function(response) {
  259. if (!response || response.length < 36) {
  260. alert('Failed to remove the widget.');
  261. return;
  262. }
  263. var widgetId = response.substr(0, 36);
  264. var zoneName = response.substr(36);
  265. var zone = BlogEngine.$("widgetzone_" + zoneName);
  266. var widget = BlogEngine.$("widget" + widgetId);
  267. if (zone && widget) {
  268. BlogEngine.widgetAdmin.clearWidgetList();
  269. zone.removeChild(widget);
  270. }
  271. }
  272. ,
  273. removeWidget: function(id) {
  274. if (confirm('Are you sure you want to remove the widget?')) {
  275. var zone = BlogEngine.widgetAdmin.getWidgetsZoneName(id);
  276. BlogEngine.createCallback(BlogEngine.webRoot + "admin/WidgetEditor.aspx?remove=" + id + "&zone=" + zone + "&rnd=" + Math.random(), BlogEngine.widgetAdmin.widgetRemoved);
  277. }
  278. }
  279. ,
  280. closeEditor: function() {
  281. document.body.removeChild(BlogEngine.$('WidgetEditor'));
  282. document.body.removeChild(BlogEngine.$('layer'));
  283. document.body.style.position = '';
  284. }
  285. };