PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/web/concrete/js/ccm_app/layouts.js

http://github.com/concrete5/concrete5
JavaScript | 449 lines | 331 code | 88 blank | 30 comment | 53 complexity | 5f9035d3dcb6186c763efc203477bef0 MD5 | raw file
Possible License(s): MIT, LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. // use as an object:
  2. // var myLayout = new ccmLayout();
  3. function ccmLayout( cvalID, layout_id, area, locked ){
  4. this.layout_id = layout_id;
  5. this.cvalID = cvalID;
  6. this.locked = locked;
  7. this.area = area;
  8. this.init = function(){
  9. //ccmAlert.hud( 'test3', 2000, 'add', 'test2');
  10. var layoutObj=this;
  11. this.layoutWrapper = $('#ccm-layout-wrapper-'+this.cvalID);
  12. this.ccmControls = this.layoutWrapper.find("#ccm-layout-controls-"+this.cvalID);
  13. this.ccmControls.get(0).layoutObj=this;
  14. /*
  15. this.layoutWrapper.mouseover(function(){
  16. layoutObj.ccmControls.show(200);
  17. })
  18. this.ccmControls.mouseout(function(){
  19. layoutObj.ccmControls.hide(200).delay(5000);
  20. });
  21. */
  22. this.ccmControls.mouseover(function(){ layoutObj.dontUpdateTwins=0; layoutObj.highlightAreas(1); });
  23. this.ccmControls.mouseout(function(){ if(!layoutObj.moving) layoutObj.highlightAreas(0); });
  24. this.ccmControls.find('.ccm-layout-menu-button').click(function(e){
  25. layoutObj.optionsMenu(e);
  26. })
  27. this.gridSizing();
  28. }
  29. this.highlightAreas=function(show){
  30. var els=this.layoutWrapper.find('.ccm-add-block');
  31. if(show) els.addClass('ccm-layout-area-highlight');
  32. else els.removeClass('ccm-layout-area-highlight');
  33. }
  34. this.optionsMenu=function(e){
  35. ccm_hideMenus();
  36. e.stopPropagation();
  37. ccm_menuActivated = true;
  38. // now, check to see if this menu has been made
  39. var aobj = document.getElementById("ccm-layout-options-menu-" + this.cvalID);
  40. if (!aobj) {
  41. // create the 1st instance of the menu
  42. el = document.createElement("DIV");
  43. el.id = "ccm-layout-options-menu-" + this.cvalID;
  44. el.className = "ccm-menu ccm-ui";
  45. el.style.display = "none";
  46. document.body.appendChild(el);
  47. aobj = $(el);
  48. aobj.css("position", "absolute");
  49. //contents of menu
  50. var html = '<div class="popover"><div class="arrow"></div><div class="inner"><div class="content">';
  51. html += '<ul>';
  52. //the arHandle here should be encoded with encodeURIComponent(), but it leads to a double encoding issue in ccm.dialog.js
  53. html += '<li><a onclick="ccm_hideMenus()" class="ccm-menu-icon ccm-icon-edit-menu" dialog-title="' + ccmi18n.editAreaLayout + '" dialog-modal="false" dialog-width="550" dialog-height="280" dialog-append-buttons="true" id="menuEditLayout' + this.cvalID + '" href="' + CCM_TOOLS_PATH + '/edit_area_popup.php?cID=' + CCM_CID + '&arHandle=' + encodeURIComponent(this.area) + '&layoutID=' + this.layout_id + '&cvalID=' + this.cvalID + '&atask=layout">' + ccmi18n.editAreaLayout + '</a></li>';
  54. html += '<li><a onclick="ccm_hideMenus()" class="ccm-menu-icon ccm-icon-move-up" id="menuAreaLayoutMoveUp' + this.cvalID + '">' + ccmi18n.moveLayoutUp + '</a></li>';
  55. html += '<li><a onclick="ccm_hideMenus()" class="ccm-menu-icon ccm-icon-move-down" id="menuAreaLayoutMoveDown' + this.cvalID + '">' + ccmi18n.moveLayoutDown + '</a></li>';
  56. var lockText = (this.locked) ? ccmi18n.unlockAreaLayout : ccmi18n.lockAreaLayout ;
  57. html += '<li><a onclick="ccm_hideMenus()" class="ccm-menu-icon ccm-icon-lock-menu" id="menuAreaLayoutLock' + this.cvalID + '">' + lockText + '</a></li>';
  58. html += '<li><a onclick="ccm_hideMenus()" class="ccm-menu-icon ccm-icon-delete-menu" dialog-append-buttons="true" id="menuAreaLayoutDelete' + this.cvalID + '">' + ccmi18n.deleteLayout + '</a></li>';
  59. html += '</ul>';
  60. html += '</div></div></div>';
  61. aobj.append(html);
  62. var aJQobj = $(aobj);
  63. var layoutObj=this;
  64. aJQobj.find('#menuEditLayout' + this.cvalID).dialog();
  65. aJQobj.find('#menuAreaLayoutMoveUp' + this.cvalID).click(function(){ layoutObj.moveLayout('up'); });
  66. aJQobj.find('#menuAreaLayoutMoveDown' + this.cvalID).click(function(){ layoutObj.moveLayout('down'); });
  67. //lock click
  68. aJQobj.find('#menuAreaLayoutLock' + this.cvalID).click( function(){ layoutObj.lock(); } );
  69. //delete click
  70. aJQobj.find('#menuAreaLayoutDelete' + this.cvalID).click(function(){ layoutObj.deleteLayoutOptions(); });
  71. } else {
  72. aobj = $("#ccm-layout-options-menu-" + this.cvalID);
  73. }
  74. ccm_fadeInMenu(aobj, e);
  75. }
  76. this.moveLayout=function(direction){
  77. this.moving=1;
  78. ccm_hideHighlighter();
  79. this.highlightAreas(1);
  80. this.servicesAjax = $.ajax({
  81. url: CCM_TOOLS_PATH + '/layout_services/?cID=' + CCM_CID + '&arHandle=' + encodeURIComponent(this.area) + '&layoutID=' + this.layout_id + '&cvalID=' + this.cvalID + '&task=move&direction=' + direction,
  82. success: function(response){
  83. eval('var jObj='+response);
  84. if(parseInt(jObj.success)!=1){
  85. alert(jObj.msg);
  86. }else{
  87. //success
  88. ccm_mainNavDisableDirectExit();
  89. }
  90. }
  91. });
  92. var el = $('#ccm-layout-wrapper-'+this.cvalID);
  93. var layoutObj = this;
  94. if(direction=='down'){
  95. var nextLayout = el.next();
  96. if( nextLayout.hasClass('ccm-layout-wrapper') ){
  97. el.slideUp(600,function(){
  98. el.insertAfter(nextLayout);
  99. el.slideDown(600,function(){ layoutObj.highlightAreas(0); layoutObj.moving=0; });
  100. })
  101. return;
  102. }
  103. //at boundry
  104. ccmAlert.hud( ccmi18n.moveLayoutAtBoundary, 4000, 'icon_move_down', ccmi18n.moveLayoutDown);
  105. }else if(direction=='up'){
  106. var previousLayout = el.prev();
  107. if( previousLayout.hasClass('ccm-layout-wrapper') ){
  108. el.slideUp(600,function(){
  109. el.insertBefore(previousLayout);
  110. el.slideDown(600,function(){ layoutObj.highlightAreas(0); layoutObj.moving=0; });
  111. })
  112. return;
  113. }
  114. //at boundry
  115. ccmAlert.hud( ccmi18n.moveLayoutAtBoundary, 4000, 'icon_move_up', ccmi18n.moveLayoutUp);
  116. }
  117. }
  118. this.lock=function(lock,twinLock){
  119. var a = $('#menuAreaLayoutLock' + this.cvalID);
  120. this.locked = !this.locked;
  121. if( this.locked ){
  122. a.html(ccmi18n.unlockAreaLayout);
  123. if(this.s) this.s.slider( 'disable' );
  124. }else{
  125. a.find('span').html(ccmi18n.lockAreaLayout);
  126. if(this.s) this.s.slider( 'enable');
  127. }
  128. var lock = (this.locked) ? 1 : 0;
  129. if(!twinLock){
  130. this.servicesAjax = $.ajax({
  131. url: CCM_TOOLS_PATH + '/layout_services/?cID=' + CCM_CID + '&arHandle=' + encodeURIComponent(this.area) + '&layoutID=' + this.layout_id + '&task=lock&lock=' + lock,
  132. success: function(response){
  133. eval('var jObj='+response);
  134. if(parseInt(jObj.success)!=1){
  135. alert(jObj.msg);
  136. }else{
  137. //success
  138. }
  139. }
  140. });
  141. this.getTwins();
  142. for(var i=0;i<this.layoutTwinObjs.length;i++)
  143. this.layoutTwinObjs[i].lock(lock,1);
  144. }
  145. }
  146. this.hasBeenQuickSaved=0;
  147. this.quickSaveLayoutId=0;
  148. this.quickSave=function(){
  149. var breakPoints=this.ccmControls.find('#layout_col_break_points_'+this.cvalID).val().replace(/%/g,'');
  150. clearTimeout(this.secondSavePauseTmr);
  151. if(!this.hasBeenQuickSaved && this.quickSaveInProgress){
  152. quickSaveLayoutObj=this;
  153. this.secondSavePauseTmr=setTimeout('quickSaveLayoutObj.quickSave()',100);
  154. return;
  155. }
  156. this.quickSaveInProgress=1;
  157. var layoutObj = this;
  158. var modifyLayoutId = (this.quickSaveLayoutId) ? this.quickSaveLayoutId : this.layout_id;
  159. this.quickSaveAjax = $.ajax({
  160. url: CCM_TOOLS_PATH + '/layout_services/?cID=' + CCM_CID + '&arHandle=' + encodeURIComponent(this.area) + '&layoutID=' + modifyLayoutId + '&task=quicksave&breakpoints='+encodeURIComponent(breakPoints),
  161. success: function(response){
  162. eval('var jObj='+response);
  163. if(parseInt(jObj.success)!=1){
  164. alert(jObj.msg);
  165. }else{
  166. //success
  167. layoutObj.hasBeenQuickSaved=1;
  168. layoutObj.quickSaveInProgress=0;
  169. if(jObj.layoutID){
  170. layoutObj.quickSaveLayoutId = jObj.layoutID;
  171. }
  172. ccm_mainNavDisableDirectExit();
  173. }
  174. }
  175. });
  176. }
  177. this.deleteLayoutOptions=function(){
  178. var hasBlocks=0;
  179. deleteLayoutObj=this;
  180. this.layoutWrapper.find('.ccm-block').each(function(i,el){
  181. if(el.style.display!='none') hasBlocks=1;
  182. })
  183. var dialogHeight=(hasBlocks)?'135px':'70px';
  184. $.fn.dialog.open({
  185. title: ccmi18n.deleteLayoutOptsTitle,
  186. href: CCM_TOOLS_PATH + '/layout_services/?cID=' + CCM_CID + '&arHandle=' + encodeURIComponent(this.area) + '&layoutID=' + this.layout_id + '&task=deleteOpts&hasBlocks='+hasBlocks,
  187. width: '340px',
  188. modal: false,
  189. appendButtons: true,
  190. height: dialogHeight
  191. });
  192. }
  193. this.deleteLayout=function(deleteBlocks){
  194. ccm_hideMenus();
  195. jQuery.fn.dialog.closeTop();
  196. this.layoutWrapper.slideUp(300);
  197. jQuery.fn.dialog.showLoader();
  198. var cvalID = this.cvalID;
  199. this.servicesAjax = $.ajax({
  200. url: CCM_TOOLS_PATH + '/layout_services/?cID=' + CCM_CID + '&arHandle=' + encodeURIComponent(this.area) + '&layoutID=' + this.layout_id + '&task=delete&deleteBlocks='+parseInt(deleteBlocks),
  201. success: function(response){
  202. eval('var jObj='+response);
  203. if(parseInt(jObj.success)!=1){
  204. alert(jObj.msg);
  205. jQuery.fn.dialog.hideLoader();
  206. }else{
  207. //success
  208. $('#ccm-layout-wrapper-'+cvalID).remove();
  209. ccm_hideHighlighter();
  210. ccm_mainNavDisableDirectExit();
  211. if(jObj.refreshPage) window.location = window.location;
  212. else jQuery.fn.dialog.hideLoader();
  213. }
  214. }
  215. });
  216. }
  217. this.gridSizing = function(){
  218. this.ccmGrid=$("#ccm-layout-"+this.layout_id);
  219. //append layout id to start of all selectors
  220. var cols=parseInt( this.ccmControls.find('.layout_column_count').val() );
  221. if(cols>1){
  222. var startPoints=this.ccmControls.find('#layout_col_break_points_'+this.cvalID).val().replace(/%/g,'').split('|');
  223. this.s = this.ccmControls.find(".ccm-layout-controls-slider");
  224. this.s.get(0).layoutObj=this;
  225. this.s.get(0).ccmGrid=this.ccmGrid;
  226. this.s.slider( {
  227. step: 1,
  228. values: startPoints,
  229. change: function(){
  230. if(this.layoutObj.dontUpdateTwins) return;
  231. this.layoutObj.resizeGrid(this.childNodes);
  232. var breakPoints=[];
  233. for(var z=0;z<this.childNodes.length;z++)
  234. breakPoints.push( parseFloat(this.childNodes[z].style.left.replace('%','')) );
  235. breakPoints.sort( function(a, b){ return (a-b); } );
  236. this.layoutObj.ccmControls.find('.layout_col_break_points').val( breakPoints.join('%|')+'%' );
  237. this.layoutObj.quickSave();
  238. ccm_arrangeMode=0;
  239. this.layoutObj.moving=0;
  240. this.layoutObj.highlightAreas(0);
  241. },
  242. slide:function(){
  243. ccm_arrangeMode=1;
  244. this.layoutObj.moving=1;
  245. if(this.layoutObj.dontUpdateTwins) return;
  246. this.layoutObj.resizeGrid(this.childNodes);
  247. }
  248. });
  249. if( parseInt(this.ccmControls.find('.layout_locked').val()) ) this.s.slider( 'disable' );
  250. }
  251. }
  252. this.getTwins=function(){
  253. if(!this.layoutTwins){
  254. this.layoutTwins = $('.ccm-layout-controls-layoutID-'+this.layout_id).not(this.ccmControls);
  255. this.layoutTwinObjs=[];
  256. for(var q=0;q<this.layoutTwins.length;q++){
  257. this.layoutTwinObjs.push( this.layoutTwins[q].layoutObj );
  258. this.layoutTwins[q].handles = $(this.layoutTwins[q]).find('.ui-slider-handle');
  259. }
  260. }
  261. return this.layoutTwins;
  262. }
  263. this.resizeGrid=function(childNodes){
  264. var positions=[];
  265. this.getTwins();
  266. for(var y=0;y<childNodes.length;y++){
  267. var pos=parseFloat(childNodes[y].style.left.replace('%',''));
  268. positions.push(pos);
  269. if(!this.dontUpdateTwins) for(var w=0;w<this.layoutTwinObjs.length;w++){
  270. this.layoutTwinObjs[w].dontUpdateTwins=1;
  271. this.layoutTwinObjs[w].s.slider('values',y,pos);
  272. }
  273. }
  274. positions.sort( function(a, b){ return (a-b); } );
  275. var prevW=0;
  276. var i;
  277. for(i=0;i<positions.length;i++){
  278. var pos=positions[i];
  279. var w=pos-prevW;
  280. prevW+=w;
  281. $('.ccm-layout-'+this.layout_id+'-col-'+(i+1)).css('width',w+'%');
  282. if(!this.dontUpdateTwins) for(j=0;j<this.layoutTwins.length;j++)
  283. this.layoutTwins[j].handles[i].style.left=pos+'%';
  284. }
  285. $('.ccm-layout-'+this.layout_id+'-col-'+(i+1)).css('width',(100-prevW)+'%');
  286. }
  287. }
  288. var quickSaveLayoutObj;
  289. var deleteLayoutObj;
  290. var ccmLayoutEdit = {
  291. init:function(){
  292. this.showPresetDeleteIcon();
  293. //change preset selector
  294. $('#ccmLayoutPresentIdSelector').change(function(){
  295. //ccmLayoutEdit.showPresetDeleteIcon();
  296. var lpID = parseInt($(this).val());
  297. var layoutID = $('#ccmAreaLayoutForm_layoutID').val();
  298. jQuery.fn.dialog.showLoader();
  299. if (lpID > 0) {
  300. var action = $('#ccm-layout-refresh-action').val() + '&lpID=' + lpID;
  301. } else {
  302. var action = $('#ccm-layout-refresh-action').val() + '&layoutID=' + layoutID;
  303. }
  304. $.get(action, function(r) {
  305. $("#ccm-layout-edit-wrapper").html(r);
  306. jQuery.fn.dialog.hideLoader();
  307. ccmLayoutEdit.showPresetDeleteIcon();
  308. });
  309. })
  310. $('#layoutPresetActionNew input[name=layoutPresetAction]').click(function() {
  311. if ($(this).val() == 'create_new_preset' && $(this).prop('checked')) {
  312. $('input[name=layoutPresetName]').attr('disabled', false).focus();
  313. } else {
  314. $('input[name=layoutPresetName]').val('').attr('disabled', true);
  315. }
  316. });
  317. $('#layoutPresetActions input[name=layoutPresetAction]').click(function() {
  318. if ($(this).val() == 'create_new_preset' && $(this).prop('checked')) {
  319. $('input[name=layoutPresetNameAlt]').attr('disabled', false).focus();
  320. } else {
  321. $('input[name=layoutPresetNameAlt]').val('').attr('disabled', true);
  322. }
  323. });
  324. if ($("#layoutPresetActions").length > 0) {
  325. $("#ccmLayoutConfigOptions input, #ccmLayoutConfigOptions select").bind('change click', function(){
  326. //if( $('#ccmLayoutPresentIdSelector').val() > 0 ){
  327. $("#layoutPresetActions").show();
  328. $("#layoutPresetActionNew").hide();
  329. $("#ccmLayoutConfigOptions input, #ccmLayoutConfigOptions select").unbind('change click');
  330. //}
  331. });
  332. }
  333. },
  334. showPresetDeleteIcon: function() {
  335. if ($('#ccmLayoutPresentIdSelector').val() > 0) {
  336. $("#ccm-layout-delete-preset").show();
  337. } else {
  338. $("#ccm-layout-delete-preset").hide();
  339. }
  340. },
  341. deletePreset: function() {
  342. var lpID = parseInt($('#ccmLayoutPresentIdSelector').val());
  343. if (lpID > 0) {
  344. if( !confirm(ccmi18n.confirmLayoutPresetDelete) ) return false;
  345. jQuery.fn.dialog.showLoader();
  346. var area=$('#ccmAreaLayoutForm_arHandle').val();
  347. var url = CCM_TOOLS_PATH + '/layout_services/?cID=' + CCM_CID + '&arHandle=' + encodeURIComponent(area) + '&task=deletePreset&lpID=' + lpID
  348. $.get(url, function(r) {
  349. eval('var jObj='+r);
  350. if(parseInt(jObj.success)!=1){
  351. alert(jObj.msg);
  352. }else{
  353. //success
  354. $("#ccmLayoutPresentIdSelector option[value='"+lpID+"']").remove();
  355. }
  356. jQuery.fn.dialog.hideLoader();
  357. });
  358. }
  359. }
  360. }