﻿var FishEyeToolBar=Class.create();Object.extend(Object.extend(FishEyeToolBar.prototype,EventDispatcher.prototype),{initialize:function(b,a){this.elementArr=[];this.options={selector:"img",createSub:this.createSub.bind(this),subOptions:{}};Object.extend(this.options,a);this.createListener();this.buildInterface(b);this.attachListener();this.resetTimer=false},createSub:function(a){return new FishEyeItem(a,this.options.subOptions)},buildInterface:function(a){this.container=$(a);this.container.getElementsBySelector(this.options.selector).collect(this.buildItem.bind(this))},buildItem:function(b){var a=this.options.createSub(b,this.options.subOptions);a.addEventListener("click",this.itemClickHandle);this.elementArr.push(a);this.dispatchEvent("itemBuild",a)},createListener:function(){this.mouseMoveHandle=this.handleMouseMove.bindAsEventListener(this);this.itemClickHandle=this.handleItemClick.bind(this);this.mouseOutHandle=this.handleMouseOut.bindAsEventListener(this);this.cancelTimerHandle=this.cancelTimer.bindAsEventListener(this)},attachListener:function(){Event.observe(this.container,"mousemove",this.mouseMoveHandle);Event.observe(this.container,"mouseout",this.mouseOutHandle);Event.observe(this.container,"mouseover",this.cancelTimerHandle)},cancelTimer:function(){clearTimeout(this.resetTimer)},handleMouseMove:function(a){this.cancelTimer();this.elementArr.invoke("handleFishEye",{x:Event.pointerX(a),y:Event.pointerY(a)})},handleMouseOut:function(){this.resetTimer=setTimeout(this.resetElements.bind(this),1e3)},resetElements:function(){this.elementArr.invoke("resetElement")},handleItemClick:function(a){this.dispatchEvent("itemClick",a)},elements:function(){return this.elementArr}});var FishEyeItem=Class.create();Object.extend(Object.extend(FishEyeItem.prototype,EventDispatcher.prototype),{initialize:function(b,a){this.options={scaleFactor:.5,scaleThrottle:200};Object.extend(this.options,a||{});this.buildInterface(b);this.createListener();this.attachListener();this.setOriginalProperties();this.lastScale=1},setOriginalProperties:function(){this.originalHeight=parseInt(this.ele.getStyle("height").replace(/[^0-9]/gi,""));this.originalWidth=parseInt(this.ele.getStyle("width").replace(/[^0-9]/gi,""));this.originalMarginTop=parseInt(this.ele.getStyle("margin-top").replace(/[^0-9]/gi,""))},buildInterface:function(a){this.ele=$(a)},createListener:function(){this.fishEyeHandle=this.handleFishEye.bind(this);this.clickHandle=this.handleClick.bindAsEventListener(this);this.cancelMouseOutHandle=this.handleMouseOut.bindAsEventListener(this)},attachListener:function(){Event.observe(this.ele,"click",this.clickHandle);Event.observe(this.ele,"click",this.cancelMouseOutHandle)},handleMouseOut:function(a){Event.stop(a);return false},handleClick:function(a){this.dispatchEvent("click",a)},handleFishEye:function(d){var c=this.getCenterAxis(),a=Math.abs(d.x-c);if(a>this.options.scaleThrottle){this.resetElement();return true}var b=Math.abs(this.options.scaleThrottle-a)/this.options.scaleThrottle+1;this.lastScale=b;this.scaleElement(b)},scaleElement:function(a){this.ele.setStyle({zIndex:a*100,marginTop:this.originalMarginTop-(a*this.originalHeight-this.originalHeight)+"px",height:a*this.originalHeight+"px",width:a*this.originalWidth+"px"})},resetElement:function(){this.ele.setStyle({zIndex:1,marginTop:this.originalMarginTop+"px",height:this.originalHeight+"px",width:this.originalWidth+"px"})},getCenterAxis:function(){return Math.floor(Position.cumulativeOffset(this.ele).first()+this.originalWidth/2*this.lastScale)}});var FishEyeItemDown=Class.create();Object.extend(Object.extend(FishEyeItemDown.prototype,FishEyeItem.prototype),{setOriginalProperties:function(){this.originalHeight=parseInt(this.ele.getStyle("height").replace(/[^0-9]/gi,""));this.originalWidth=parseInt(this.ele.getStyle("width").replace(/[^0-9]/gi,""));this.originalMarginBottom=parseInt(this.ele.getStyle("margin-bottom").replace(/[^0-9]/gi,""))},scaleElement:function(a){this.ele.setStyle({zIndex:a*100,marginBottom:this.originalMarginBottom-(a*this.originalHeight-this.originalHeight)+"px",height:a*this.originalHeight+"px",width:a*this.originalWidth+"px"})},resetElement:function(){this.ele.setStyle({zIndex:1,marginBottom:this.originalMarginBottom+"px",height:this.originalHeight+"px",width:this.originalWidth+"px"})}})
