diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 11b1e0b70..3e94f4b34 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -246,35 +246,6 @@ jQuery(function($){ // Display the dashboard in two column $('.dashboard>.section>.portlet:odd').after('
'); - // TODO: Site Map -// var siteMap = $('.siteMap'); -// var siteItem = siteMap.find('li'); -// siteItem -// .prepend('') -// .append('') -// .mouseover(function(){ -// $(this).addClass('active'); -// $('.vr').each(function(){ -// var myHeight = $(this).parent('li').height(); -// $(this).height(myHeight); -// }); -// return false; -// }) -// .mouseout(function(){ -// $(this).removeClass('active'); -// }) -// .find('.moveTo+input').each(function(){ -// $(this).width(this.value.length+'em'); -// }); -// siteMap.find('.moveTo') -// .focus(function(){ -// $(this).parent('li').mouseover(); -// }) -// .blur(function(){ -// $(this).mouseout(); -// }); -// siteMap.find('li:first-child').css('border','0'); - // Toggle Contents $('a.tgAnchor') .click(function(){ @@ -419,4 +390,142 @@ jQuery(function($){ // Display all sections then hide this button $(this).hide().parent().prevAll('.section').show(); }); + + // TODO module finder + + +}); + +// Sortable table +jQuery(function($){ + +var + dragging = false, + $holder = $(' '); + +$('table.sortable') + .delegate('button.dragBtn', 'mousedown.st', function(event){ + var $this, $tr, $table, $th, height, width, offset, position, offsets, i, dropzone, cols; + + if(event.which != 1) return; + + $this = $(this); + + // before event trigger + before_event = $.Event('before-drag.st'); + $this.trigger(before_event); + + // is event canceled? + if(before_event.isDefaultPrevented()) return false; + + $tr = $this.closest('tr'); + $table = $this.closest('table').css('position','relative'); + height = $tr.height(); + width = $tr.width(); + + position = {x:event.pageX, y:event.pageY}; + offset = getOffset($tr.get(0), $table.get(0)); + + $clone = $tr.attr('target', true).clone(true).appendTo($table); + + // get colspan + cols = ($th=$table.find('thead th')).length; + $th.filter('[colspan]').attr('colspan', function(idx,attr){ cols += attr - 1; }); + $holder.find('td').attr('colspan', cols); + + // get offsets of all list-item elements + offsets = []; + $table.find('tbody>tr:not([target])').each(function() { + var $this = $(this), o; + + o = getOffset(this, $table.get(0)); + offsets.push({top:o.top, bottom:o.top+32, $item:$(this)}); + }); + + $clone + .addClass('draggable') + .css({ + position: 'absolute', + opacity : .6, + width : width, + height : height, + left : offset.left, + top : offset.top, + zIndex : 100 + }); + + // Set a place holder + $holder + .css({ + position:'absolute', + opacity : .6, + width : width, + height : '10px', + left : offset.left, + top : offset.top, + backgroundColor : '#bbb', + overflow: 'hidden', + zIndex : 99 + }) + .appendTo($table); + + $tr.css('opacity', .6); + + $(document) + .unbind('mousedown.st mouseup.st') + .bind('mousemove.st', function(event) { + var diff, nTop, item, i, c, o; + + dropzone = null; + + diff = {x:position.x-event.pageX, y:position.y-event.pageY}; + nTop = offset.top - diff.y; + + for(i=0,c=offsets.length; i < c; i++) { + o = offsets[i]; + if(o.top > nTop || o.bottom < nTop) continue; + + dropzone = {element:o.$item}; + if(o.top > nTop - 12) { + dropzone.state = 'before'; + $holder.css('top', o.top-5); + } else { + dropzone.state = 'after'; + $holder.css('top', o.bottom-5); + } + } + + $clone.css({top:nTop}); + }) + .bind('mouseup.st', function(event) { + var $dropzone; + + dragging = false; + + $(document).unbind('mousemove.st mouseup.st'); + $tr.removeAttr('target').css('opacity', ''); + $clone.remove(); + $holder.remove(); + + if(!dropzone) return; + $dropzone = $(dropzone.element); + + // use the clone for animation + $dropzone[dropzone.state]($tr); + }); + }) + +function getOffset(elem, offsetParent) { + var top = 0, left = 0; + + while(elem && elem != offsetParent) { + top += elem.offsetTop; + left += elem.offsetLeft; + + elem = elem.offsetParent; + } + + return {top:top, left:left}; +} + });