Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Файл - qsorter.js (Старый размер - 16128 | Новый - 0):
- 0. - var qsorter = {
- 1. - sqr: function(x) {
- 2. - return x * x;
- 3. - },
- 4. - evCoords: function(ev) {
- 5. - return browser.android ? [ev.touches[0].pageX + (ev.pageX || 0), ev.touches[0].pageY + (ev.pageY || 0)] : [ev.pageX, ev.pageY];
- 6. - },
- 7. -
- 8. - animstop: function() {
- 9. - clearInterval(qsorter.animtimer);
- 10. - qsorter.animtimer = false;
- 11. - },
- 12. - animcache: {},
- 13. - animstep: function() {
- 14. - var finished = [], all = true, temp;
- 15. - for (var i in qsorter.animcache) {
- 16. - if (i == 0) {
- 17. - all = false;
- 18. - scrollNode.scrollTop += Math.ceil(qsorter.animcache[i] / 5);
- 19. - continue;
- 20. - }
- 21. - var a = qsorter.animcache[i], e = a.el, f = Fx.Transitions.easeOutQuint, dt = 200;
- 22. - var prev = vkNow();
- 23. - a.t += prev - a.prev;
- 24. - a.prev = prev;
- 25. - if (a.t < dt) {
- 26. - all = false;
- 27. - e.style.left = f(a.t, a.sx, a.dx, dt) + 'px';
- 28. - e.style.top = f(a.t, a.sy, a.dy, dt) + 'px';
- 29. - if (browser.msie8) { // force redraw
- 30. - temp = e.offsetLeft;
- 31. - }
- 32. - continue;
- 33. - }
- 34. - e.style.left = (a.sx + a.dx) + 'px';
- 35. - e.style.top = (a.sy + a.dy) + 'px';
- 36. - if (browser.msie8) { // force redraw
- 37. - temp = e.offsetLeft;
- 38. - }
- 39. - clearInterval(a.timer);
- 40. - finished.push(e.parentNode.id);
- 41. - if (a.h) a.h.apply(e);
- 42. - }
- 43. - for (var i in finished) {
- 44. - delete(qsorter.animcache[finished[i]]);
- 45. - }
- 46. - if (all) {
- 47. - qsorter.animstop();
- 48. - }
- 49. - },
- 50. - animdone: function(s) {
- 51. - if (s.cls) {
- 52. - domPN(this).className = s.cls;
- 53. - } else {
- 54. - removeClass(domPN(this), s.clsUp);
- 55. - }
- 56. - this.style.left = this.style.top = '';
- 57. - if (cur.qsorterSetSize) {
- 58. - setStyle(this.parentNode, {width: '', height: ''});
- 59. - }
- 60. - },
- 61. - animate: function(e, sx, sy, x, y, handler, s) {
- 62. - if (browser.msie8) {
- 63. - if (s.cls) {
- 64. - domPN(e).className = s.cls;
- 65. - } else {
- 66. - removeClass(domPN(e), s.clsUp);
- 67. - }
- 68. - e.style.left = e.style.top = '';
- 69. - if (cur.qsorterSetSize) {
- 70. - setStyle(e.parentNode, {width: '', height: ''});
- 71. - }
- 72. - return;
- 73. - }
- 74. - var anim = {t: 0, sx: sx, sy: sy, dx: x - sx, dy: y - sy, h: handler, prev: vkNow()};
- 75. - if (qsorter.animcache[e.parentNode.id]) {
- 76. - extend(qsorter.animcache[e.parentNode.id], anim);
- 77. - return;
- 78. - }
- 79. - qsorter.animcache[e.parentNode.id] = extend(anim, {el: e});
- 80. - if (!qsorter.animtimer) {
- 81. - qsorter.animtimer = setInterval(qsorter.animstep, 13);
- 82. - }
- 83. - },
- 84. -
- 85. - first: function(obj) {
- 86. - el = obj.firstChild;
- 87. - while(el && el.nodeType == 3) {
- 88. - el = el.nextSibling;
- 89. - }
- 90. - return el;
- 91. - },
- 92. -
- 93. - mousedown: function(ev) {
- 94. - var touch = ev && ev.touches && ev.touches.length == 1;
- 95. - if (ev && (ev.button == 2 || ev.which == 3 || ev.ctrlKey || ev.metaKey) && !touch) {
- 96. - return true;
- 97. - }
- 98. - if (qsorter.current) return;
- 99. - cur.qsorterOver = false;
- 100. -
- 101. - var el = this, inner = qsorter.first(el), s = el.parentNode.qsorter, evc = qsorter.evCoords(ev), size;
- 102. - if (s.canDrag) {
- 103. - if (!s.canDrag(el)) return;
- 104. - } else if (ev.target.getAttribute('nosorthandle') || el.getAttribute('nodrag')) return;
- 105. -
- 106. - qsorter.current = s;
- 107. - qsorter.nextEl = el.nextSibling;
- 108. - extend(s, {drag: el});
- 109. - setStyle(inner, {left: el.x + 'px', top: el.y + s.offset + 'px', zIndex: 150});
- 110. - if (cur.qsorterSetSize) {
- 111. - size = getSize(inner);
- 112. - }
- 113. - if (s.cls) {
- 114. - el.className = s.clsUp;
- 115. - } else {
- 116. - addClass(el, s.clsUp);
- 117. - }
- 118. - if (cur.qsorterSetSize) {
- 119. - setStyle(el, {width: size[0], height: size[1]});
- 120. - }
- 121. -
- 122. - addEvent(document, 'mousemove drag touchmove', qsorter.mousemove);
- 123. - addEvent(document, 'mouseup touchend touchcancel', qsorter.mouseup);
- 124. - if (!browser.opera && !browser.msie && !browser.mozilla && !browser.safari_mobile && !browser.android && !s.noscroll) {
- 125. - addEvent(qsorter.scrollNode, 'scroll', qsorter.mousemove);
- 126. - }
- 127. - extend(s, {
- 128. - startX: evc[0],
- 129. - startY: evc[1] + (browser.msie6 ? pageNode.scrollTop : 0),
- 130. - before: el.nextSibling,
- 131. - after: el.previousSibling
- 132. - });
- 133. - extend(qsorter, {lastX: evc[0], lastY: evc[1], lastS: scrollNode.scrollTop});
- 134. -
- 135. - if (window.Privacy) Privacy.hide(-1);
- 136. -
- 137. - cur.cancelClick = false;
- 138. -
- 139. - return touch || cancelEvent(ev);
- 140. - },
- 141. -
- 142. - checkOver: function(s, evc) {
- 143. - for (var i in s.dragEls) {
- 144. - var d = s.dragEls[i];
- 145. - if (!d.xy || d.xy[0] == 0) {
- 146. - d.xy = getXY(d);
- 147. - d.sz = getSize(d);
- 148. - }
- 149. - if (evc[0] > d.xy[0] && evc[1] > d.xy[1] && evc[0] < d.xy[0]+d.sz[0] && evc[1] < d.xy[1]+d.sz[1]) {
- 150. - if (cur.qsorterOver != d) {
- 151. - if (cur.qsorterOver) {
- 152. - s.onDragOut(cur.qsorterOver);
- 153. - }
- 154. - cur.qsorterOver = d;
- 155. - s.onDragOver(d);
- 156. - }
- 157. - } else if (cur.qsorterOver && cur.qsorterOver == d) {
- 158. - cur.qsorterOver = false;
- 159. - s.onDragOut(d);
- 160. - }
- 161. - }
- 162. - },
- 163. -
- 164. - mousemove: function(ev) {
- 165. - if (!qsorter.current) return;
- 166. -
- 167. - var cancel = true, evc = (ev.type == 'scroll') ? [qsorter.lastX, qsorter.lastY + scrollNode.scrollTop - qsorter.lastS] : qsorter.evCoords(ev);
- 168. - var s = qsorter.current;
- 169. - if (ev.type == 'scroll') {
- 170. - cancel = false;
- 171. - } else {
- 172. - qsorter.lastX = evc[0];
- 173. - qsorter.lastY = evc[1];
- 174. - qsorter.lastS = scrollNode.scrollTop;
- 175. - if (!browser.safari_mobile && !browser.android && !s.noscroll) {
- 176. - var my = evc[1] - (browser.msie6 ? 0 : scrollNode.scrollTop);
- 177. - if (my < 100) {
- 178. - qsorter.animcache[0] = my - 100;
- 179. - } else if (my > lastWindowHeight - 100) {
- 180. - qsorter.animcache[0] = my + 100 - lastWindowHeight;
- 181. - } else if (qsorter.animcache[0]) {
- 182. - delete(qsorter.animcache[0]);
- 183. - }
- 184. - if (qsorter.animcache[0] && !qsorter.animtimer) {
- 185. - qsorter.animtimer = setInterval(qsorter.animstep, 13);
- 186. - }
- 187. - }
- 188. - }
- 189. -
- 190. - var el = s.drag;
- 191. - var dx = evc[0] - s.startX;
- 192. - var dy = evc[1] + (browser.msie6 ? pageNode.scrollTop : 0) - s.startY;
- 193. - var pageSize = getSize(scrollNode), elPos = getXY(el),
- 194. - pageW = pageSize[0], pageH = Math.max(window.lastWindowHeight || 0, pageSize[1]);
- 195. - if (elPos[0] < pageW - s.width && elPos[0] + dx > pageW - s.width) {
- 196. - dx = pageW - elPos[0] - s.width;
- 197. - }
- 198. - if (elPos[1] < pageH - s.height && elPos[1] + dy > pageH - s.height) {
- 199. - dy = pageH - elPos[1] - s.height;
- 200. - }
- 201. - var x = el.x, nx = x + dx, y = el.y, ny = y + dy, w = s.width, h = s.height, temp;
- 202. - var i = el.i, xsize = s.xsize, p = i % xsize, q = Math.floor((i + 0.1) / xsize);
- 203. -
- 204. - if (dx > 10 || dx < -10 || dy > 10 || dy < -10) {
- 205. - cur.cancelClick = true;
- 206. - }
- 207. -
- 208. - setStyle(qsorter.first(el), {left: nx, top: ny + s.offset});
- 209. - if (browser.msie8) { // force redraw
- 210. - temp = el.offsetLeft;
- 211. - }
- 212. -
- 213. - if (s.dragCont && s.dragCont.visible) {
- 214. - if (evc[0] > s.dragCont.x1 && evc[1] > s.dragCont.y1 && evc[0] < s.dragCont.x2 && evc[1] < s.dragCont.y2) {
- 215. - if (!cur.sorterDragIn) {
- 216. - cur.sorterDragIn = 1;
- 217. - animate(el, {opacity: 0.2}, 400);
- 218. - }
- 219. - qsorter.checkOver(s, evc);
- 220. - return;
- 221. - } else if (cur.sorterDragIn) {
- 222. - cur.sorterDragIn = 0;
- 223. - animate(el, {opacity: 1}, 400);
- 224. - }
- 225. - if (cur.qsorterOver) {
- 226. - qsorter.checkOver(s, evc);
- 227. - }
- 228. - }
- 229. -
- 230. - var newp = Math.floor(p + 0.5 + (dx / w)),
- 231. - newq = Math.floor(q + 0.5 + (dy / h)),
- 232. - nodragq = Math.floor(s.noDragCount / xsize),
- 233. - nodragp = s.noDragCount - nodragq * xsize;
- 234. - newp = Math.min(Math.max(newp, 0), xsize - 1); newq = Math.max(newq, 0);
- 235. - if (newq < nodragq) newq = nodragq;
- 236. - if (newq == Math.ceil(s.noDragCount / xsize) - 1 && newp < nodragp) newp = nodragp;
- 237. - var newi = newq * xsize + newp;
- 238. - if (newi > s.count - 1) {
- 239. - var newd = newi - (s.count - 1);
- 240. - newq -= Math.floor((newd + 0.1) / xsize);
- 241. - newp -= newd % xsize;
- 242. - if (newp < 0) {
- 243. - newp += xsize;
- 244. - --newq;
- 245. - }
- 246. - newi = s.count - 1;
- 247. - }
- 248. - if (newi == i) return cancel ? cancelEvent(ev) : true;
- 249. -
- 250. - var op = p, oq = q, e = false, d = (newi < i) ? -1 : 1;
- 251. -
- 252. - for (var j = i; j != newi; j += d) {
- 253. - var np = p + d, nq = q;
- 254. - if (np == xsize) {
- 255. - np = 0;
- 256. - ++nq;
- 257. - } else if (np < 0) {
- 258. - np = xsize - 1;
- 259. - --nq;
- 260. - }
- 261. -
- 262. - e = s.elems[np][nq];
- 263. -
- 264. - var sx = e.x;
- 265. - var sy = e.y;
- 266. - var x = sx + (p - np) * w;
- 267. - var y = sy + (q - nq) * h;
- 268. - setStyle(qsorter.first(e), {left: sx, top: sy + s.offset});
- 269. - if (s.cls) {
- 270. - e.className = s.clsUp;
- 271. - } else {
- 272. - addClass(e, s.clsUp);
- 273. - }
- 274. - if (cur.qsorterSetSize) {
- 275. - var size = getSize(qsorter.first(e));
- 276. - setStyle(e, {width: size[0], height: size[1]});
- 277. - }
- 278. -
- 279. - extend(e, {
- 280. - i: j,
- 281. - x: x,
- 282. - y: y
- 283. - });
- 284. - s.elems[p][q] = e;
- 285. - qsorter.animate(qsorter.first(e), sx, sy+s.offset, x, y+s.offset, qsorter.animdone.bind(qsorter.first(e), s), s);
- 286. -
- 287. - p = np; q = nq;
- 288. - }
- 289. -
- 290. - if (d < 0) {
- 291. - s.parent.insertBefore(el, e);
- 292. - } else {
- 293. - if (e.nextSibling) {
- 294. - s.parent.insertBefore(el, e.nextSibling);
- 295. - } else {
- 296. - s.parent.appendChild(el);
- 297. - }
- 298. - }
- 299. -
- 300. - dx = (p - op) * w;
- 301. - dy = (q - oq) * h;
- 302. - s.elems[newp][newq] = el;
- 303. - extend(el, {
- 304. - i: newi,
- 305. - x: el.x + dx,
- 306. - y: el.y + dy
- 307. - });
- 308. -
- 309. - s.startX += dx; s.startY += dy;
- 310. -
- 311. - if (browser.msie8) { // force redraw
- 312. - temp = el.offsetLeft;
- 313. - }
- 314. -
- 315. - return cancel ? cancelEvent(ev) : true;
- 316. - },
- 317. - mouseup: function(ev) {
- 318. - if (!qsorter.current) return;
- 319. -
- 320. - var s = qsorter.current;
- 321. - var el = s.drag, evc = qsorter.evCoords(ev);
- 322. - var dx = (evc[0] || qsorter.lastX) - s.startX;
- 323. - var dy = (evc[1] || qsorter.lastY) + (browser.msie6 ? pageNode.scrollTop : 0) - s.startY + s.offset;
- 324. - setStyle(qsorter.first(el), {zIndex: 125});
- 325. - qsorter.current = s.drag = false;
- 326. - if (cur.qsorterOver) {
- 327. - if (s.onDrop(cur.qsorterOver, el)) {
- 328. - var f = qsorter.first(el);
- 329. - setStyle(f, {top: 0, left: 0})
- 330. - if (qsorter.nextEl) {
- 331. - el.parentNode.insertBefore(el, qsorter.nextEl);
- 332. - } else {
- 333. - el.parentNode.appendChild(el);
- 334. - }
- 335. - qsorter.animdone.bind(f)(s);
- 336. - qsorter.stop();
- 337. - if (qsorter.animcache[0]) {
- 338. - delete(qsorter.animcache[0]);
- 339. - if (isEmpty(qsorter.animcache)) {
- 340. - qsorter.animstop();
- 341. - }
- 342. - }
- 343. - if (cur.sorterDragIn) {
- 344. - cur.sorterDragIn = 0;
- 345. - setStyle(el, {opacity: 1});
- 346. - }
- 347. - return cancelEvent(ev);
- 348. - }
- 349. - }
- 350. -
- 351. - qsorter.animate(qsorter.first(el), el.x + dx, el.y + dy, el.x, el.y + s.offset, qsorter.animdone.bind(qsorter.first(el), s), s);
- 352. -
- 353. - qsorter.stop();
- 354. -
- 355. - if (qsorter.animcache[0]) {
- 356. - delete(qsorter.animcache[0]);
- 357. - if (isEmpty(qsorter.animcache)) {
- 358. - qsorter.animstop();
- 359. - }
- 360. - }
- 361. -
- 362. - if (cur.sorterDragIn) {
- 363. - cur.sorterDragIn = 0;
- 364. - animate(el, {opacity: 1}, 100);
- 365. - }
- 366. -
- 367. - var before = el.nextSibling, after = el.previousSibling;
- 368. - if ((before != s.before || after != s.after) && s.onReorder) {
- 369. - s.onReorder(el, before, after);
- 370. - }
- 371. - delete(s.before);
- 372. - delete(s.after);
- 373. -
- 374. - return cancelEvent(ev);
- 375. - },
- 376. - stop: function() {
- 377. - var s = qsorter.current;
- 378. - removeEvent(document, 'mousemove drag touchmove', qsorter.mousemove);
- 379. - removeEvent(document, 'mouseup touchend touchcancel', qsorter.mouseup);
- 380. - s.drag = qsorter.current = false;
- 381. - },
- 382. - update: function(parent, opts) {
- 383. - if (browser.mobile && !browser.safari_mobile && !browser.android) return;
- 384. - var s = parent.qsorter;
- 385. - extend(s, opts);
- 386. - s.count = 0;
- 387. - s.elems = [];
- 388. - s.noDragCount = 0;
- 389. - if (s.dragCont) {
- 390. - s.updateDragCont();
- 391. - }
- 392. - this.added(parent);
- 393. - },
- 394. - added: function(parent) {
- 395. - if (browser.mobile && !browser.safari_mobile && !browser.android) return;
- 396. - var s = parent.qsorter, l = s.count, xsize = s.xsize, to = l % xsize;
- 397. - var el = l ? s.elems[(l - 1) % xsize][Math.floor((l - 0.9) / xsize)].nextSibling : qsorter.first(parent);
- 398. - s.noDragCount = s.noDragCount || 0;
- 399. - for (var i = l; el; el = el.nextSibling, ++i) {
- 400. - if (el.nodeType == 3) continue;
- 401. - var noDrag = el.getAttribute('nodrag');
- 402. - if (noDrag) s.noDragCount++;
- 403. - if (!s.elems[to]) {
- 404. - s.elems[to] = [];
- 405. - }
- 406. - s.elems[to].push(el);
- 407. -
- 408. - var first = qsorter.first(el);
- 409. - var x = first.offsetLeft, y = first.offsetTop;
- 410. - if (browser.msie7 || browser.msie6) {
- 411. - x += el.offsetLeft;
- 412. - y += el.offsetTop;
- 413. - }
- 414. - extend(el, {x: x, y: y, i: i});
- 415. - addEvent(el, 'mousedown touchstart', qsorter.mousedown);
- 416. - if (browser.opera && !cur.qsorterNoOperaStyle) {
- 417. - el.style.display = 'block';
- 418. - el.style.cssFloat = 'left';
- 419. - }
- 420. - if (!noDrag && !s.noMoveCursor) el.style.cursor = 'move';
- 421. -
- 422. - ++to;
- 423. - if (to >= xsize) to -= xsize;
- 424. - }
- 425. - s.count += (i - l);
- 426. - },
- 427. - remove: function(parent, obj) {
- 428. - var s = parent.qsorter, l = s.count, xsize = s.xsize, to = l % xsize;
- 429. - debugLog('x', obj.x, obj.y);
- 430. -
- 431. - if (!s.elems.length) return;
- 432. - var row = s.elems[0].length;
- 433. -
- 434. - var lastEl = false;
- 435. - debugLog('startRow', row);
- 436. - while(row) {
- 437. - row -= 1;
- 438. - var col = s.xsize;
- 439. - while(col) {
- 440. - col -= 1;
- 441. - var tEl = (s.elems[col] || [])[row];
- 442. -
- 443. - debugLog('col: ', col, ' row: ', row, ' el: ', tEl);
- 444. - if (!tEl) {
- 445. - continue;
- 446. - }
- 447. -
- 448. - if (lastEl) {
- 449. - s.elems[col][row] = extend(lastEl, {
- 450. - x: tEl.x,
- 451. - y: tEl.y,
- 452. - i: tEl.i
- 453. - });
- 454. - debugLog('G', col, row, tEl.i);
- 455. - } else {
- 456. - s.elems[col].pop();
- 457. - }
- 458. -
- 459. - if (tEl == obj) {
- 460. - row = 0;
- 461. - break;
- 462. - }
- 463. -
- 464. - lastEl = tEl;
- 465. - }
- 466. - }
- 467. -
- 468. - re(obj);
- 469. - s.count -= 1;
- 470. - return lastEl;
- 471. - },
- 472. -
- 473. - // needs width,height,xsize
- 474. - init: function(parent, opts) {
- 475. - if (browser.mobile && !browser.safari_mobile && !browser.android) return;
- 476. -
- 477. - qsorter.scrollNode = browser.msie6 ? pageNode : window;
- 478. - parent = ge(parent);
- 479. -
- 480. - if (browser.msie7 || browser.msie6) parent.style.position = 'relative';
- 481. -
- 482. - var result = {
- 483. - parent: parent,
- 484. - xsize: opts.xsize,
- 485. - width: opts.width,
- 486. - height: opts.height,
- 487. - canDrag: opts.canDrag,
- 488. - cls: opts.clsUp ? false : (cur.qsorterRowClass || 'photo_row'),
- 489. - clsUp: opts.clsUp ? opts.clsUp : (cur.qsorterRowUpClass || 'photo_row photo_row_up'),
- 490. - count: 0,
- 491. - offset: 0,
- 492. - elems: new Array(opts.xsize),
- 493. - stop: function() {
- 494. - if (qsorter.current == result) {
- 495. - qsorter.stop();
- 496. - }
- 497. - for (var i in result.elems) {
- 498. - var els = result.elems[i];
- 499. - for (var j = 0, n = ((els || {}).length || 0); j < n; ++j) {
- 500. - var ch = els[j];
- 501. - if (qsorter.animcache[ch.id]) {
- 502. - delete(qsorter.animcache[ch.id]);
- 503. - }
- 504. - }
- 505. - }
- 506. - },
- 507. - destroy: function() {
- 508. - result.stop();
- 509. - var el = result.parent;
- 510. - removeAttr(el, 'qsorter');
- 511. - for (var i = 0, l = result.elems.length; i < l; ++i) {
- 512. - var els = result.elems[i];
- 513. - for (var j = 0, n = ((els || {}).length || 0); j < n; ++j) {
- 514. - var ch = els[j];
- 515. - removeEvent(ch, 'mousedown touchstart', qsorter.mousedown);
- 516. - }
- 517. - }
- 518. - },
- 519. - updateDragCont: function() {
- 520. - var xy = getXY(opts.dragCont);
- 521. - var size= getSize(opts.dragCont);
- 522. - this.dragCont = {
- 523. - visible: isVisible(opts.dragCont),
- 524. - el: opts.dragCont,
- 525. - x1: xy[0],
- 526. - y1: xy[1],
- 527. - x2: xy[0] + size[0],
- 528. - y2: xy[1] + size[1],
- 529. - };
- 530. - },
- 531. - onReorder: opts.onReorder,
- 532. - noscroll: opts.noscroll,
- 533. - dragEls: opts.dragEls,
- 534. - onDragOver: opts.onDragOver,
- 535. - onDragOut: opts.onDragOut,
- 536. - onDrop: opts.onDrop,
- 537. - noMoveCursor: opts.noMoveCursor
- 538. - }
- 539. -
- 540. - if (opts.dragCont) {
- 541. - result.updateDragCont();
- 542. - }
- 543. - parent.qsorter = result;
- 544. - qsorter.added(parent);
- 545. - return result;
- 546. - }
- 547. - }
- 548. -
- 549. - try{stManager.done('qsorter.js');}catch(e){}
- ------
Advertisement
Add Comment
Please, Sign In to add comment