wpfw_ewei_shopv2/plugin/app/static/js/drag.js
2023-02-14 19:57:32 +08:00

1 line
11 KiB
JavaScript

var isIE=!!document.all,dobj=function(t){return"string"==typeof t?document.getElementById(t):t},Class={create:function(){return function(){this.initialize.apply(this,arguments)}}},Extend=function(t,i){for(var e in i)t[e]=i[e]},Bind=function(t,i){return function(){return i.apply(t,arguments)}},BindAsEventListener=function(i,e){var s=Array.prototype.slice.call(arguments).slice(2);return function(t){return e.apply(i,[t||window.event].concat(s))}},CurrentStyle=function(t){return t.currentStyle||document.defaultView.getComputedStyle(t,null)};function addEventHandler(t,i,e){t.addEventListener?t.addEventListener(i,e,!1):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}function removeEventHandler(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=null}var Resize=Class.create();Resize.prototype={initialize:function(t,i){this._obj=t.get(0),this._styleWidth=this._styleHeight=this._styleLeft=this._styleTop=0,this._sideRight=this._sideDown=this._sideLeft=this._sideUp=0,this._fixLeft=this._fixTop=0,this._scaleLeft=this._scaleTop=0,this._mxSet=function(){},this._mxRightWidth=this._mxDownHeight=this._mxUpHeight=this._mxLeftWidth=0,this._mxScaleWidth=this._mxScaleHeight=0,this._fun=function(){};var e=CurrentStyle(this._obj);this._borderX=(parseInt(e.borderLeftWidth)||0)+(parseInt(e.borderRightWidth)||0),this._borderY=(parseInt(e.borderTopWidth)||0)+(parseInt(e.borderBottomWidth)||0),this._fR=BindAsEventListener(this,this.Resize),this._fS=Bind(this,this.Stop),this.SetOptions(i),this.Max=!!this.options.Max,this._mxContainer=$(this.options.mxContainer).get(0)||null,this.mxLeft=Math.round(this.options.mxLeft),this.mxRight=Math.round(this.options.mxRight),this.mxTop=Math.round(this.options.mxTop),this.mxBottom=Math.round(this.options.mxBottom),this.Min=!!this.options.Min,this.minWidth=Math.round(this.options.minWidth),this.minHeight=Math.round(this.options.minHeight),this.Scale=!!this.options.Scale,this.Ratio=Math.max(this.options.Ratio,0),this.onResize=this.options.onResize,this._obj.style.position="absolute",this._mxContainer&&"relative"!=CurrentStyle(this._mxContainer).position&&(this._mxContainer.style.position="relative")},SetOptions:function(t){this.options={Max:!1,mxContainer:"",mxLeft:0,mxRight:9999,mxTop:0,mxBottom:9999,Min:!1,minWidth:50,minHeight:50,Scale:!1,Ratio:0,onResize:function(){}},Extend(this.options,t||{})},Set:function(t,i){var e;if(t){switch(i.toLowerCase()){case"up":e=this.Up;break;case"down":e=this.Down;break;case"left":e=this.Left;break;case"right":e=this.Right;break;case"left-up":e=this.LeftUp;break;case"right-up":e=this.RightUp;break;case"left-down":e=this.LeftDown;break;case"right-down":default:e=this.RightDown}addEventHandler(t.get(0),"mousedown",BindAsEventListener(this,this.Start,e))}},Start:function(t,i,e){if(t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this._fun=i,this._styleWidth=this._obj.clientWidth,this._styleHeight=this._obj.clientHeight,this._styleLeft=this._obj.offsetLeft,this._styleTop=this._obj.offsetTop,this._sideLeft=t.clientX-this._styleWidth,this._sideRight=t.clientX+this._styleWidth,this._sideUp=t.clientY-this._styleHeight,this._sideDown=t.clientY+this._styleHeight,this._fixLeft=this._styleLeft+this._styleWidth,this._fixTop=this._styleTop+this._styleHeight,this.Scale&&(this.Ratio=Math.max(this.Ratio,0)||this._styleWidth/this._styleHeight,this._scaleLeft=this._styleLeft+this._styleWidth/2,this._scaleTop=this._styleTop+this._styleHeight/2),this.Max){var s=this.mxLeft,h=this.mxRight,n=this.mxTop,o=this.mxBottom;this._mxContainer&&(s=Math.max(s,0),n=Math.max(n,0),h=Math.min(h,this._mxContainer.clientWidth),o=Math.min(o,this._mxContainer.clientHeight)),h=Math.max(h,s+(this.Min?this.minWidth:0)+this._borderX),o=Math.max(o,n+(this.Min?this.minHeight:0)+this._borderY),this._mxSet=function(){this._mxRightWidth=h-this._styleLeft-this._borderX,this._mxDownHeight=o-this._styleTop-this._borderY,this._mxUpHeight=Math.max(this._fixTop-n,this.Min?this.minHeight:0),this._mxLeftWidth=Math.max(this._fixLeft-s,this.Min?this.minWidth:0)},this._mxSet(),this.Scale&&(this._mxScaleWidth=2*Math.min(this._scaleLeft-s,h-this._scaleLeft-this._borderX),this._mxScaleHeight=2*Math.min(this._scaleTop-n,o-this._scaleTop-this._borderY))}addEventHandler(document,"mousemove",this._fR),addEventHandler(document,"mouseup",this._fS),isIE?(addEventHandler(this._obj,"losecapture",this._fS),this._obj.setCapture()):(addEventHandler(window,"blur",this._fS),t.preventDefault())},Resize:function(e){with(window.getSelection?window.getSelection().removeAllRanges():document.selection.empty(),this._fun(e),this._obj.style)width=this._styleWidth+"px",height=this._styleHeight+"px",top=this._styleTop+"px",left=this._styleLeft+"px";this.onResize()},Up:function(t){this.RepairY(this._sideDown-t.clientY,this._mxUpHeight),this.RepairTop(),this.TurnDown(this.Down)},Down:function(t){this.RepairY(t.clientY-this._sideUp,this._mxDownHeight),this.TurnUp(this.Up)},Right:function(t){this.RepairX(t.clientX-this._sideLeft,this._mxRightWidth),this.TurnLeft(this.Left)},Left:function(t){this.RepairX(this._sideRight-t.clientX,this._mxLeftWidth),this.RepairLeft(),this.TurnRight(this.Right)},RightDown:function(t){this.RepairAngle(t.clientX-this._sideLeft,this._mxRightWidth,t.clientY-this._sideUp,this._mxDownHeight),this.TurnLeft(this.LeftDown)||this.Scale||this.TurnUp(this.RightUp)},RightUp:function(t){this.RepairAngle(t.clientX-this._sideLeft,this._mxRightWidth,this._sideDown-t.clientY,this._mxUpHeight),this.RepairTop(),this.TurnLeft(this.LeftUp)||this.Scale||this.TurnDown(this.RightDown)},LeftDown:function(t){this.RepairAngle(this._sideRight-t.clientX,this._mxLeftWidth,t.clientY-this._sideUp,this._mxDownHeight),this.RepairLeft(),this.TurnRight(this.RightDown)||this.Scale||this.TurnUp(this.LeftUp)},LeftUp:function(t){this.RepairAngle(this._sideRight-t.clientX,this._mxLeftWidth,this._sideDown-t.clientY,this._mxUpHeight),this.RepairTop(),this.RepairLeft(),this.TurnRight(this.RightUp)||this.Scale||this.TurnDown(this.LeftDown)},RepairX:function(t,i){if(t=this.RepairWidth(t,i),this.Scale){var e=this.RepairScaleHeight(t);if(this.Max&&e>this._mxScaleHeight)e=this._mxScaleHeight,t=this.RepairScaleWidth(e);else if(this.Min&&e<this.minHeight){var s=this.RepairScaleWidth(this.minHeight);s<i&&(e=this.minHeight,t=s)}this._styleHeight=e,this._styleTop=this._scaleTop-e/2}this._styleWidth=t},RepairY:function(t,i){if(t=this.RepairHeight(t,i),this.Scale){var e=this.RepairScaleWidth(t);if(this.Max&&e>this._mxScaleWidth)e=this._mxScaleWidth,t=this.RepairScaleHeight(e);else if(this.Min&&e<this.minWidth){var s=this.RepairScaleHeight(this.minWidth);s<i&&(e=this.minWidth,t=s)}this._styleWidth=e,this._styleLeft=this._scaleLeft-e/2}this._styleHeight=t},RepairAngle:function(t,i,e,s){if(t=this.RepairWidth(t,i),this.Scale){if(e=this.RepairScaleHeight(t),this.Max&&s<e)e=s,t=this.RepairScaleWidth(e);else if(this.Min&&e<this.minHeight){var h=this.RepairScaleWidth(this.minHeight);h<i&&(e=this.minHeight,t=h)}}else e=this.RepairHeight(e,s);this._styleWidth=t,this._styleHeight=e},RepairTop:function(){this._styleTop=this._fixTop-this._styleHeight},RepairLeft:function(){this._styleLeft=this._fixLeft-this._styleWidth},RepairHeight:function(t,i){return t=Math.min(this.Max?i:t,t),t=Math.max(this.Min?this.minHeight:t,t,0)},RepairWidth:function(t,i){return t=Math.min(this.Max?i:t,t),t=Math.max(this.Min?this.minWidth:t,t,0)},RepairScaleHeight:function(t){return Math.max(Math.round((t+this._borderX)/this.Ratio-this._borderY),0)},RepairScaleWidth:function(t){return Math.max(Math.round((t+this._borderY)*this.Ratio-this._borderX),0)},TurnRight:function(t){if(!this.Min&&!this._styleWidth)return this._fun=t,this._sideLeft=this._sideRight,this.Max&&this._mxSet(),!0},TurnLeft:function(t){if(!this.Min&&!this._styleWidth)return this._fun=t,this._sideRight=this._sideLeft,this._fixLeft=this._styleLeft,this.Max&&this._mxSet(),!0},TurnUp:function(t){if(!this.Min&&!this._styleHeight)return this._fun=t,this._sideDown=this._sideUp,this._fixTop=this._styleTop,this.Max&&this._mxSet(),!0},TurnDown:function(t){if(!this.Min&&!this._styleHeight)return this._fun=t,this._sideUp=this._sideDown,this.Max&&this._mxSet(),!0},Stop:function(){removeEventHandler(document,"mousemove",this._fR),removeEventHandler(document,"mouseup",this._fS),isIE?(removeEventHandler(this._obj,"losecapture",this._fS),this._obj.releaseCapture()):removeEventHandler(window,"blur",this._fS)}};var Drag=Class.create();Drag.prototype={initialize:function(drag,options){if(this.Drag=drag.get(0),this._x=this._y=0,this._marginLeft=this._marginTop=0,this._fM=BindAsEventListener(this,this.Move),this._fS=Bind(this,this.Stop),this.SetOptions(options),this.Limit=!!this.options.Limit,this.mxLeft=parseInt(this.options.mxLeft),this.mxRight=parseInt(this.options.mxRight),this.mxTop=parseInt(this.options.mxTop),this.mxBottom=parseInt(this.options.mxBottom),this.LockX=!!this.options.LockX,this.LockY=!!this.options.LockY,this.Lock=!!this.options.Lock,this.onStart=this.options.onStart,this.onMove=this.options.onMove,this.onStop=this.options.onStop,this._Handle=$(this.options.Handle).get(0)||this.Drag,this._mxContainer=$(this.options.mxContainer).get(0)||null,this.Drag.style.position="absolute",isIE&&this.options.Transparent)with(this._Handle.appendChild(document.createElement("div")).style)width=height="100%",backgroundColor="#fff",filter="alpha(opacity:0)",fontSize=0;this.Repair(),addEventHandler(this._Handle,"mousedown",BindAsEventListener(this,this.Start))},SetOptions:function(t){this.options={Handle:"",Limit:!1,mxLeft:0,mxRight:9999,mxTop:0,mxBottom:9999,mxContainer:"",LockX:!1,LockY:!1,Lock:!1,Transparent:!1,onStart:function(){},onMove:function(){},onStop:function(){}},Extend(this.options,t||{})},Start:function(t){this.Lock||(this.Repair(),this._x=t.clientX-this.Drag.offsetLeft,this._y=t.clientY-this.Drag.offsetTop,this._marginLeft=parseInt(CurrentStyle(this.Drag).marginLeft)||0,this._marginTop=parseInt(CurrentStyle(this.Drag).marginTop)||0,addEventHandler(document,"mousemove",this._fM),addEventHandler(document,"mouseup",this._fS),isIE?(addEventHandler(this._Handle,"losecapture",this._fS),this._Handle.setCapture()):(addEventHandler(window,"blur",this._fS),t.preventDefault()),this.onStart())},Repair:function(){this.Limit&&(this.mxRight=Math.max(this.mxRight,this.mxLeft+this.Drag.offsetWidth),this.mxBottom=Math.max(this.mxBottom,this.mxTop+this.Drag.offsetHeight),this._mxContainer&&"relative"!=CurrentStyle(this._mxContainer).position&&"absolute"!=CurrentStyle(this._mxContainer).position&&(this._mxContainer.style.position="relative"))},Move:function(t){if(this.Lock)this.Stop();else{window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();var i=t.clientX-this._x,e=t.clientY-this._y;if(this.Limit){var s=this.mxLeft,h=this.mxRight,n=this.mxTop,o=this.mxBottom;this._mxContainer&&(s=Math.max(s,0),n=Math.max(n,0),h=Math.min(h,this._mxContainer.clientWidth),o=Math.min(o,this._mxContainer.clientHeight)),i=Math.max(Math.min(i,h-this.Drag.offsetWidth),s),e=Math.max(Math.min(e,o-this.Drag.offsetHeight),n)}this.LockX||(this.Drag.style.left=i-this._marginLeft+"px"),this.LockY||(this.Drag.style.top=e-this._marginTop+"px"),this.onMove()}},Stop:function(){removeEventHandler(document,"mousemove",this._fM),removeEventHandler(document,"mouseup",this._fS),isIE?(removeEventHandler(this._Handle,"losecapture",this._fS),this._Handle.releaseCapture()):removeEventHandler(window,"blur",this._fS),this.onStop()}};