/* * function DRdiv(insideHTML) * creates draggable and resizible div * arguments: * insideHTML - optional, data inside created div * returns div element avaiable for user's manipulations * returned object has following attributes: * place: set element's position * resize: set element's size * delete: remove element from DOM tree */ function DRdiv(insideHTML){ var el = _DRdiv.init(insideHTML); el.place = _DRdiv.setp; el.resize = _DRdiv.resize; el.delete = function(){this.parentNode.parentNode.removeChild(this.parentNode)}; return el; } _DRdiv = function(){ /* var elementsCache = {}; function $(id) { if (elementsCache[id] === undefined) elementsCache[id] = document.getElementById(id); return elementsCache[id]; } */ /* * BASE CONSTANTS */ // main div extremal size: const minW = 100, minH = 100, maxW = 700, maxH = 400; // size of "resize" div const resHW = "30px"; function mkDiv(insideHTML){ var L = ["top" , "width" , "left" , "w", resL]; var R = ["top" , "width" , "right" , "e", resR]; var U = ["left", "height", "top" , "n", resU]; var D = ["left", "height", "bottom", "s", resD]; var borders =[[L, null], [R, null], [U, null], [D, null], [U, L], [U, R], [D, R], [D, L]]; var d = document.createElement("div"); d.className = "drag"; d.id = "Big"; d.onmousedown = ds; var _cursor = ""; function setstyle(el, stl){ el.style[stl[1]] = resHW; el.style[stl[2]] = "0px"; _cursor += stl[3]; el.resizefn.push(stl[4]); } var inside = document.createElement("div"); inside.id = "indrag"; inside.className = "indrag"; if(insideHTML) inside.innerHTML = insideHTML; d.appendChild(inside); for(var i = 0; i < 8; i++){ var el = document.createElement("div"); el.className = "resz"; el.resizefn = new Array(); setstyle(el, borders[i][0]); var zi = 20; if(borders[i][1]) setstyle(el, borders[i][1]); else{ zi = 19; el.style[borders[i][0][0]] = "0px"; el.resizefn.push(null);} el.style.cursor = _cursor + "-resize"; _cursor = ""; el.onmousedown = rs; d.appendChild(el); } document.body.appendChild(d); return inside; } function getPosition(el) { var left = 0, top = 0; while(el){ left += el.offsetLeft; top += el.offsetTop; el = el.parentOffset; } return {left: left, top: top}; } function getStyleProp(el, prop){ var p = window.getComputedStyle(el, null).getPropertyValue(prop); return parseInt(p); } function pE(e){ if(e.preventDefault) e.preventDefault(); if(e.stopPropagation) e.stopPropagation(); } var maxX, maxY, X, Y;; var oldmove, oldup; var activeEl; var moving = false; function ds(e){ activeEl = this; setProps(e, dro); } function setProps(e, onmove){ pE(e); moving = true; oldmove = window.onmousemove; oldup = window.onmouseup; window.onmousemove = onmove; window.onmouseup = de; var pos = getPosition(activeEl); X = pos.left - e.clientX - getStyleProp(activeEl, "margin-left"); Y = pos.top - e.clientY - getStyleProp(activeEl, "margin-top"); maxX = window.innerWidth - (activeEl.offsetWidth + getStyleProp(activeEl, "margin-right")); maxY = window.innerHeight - (activeEl.offsetHeight + getStyleProp(activeEl, "margin-bottom")); } var oW, oH, oX, oY; var resizeF; function rs(e){ activeEl = this.parentElement; setProps(e, res); resizeF = this.resizefn; oX = e.clientX; oY = e.clientY; oW = activeEl.clientWidth; oH = activeEl.clientHeight; } function dro(e){ if(!moving) return true; pE(e); var L = X + e.clientX; var T = Y + e.clientY; if(L < 0) L = 0; if(T < 0) T = 0; if(L > maxX) L = maxX; if(T > maxY) T = maxY; activeEl.style.left = L + "px"; activeEl.style.top = T + "px"; return false; } function res(e){ if(!moving) return true; pE(e); resizeF[0](e); if(resizeF[1]) resizeF[1](e); return false; } function resLR(e, Left){ var L = X + e.clientX; if(Left && L < 0) L = 0; if(!Left && L > maxX) L = maxX; var dW = (L - X - oX) * ((Left) ? -1 : 1); var nW = oW + dW; if(nW > minW && nW < maxW){ activeEl.style.width = nW; if(Left) activeEl.style.left = L + "px"; } } function resL(e){ resLR(e, true); } function resR(e){ resLR(e, false); } function resUD(e, Up){ var T = Y + e.clientY; if(Up && T < 0) T = 0; if(!Up && T > maxY) T = maxY; var dH = (T - Y - oY) * ((Up) ? -1 : 1); var nH = oH + dH; if(nH > minH && nH < maxH){ activeEl.style.height = nH; if(Up) activeEl.style.top = T + "px"; } } function resU(e){ resUD(e, true); } function resD(e){ resUD(e, false); } function de(e){ pE(e); moving = false; resizeF = []; activeEl = null; window.onmousemove = oldmove; window.onmouseup = oldup; } function placeDiv(left, top){ var El = this.parentElement; El.style.left = left + "px"; El.style.top = top + "px"; } function resizeDiv(w, h){ var El = this.parentElement; El.style.width = w; El.style.height = h; } return{ init: mkDiv, setp: placeDiv, resize: resizeDiv }; }();