decir/js/admin/reorder.js
changeset 10 36bc382ed459
parent 9 6d9655e02026
equal deleted inserted replaced
9:6d9655e02026 10:36bc382ed459
     1 var reorder_state = {
     1 var reorder_state = {
     2   _: false,
     2   _: false,
     3   type: false,
     3   type: false,
     4   id: false,
     4   id: false,
     5   obj: false,
     5   obj: false,
     6   over: false
     6   over: false,
       
     7   topped: false
     7 }
     8 }
     8 
     9 
     9 function decir_admin_dragforum_start(e)
    10 function decir_admin_dragforum_start(e)
    10 {
    11 {
    11   document.onmouseup = decir_admin_dragforum_close;
    12   document.onmouseup = decir_admin_dragforum_close;
    30   setMousePos(e);
    31   setMousePos(e);
    31   
    32   
    32   // Determine threshold for moving the target
    33   // Determine threshold for moving the target
    33   var nodes = reorder_state.obj.parentNode.parentNode.childNodes;
    34   var nodes = reorder_state.obj.parentNode.parentNode.childNodes;
    34   var threshold = new Object();
    35   var threshold = new Object();
       
    36   var f = false; 
    35   for ( var i = 0; i < nodes.length; i++ )
    37   for ( var i = 0; i < nodes.length; i++ )
    36   {
    38   {
    37     var node = nodes[i];
    39     var node = nodes[i];
    38     if ( node.tagName == 'TR' && node.DecirForumID )
    40     if ( node.tagName == 'TR' && node.DecirForumID )
    39     {
    41     {
       
    42       if ( !f )
       
    43       {
       
    44         // this is the first row
       
    45         // get the top and add a new threshold entry for the border-top exception
       
    46         var t = $(node).Top();
       
    47         threshold[0] = {
       
    48           top: t,
       
    49           realid: node.DecirForumID,
       
    50           node: node
       
    51         }
       
    52       }
       
    53       f = true;
    40       // This is a row with a forum in it - add to the threshold list.
    54       // This is a row with a forum in it - add to the threshold list.
    41       var t = $(node).Top();
    55       var t = $(node).Top();
    42       var h = $(node).Height();
    56       var h = $(node).Height();
    43       threshold[node.DecirForumID] = t + ( h / 2 );
    57       threshold[node.DecirForumID] = t + ( h / 2 );
    44     }
    58     }
    48   var current_threshold = threshold[ reorder_state.over.parentNode.DecirForumID ];
    62   var current_threshold = threshold[ reorder_state.over.parentNode.DecirForumID ];
    49   var next_threshold = threshold[ parseInt(reorder_state.over.parentNode.DecirForumID) + 1 ];
    63   var next_threshold = threshold[ parseInt(reorder_state.over.parentNode.DecirForumID) + 1 ];
    50   if ( !next_threshold )
    64   if ( !next_threshold )
    51     next_threshold = -1;
    65     next_threshold = -1;
    52   // window.console.debug('current ', current_threshold, ' next ', next_threshold);
    66   // window.console.debug('current ', current_threshold, ' next ', next_threshold);
    53   if ( mouseY < current_threshold )
    67   reorder_state.topped = false;
    54   {
    68   if ( mouseY <= threshold[0].top )
    55     var prev_tr = reorder_state.over.parentNode.previousSibling;
    69   {
    56     if ( !prev_tr )
       
    57       // already at the top
       
    58       return false;
       
    59     // find the prev_td
       
    60     var i = 0;
       
    61     var prev_td;
       
    62     while ( true )
       
    63     {
       
    64       prev_td = prev_tr.childNodes[i];
       
    65       if ( !prev_td )
       
    66         continue;
       
    67       if ( prev_td.tagName == 'TD' || i == 10000 )
       
    68         break;
       
    69       i++;
       
    70     }
       
    71     if ( prev_td.tagName != 'TD' )
       
    72       return false;
       
    73     reorder_state.over.style.borderBottom = null;
    70     reorder_state.over.style.borderBottom = null;
    74     reorder_state.over = prev_td;
    71     reorder_state.over.style.borderTop = null;
    75     reorder_state.over.style.borderBottom = '5px solid #000000';
    72     
    76   }
    73     var next_tr = threshold[0].node;
    77   else if ( mouseY > next_threshold && next_threshold > -1 )
    74     
    78   {
       
    79     var next_tr = reorder_state.over.parentNode.nextSibling;
       
    80     if ( !next_tr )
       
    81       // already at the top
       
    82       return false;
       
    83     // find the next_td
    75     // find the next_td
    84     var i = 0;
    76     var i = 0;
    85     var next_td;
    77     var next_td;
    86     while ( true )
    78     while ( true )
    87     {
    79     {
    99     }
    91     }
   100     if ( !next_td )
    92     if ( !next_td )
   101       return false;
    93       return false;
   102     if ( next_td.tagName != 'TD' )
    94     if ( next_td.tagName != 'TD' )
   103       return false;
    95       return false;
       
    96     
       
    97     reorder_state.over = next_td;
       
    98     reorder_state.over.style.borderTop = '5px solid #000000';
       
    99     reorder_state.topped = true;
       
   100   }
       
   101   else if ( mouseY < current_threshold )
       
   102   {
       
   103     var prev_tr = reorder_state.over.parentNode.previousSibling;
       
   104     if ( !prev_tr )
       
   105       // already at the top
       
   106       return false;
       
   107     // find the prev_td
       
   108     var i = 0;
       
   109     var prev_td;
       
   110     while ( true )
       
   111     {
       
   112       prev_td = prev_tr.childNodes[i];
       
   113       if ( !prev_td )
       
   114         continue;
       
   115       if ( prev_td.tagName == 'TD' || i == 10000 )
       
   116         break;
       
   117       i++;
       
   118     }
       
   119     if ( prev_td.tagName != 'TD' )
       
   120       return false;
   104     reorder_state.over.style.borderBottom = null;
   121     reorder_state.over.style.borderBottom = null;
       
   122     reorder_state.over.style.borderTop = null;
       
   123     reorder_state.over = prev_td;
       
   124     reorder_state.over.style.borderBottom = '5px solid #000000';
       
   125   }
       
   126   else if ( mouseY > next_threshold && next_threshold > -1 )
       
   127   {
       
   128     var next_tr = reorder_state.over.parentNode.nextSibling;
       
   129     if ( !next_tr )
       
   130       // already at the top
       
   131       return false;
       
   132     // find the next_td
       
   133     var i = 0;
       
   134     var next_td;
       
   135     while ( true )
       
   136     {
       
   137       next_td = next_tr.childNodes[i];
       
   138       if ( i >= 100 )
       
   139         break;
       
   140       if ( !next_td )
       
   141       {
       
   142         i++;
       
   143         continue;
       
   144       }
       
   145       if ( next_td.tagName == 'TD' || i == 100 )
       
   146         break;
       
   147       i++;
       
   148     }
       
   149     if ( !next_td )
       
   150       return false;
       
   151     if ( next_td.tagName != 'TD' )
       
   152       return false;
       
   153     reorder_state.over.style.borderBottom = null;
       
   154     reorder_state.over.style.borderTop = null;
   105     reorder_state.over = next_td;
   155     reorder_state.over = next_td;
   106     reorder_state.over.style.borderBottom = '5px solid #000000';
   156     reorder_state.over.style.borderBottom = '5px solid #000000';
   107   }
   157   }
   108 }
   158 }
   109 
   159 
   114   for ( var i = 0; i < forums.length; i++ )
   164   for ( var i = 0; i < forums.length; i++ )
   115   {
   165   {
   116     forums[i].onmousedown = decir_admin_dragforum_start;
   166     forums[i].onmousedown = decir_admin_dragforum_start;
   117     forums[i].style.cursor = 'move';
   167     forums[i].style.cursor = 'move';
   118     forums[i].style.borderBottom = null;
   168     forums[i].style.borderBottom = null;
       
   169     forums[i].style.borderTop = null;
   119   }
   170   }
   120 }
   171 }
   121 
   172 
   122 function decir_admin_dragforum_close(e)
   173 function decir_admin_dragforum_close(e)
   123 {
   174 {
   129   
   180   
   130   reorder_state._ = false;
   181   reorder_state._ = false;
   131   
   182   
   132   // Move the row (or rather copy and delete)
   183   // Move the row (or rather copy and delete)
   133   var newnode = reorder_state.obj.parentNode.cloneNode(true);
   184   var newnode = reorder_state.obj.parentNode.cloneNode(true);
   134   insertAfter(reorder_state.obj.parentNode.parentNode, newnode, reorder_state.over.parentNode);
   185   if ( reorder_state.topped )
       
   186   {
       
   187     window.console.info('before');
       
   188     reorder_state.obj.parentNode.parentNode.insertBefore(newnode, reorder_state.over.parentNode);
       
   189   }
       
   190   else
       
   191   {
       
   192     window.console.info('after');
       
   193     insertAfter(reorder_state.obj.parentNode.parentNode, newnode, reorder_state.over.parentNode);
       
   194   }
   135   reorder_state.obj.parentNode.parentNode.removeChild(reorder_state.obj.parentNode);
   195   reorder_state.obj.parentNode.parentNode.removeChild(reorder_state.obj.parentNode);
   136   
   196   
   137   // for some reason this needs to be called again in gecko (to reinit some values)
   197   // for some reason this needs to be called again in gecko (to reinit some values)
   138   decir_admin_dragforum_onload();
   198   decir_admin_dragforum_onload();
   139   
   199