  dojo.require("dojo.fx");
  dojo.require("dojo.fx.easing");
  dojo.require("dojox.widget.FisheyeList");
  dojo.require("dojo.window");

  dojo.declare('WW.FishEyeModule',null,{
      constructor : function(args){
          dojo.mixin(this, args);
          this.descriptions = new Array();
          this.dock = dojo.create("div",{'class': 'WW-fisheye'},dojo.body());
          dojo.style(this.dock, {
            position: "fixed",
            top: dojo.window.getBox().h-this.itemHeight+this.itemPadding+'px',
            width: '100%',
            "z-index": "1000"
		  });
          this.bigFish = new dojox.widget.FisheyeList(args,dojo.byId(dojo.create("div",{'class': 'outer'},this.dock)),"first");
          this.updateItems();
          this.bigFish.startup();
          this.addOnMouseEnter();
		  dojo.style(dojo.create("div", {}, dojo.body()), {
		    clear: 'both',
		    height: this.itemHeight+'px'
		  });
		  dojo.connect(window, "onresize", this, "onResize");
		  dojo.connect(window, "onscroll", this, "onScroll");
      },
      
      onResize: function(e) {
        dojo.style(this.dock, {
			top: dojo.window.getBox().h-this.itemHeight+this.itemPadding+'px'
		});
	  },
	  
	  onScroll : function(e){
		this.bigFish._initializePositioning();
	  },

      addItem : function(args){
          var item = new dojox.widget.FisheyeListItem(args);
          item.parent = this.bigFish;
          this.bigFish.addChild(item);
      },
      
      setLink : function(arg){
          document.location.href=arg;
      },
      
      updateItems : function(){
          var link;
          var img;
          var elements = dojo.query('a', dojo.byId(this.id));
          dojo.forEach(elements ,function(element,i){
              img = dojo.query('img', element)[0];
              link = element.getAttribute('href');
              this.addItem({
                          onClick: dojo.hitch(this, "setLink",link),
                          iconSrc: img.getAttribute('src')
                });
              this.descriptions[i] = img.getAttribute('longdesc');
              dojo.destroy(element);
          },this);
      },
      
      addOnMouseEnter : function(){
          var elements = dojo.query('.dojoxFisheyeListBar .dojoxFisheyeListItem');
          dojo.forEach(elements ,function(element,i){
              img = dojo.query('img', element)[0];
              dojo.connect(img,"onmouseenter", this, 'onMouseEnterImg');
      	  	  dojo.connect(img,"onmouseleave", this, 'onMouseLeaveImg');
      	  	  dojo.connect(img,"onclick", this, 'onMouseClickImg');
      	  	  img.tooltip = dojo.create("div",{'class': 'WW-tooltip top'},dojo.body());
	          dojo.create("div",{'class': 'WW-tooltip-content '}, dojo.create("div",{'class': 'WW-tooltip-bottom'},img.tooltip)).innerHTML = this.descriptions[i];
	          dojo.style(img.tooltip, {
		          opacity: 0,
		          display: 'none'
	          });
	          img.jumpUp = dojo.animateProperty({node: img, properties: {top: -100}, duration: 300, easing: dojo.fx.easing.quadOut, rate: 40});
	          img.jumpDown = dojo.animateProperty({node: img, properties: {top: 0}, duration: 600, easing: dojo.fx.easing.bounceOut, rate: 40});
	          img.jumpWait = dojo.animateProperty({node: img, duration: 200, easing: dojo.fx.easing.linear, rate: 1});
//	          img.fadeOut = dojo.fadeOut({node: img, end: 0.6, rate: 40, duration: 200, easing: dojo.fx.easing.backOut});
//	    	  img.fadeIn = dojo.fadeIn({node: img, rate: 40, duration: 200});
			  img.tooltip.fxDown = dojo.fadeOut({node: img.tooltip, end: 0.8, duration: 400, rate: 40});
		      img.tooltip.fxUp = dojo.fadeIn({node: img.tooltip, end: 0, duration: 400, rate: 40, onEnd: function(){dojo.style(this.node, 'display', 'none')} });
          },this);
      },

    onMouseClickImg : function(e) {
        var img = e.currentTarget;
        dojo.fx.chain([img.jumpUp, img.jumpDown, img.jumpWait, img.jumpUp, img.jumpDown, img.jumpWait, img.jumpUp, img.jumpDown]).play();
	},
      
	onMouseEnterImg : function(e){
	  var img = e.currentTarget;
	  dojo.style(img.tooltip, {
	          display : 'block'
	      });
//	  dojo.fx.chain([img.fadeOut, img.fadeIn]).play();
	   this.showTooltipTop(img, e);
	},
  
	showTooltipTop : function(img, e){
	  var pos = dojo.position(img, true);
	  var postooltip = dojo.position(img.tooltip);
	  var top = pos.y+pos.h-this.itemMaxHeight*0.75-dojo.position(img.tooltip).h;
	  dojo.style(img.tooltip, {
	        top: top+'px',
	        left: (e.clientX+pos.x+pos.w/2-postooltip.w)/2+'px'
	  });
	  img.tooltip.fxUp.stop();
	  img.tooltip.fxDown.play();
	},

	onMouseLeaveImg : function(e){
	  var img = e.currentTarget;
	  img.tooltip.fxDown.stop();
	  img.tooltip.fxUp.play();
	}

  });
