home_drag.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /*
  2. [Discuz!] (C)2001-2099 Comsenz Inc.
  3. This is NOT a freeware, use is subject to license terms
  4. $Id: home_drag.js 32655 2013-02-28 04:08:00Z zhengqingpeng $
  5. */
  6. var Drags = [];
  7. var nDrags = 1;
  8. var mouseOffset = null;
  9. var iMouseDown = false;
  10. var lMouseState = false;
  11. var dragObject = null;
  12. var DragDrops = [];
  13. var curTarget = null;
  14. var lastTarget = null;
  15. var dragHelper = null;
  16. var tempDiv = null;
  17. var rootParent = null;
  18. var rootSibling = null;
  19. var D1Target = null;
  20. Number.prototype.NaN0=function(){return isNaN(this)?0:this;};
  21. function CreateDragContainer(){
  22. var cDrag = DragDrops.length;
  23. DragDrops[cDrag] = [];
  24. for(var i=0; i<arguments.length; i++){
  25. var cObj = arguments[i];
  26. DragDrops[cDrag].push(cObj);
  27. cObj.setAttribute('DropObj', cDrag);
  28. for(var j=0; j<cObj.childNodes.length; j++){
  29. if(cObj.childNodes[j].nodeName=='#text') continue;
  30. cObj.childNodes[j].setAttribute('DragObj', cDrag);
  31. }
  32. }
  33. }
  34. function getPosition(e){
  35. var left = 0;
  36. var top = 0;
  37. while (e.offsetParent){
  38. left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
  39. top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
  40. e = e.offsetParent;
  41. }
  42. left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
  43. top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
  44. return {x:left, y:top};
  45. }
  46. function mouseCoords(ev){
  47. if(ev.pageX || ev.pageY){
  48. return {x:ev.pageX, y:ev.pageY};
  49. }
  50. return {
  51. x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
  52. y:ev.clientY + document.body.scrollTop - document.body.clientTop
  53. };
  54. }
  55. function writeHistory(object, message){
  56. if(!object || !object.parentNode || typeof object.parentNode.getAttribute == 'unknown' || !object.parentNode.getAttribute) return;
  57. var historyDiv = object.parentNode.getAttribute('history');
  58. if(historyDiv){
  59. historyDiv = document.getElementById(historyDiv);
  60. historyDiv.appendChild(document.createTextNode(object.id+': '+message));
  61. historyDiv.appendChild(document.createElement('BR'));
  62. historyDiv.scrollTop += 50;
  63. }
  64. }
  65. function getMouseOffset(target, ev){
  66. ev = ev || window.event;
  67. var docPos = getPosition(target);
  68. var mousePos = mouseCoords(ev);
  69. return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
  70. }
  71. function mouseMove(ev){
  72. ev = ev || window.event;
  73. var target = ev.target || ev.srcElement;
  74. var mousePos = mouseCoords(ev);
  75. if(Drags[0]){
  76. if(lastTarget && (target!==lastTarget)){
  77. writeHistory(lastTarget, 'Mouse Out Fired');
  78. var origClass = lastTarget.getAttribute('origClass');
  79. if(origClass) lastTarget.className = origClass;
  80. }
  81. var dragObj = target.getAttribute('DragObj');
  82. if(dragObj!=null){
  83. if(target!=lastTarget){
  84. writeHistory(target, 'Mouse Over Fired');
  85. var oClass = target.getAttribute('overClass');
  86. if(oClass){
  87. target.setAttribute('origClass', target.className);
  88. target.className = oClass;
  89. }
  90. }
  91. if(iMouseDown && !lMouseState){
  92. writeHistory(target, 'Start Dragging');
  93. curTarget = target;
  94. rootParent = curTarget.parentNode;
  95. rootSibling = curTarget.nextSibling;
  96. mouseOffset = getMouseOffset(target, ev);
  97. for(var i=0; i<dragHelper.childNodes.length; i++) dragHelper.removeChild(dragHelper.childNodes[i]);
  98. dragHelper.appendChild(curTarget.cloneNode(true));
  99. dragHelper.style.display = 'block';
  100. var dragClass = curTarget.getAttribute('dragClass');
  101. if(dragClass){
  102. dragHelper.firstChild.className = dragClass;
  103. }
  104. dragHelper.firstChild.removeAttribute('DragObj');
  105. var dragConts = DragDrops[dragObj];
  106. curTarget.setAttribute('startWidth', parseInt(curTarget.offsetWidth));
  107. curTarget.setAttribute('startHeight', parseInt(curTarget.offsetHeight));
  108. curTarget.style.display = 'none';
  109. for(var i=0; i<dragConts.length; i++){
  110. with(dragConts[i]){
  111. var pos = getPosition(dragConts[i]);
  112. setAttribute('startWidth', parseInt(offsetWidth));
  113. setAttribute('startHeight', parseInt(offsetHeight));
  114. setAttribute('startLeft', pos.x);
  115. setAttribute('startTop', pos.y);
  116. }
  117. for(var j=0; j<dragConts[i].childNodes.length; j++){
  118. with(dragConts[i].childNodes[j]){
  119. if((nodeName=='#text') || (dragConts[i].childNodes[j]==curTarget)) continue;
  120. var pos = getPosition(dragConts[i].childNodes[j]);
  121. setAttribute('startWidth', parseInt(offsetWidth));
  122. setAttribute('startHeight', parseInt(offsetHeight));
  123. setAttribute('startLeft', pos.x);
  124. setAttribute('startTop', pos.y);
  125. }
  126. }
  127. }
  128. }
  129. }
  130. if(curTarget){
  131. dragHelper.style.top = (mousePos.y - mouseOffset.y)+"px";
  132. dragHelper.style.left = (mousePos.x - mouseOffset.x)+"px";
  133. var dragConts = DragDrops[curTarget.getAttribute('DragObj')];
  134. var activeCont = null;
  135. var xPos = mousePos.x - mouseOffset.x + (parseInt(curTarget.getAttribute('startWidth')) /2);
  136. var yPos = mousePos.y - mouseOffset.y + (parseInt(curTarget.getAttribute('startHeight'))/2);
  137. for(var i=0; i<dragConts.length; i++){
  138. with(dragConts[i]){
  139. if((parseInt(getAttribute('startLeft')) < xPos) &&
  140. (parseInt(getAttribute('startTop')) < yPos) &&
  141. ((parseInt(getAttribute('startLeft')) + parseInt(getAttribute('startWidth'))) > xPos) &&
  142. ((parseInt(getAttribute('startTop')) + parseInt(getAttribute('startHeight'))) > yPos)){
  143. activeCont = dragConts[i];
  144. break;
  145. }
  146. }
  147. }
  148. if(activeCont){
  149. if(activeCont!=curTarget.parentNode){
  150. writeHistory(curTarget, 'Moved into '+activeCont.id);
  151. }
  152. var beforeNode = null;
  153. for(var i=activeCont.childNodes.length-1; i>=0; i--){
  154. with(activeCont.childNodes[i]){
  155. if(nodeName=='#text') continue;
  156. if(curTarget != activeCont.childNodes[i] &&
  157. ((parseInt(getAttribute('startLeft')) + parseInt(getAttribute('startWidth'))) > xPos) &&
  158. ((parseInt(getAttribute('startTop')) + parseInt(getAttribute('startHeight'))) > yPos)){
  159. beforeNode = activeCont.childNodes[i];
  160. }
  161. }
  162. }
  163. if(beforeNode){
  164. if(beforeNode!=curTarget.nextSibling){
  165. writeHistory(curTarget, 'Inserted Before '+beforeNode.id);
  166. activeCont.insertBefore(curTarget, beforeNode);
  167. }
  168. } else {
  169. if((curTarget.nextSibling) || (curTarget.parentNode!=activeCont)){
  170. writeHistory(curTarget, 'Inserted at end of '+activeCont.id);
  171. activeCont.appendChild(curTarget);
  172. }
  173. }
  174. setTimeout(function(){
  175. var contPos = getPosition(activeCont);
  176. activeCont.setAttribute('startWidth', parseInt(activeCont.offsetWidth));
  177. activeCont.setAttribute('startHeight', parseInt(activeCont.offsetHeight));
  178. activeCont.setAttribute('startLeft', contPos.x);
  179. activeCont.setAttribute('startTop', contPos.y);}, 5);
  180. if(curTarget.style.display!=''){
  181. writeHistory(curTarget, 'Made Visible');
  182. curTarget.style.display = '';
  183. curTarget.style.visibility = 'hidden';
  184. }
  185. } else {
  186. if(curTarget.style.display!='none'){
  187. writeHistory(curTarget, 'Hidden');
  188. curTarget.style.display = 'none';
  189. }
  190. }
  191. }
  192. lMouseState = iMouseDown;
  193. lastTarget = target;
  194. }
  195. if(dragObject){
  196. dragObject.style.position = 'absolute';
  197. dragObject.style.top = mousePos.y - mouseOffset.y;
  198. dragObject.style.left = mousePos.x - mouseOffset.x;
  199. }
  200. lMouseState = iMouseDown;
  201. if(curTarget || dragObject) return false;
  202. }
  203. function mouseUp(ev){
  204. if(Drags[0]){
  205. if(curTarget){
  206. writeHistory(curTarget, 'Mouse Up Fired');
  207. dragHelper.style.display = 'none';
  208. if(curTarget.style.display == 'none'){
  209. if(rootSibling){
  210. rootParent.insertBefore(curTarget, rootSibling);
  211. } else {
  212. rootParent.appendChild(curTarget);
  213. }
  214. }
  215. curTarget.style.display = '';
  216. curTarget.style.visibility = 'visible';
  217. }
  218. curTarget = null;
  219. }
  220. dragObject = null;
  221. iMouseDown = false;
  222. }
  223. function mouseDown(ev){
  224. mousedown(ev);
  225. ev = ev || window.event;
  226. var target = ev.target || ev.srcElement;
  227. iMouseDown = true;
  228. if(Drags[0]){
  229. if(lastTarget){
  230. writeHistory(lastTarget, 'Mouse Down Fired');
  231. }
  232. }
  233. if(target.onmousedown || target.getAttribute('DragObj')){
  234. return false;
  235. }
  236. }
  237. function makeDraggable(item){
  238. if(!item) return;
  239. item.onmousedown = function(ev){
  240. dragObject = this;
  241. mouseOffset = getMouseOffset(this, ev);
  242. return false;
  243. }
  244. }
  245. function init_drag2(){
  246. document.onmousemove = mouseMove;
  247. document.onmousedown = mouseDown;
  248. document.onmouseup = mouseUp;
  249. Drags[0] = $('Drags0');
  250. if(Drags[0]){
  251. CreateDragContainer($('DragContainer0'));
  252. }
  253. if(Drags[0]){
  254. var cObj = $('applistcontent');
  255. dragHelper = document.createElement('div');
  256. dragHelper.style.cssName = "apps dragable";
  257. dragHelper.style.cssText = 'position:absolute;display:none;width:777px;';
  258. cObj.parentNode.insertBefore(dragHelper, cObj);
  259. }
  260. }
  261. function mousedown(evnt){
  262. }