var geograffiti = geograffiti ||
{};
geograffiti.FilterBar = Class.create({
    initialize: function(element){
        this.element = $(element);
        this.tracker = $("filterbar-tracker");
        this.filterBarContainer = $("filterbar-container");
        this.tracker.setOpacity(0);
        this.initializeMouseListeners();
        this.lastX = 0;
        this.lastPositionRecord = null;
        this.transitioning = false;
        this.trackerOffset = 20;
        this.trackerPadding = 5;
        this.activePositionRecord = null;
        this.buildPositionTable()
    },
    buildPositionTable: function(){
        var self = this;
        var filters = this.element.select(".mapfilter");
        this.positionTable = new Array();
        var totalPadding = 2 * self.trackerPadding;
        var i, startCoordinate, endCoordinate, trackerStart, trackerWidth, filterWidth;
        filters.each(function(filter){
            if (gg.debug) {
                gg.log("self.trackerOffset is %d/NaN:%d", self.trackerOffset, isNaN(self.trackerOffset))
            }
            if (gg.debug) {
                gg.log("self.trackerPadding is %d/NaN:%d", self.trackerPadding, isNaN(self.trackerPadding))
            }
            startCoordinate = filter.positionedOffset().left;
            if (gg.debug) {
                gg.log("startCoordinate is %d/NaN:%d", startCoordinate, isNaN(startCoordinate))
            }
            trackerStart = startCoordinate - 25;
            if (gg.debug) {
                gg.log("trackerStart is %d/NaN:%d", trackerStart, isNaN(trackerStart))
            }
            trackerStart += self.trackerOffset;
            if (gg.debug) {
                gg.log("trackerStart is %d/NaN:%d", trackerStart, isNaN(trackerStart))
            }
            filterWidth = filter.getWidth();
            if (gg.debug) {
                gg.log("filterWidth is %d/NaN:%d", filterWidth, isNaN(filterWidth))
            }
            trackerWidth = filterWidth + totalPadding;
            if (gg.debug) {
                gg.log("startCoordinate is %d/trackerStart is %d/filterWidth is %d/trackerWidth is %d", startCoordinate, trackerStart, filterWidth, trackerWidth)
            }
            var positionRecord = {
                start: startCoordinate,
                width: filterWidth,
                trackerStart: trackerStart,
                trackerWidth: trackerWidth
            };
            endCoordinate = startCoordinate + filter.getWidth();
            for (i = startCoordinate; i <= endCoordinate; ++i) {
                self.positionTable[i] = positionRecord
            }
        })
    },
    transitionTracker: function(positionRecord){
        var self = this;
        var effects = [new Effect.Move(this.tracker, {
            x: positionRecord.trackerStart,
            mode: "absolute",
            sync: true,
            transition: Effect.Transitions.spring
        }), new Effect.Morph(this.tracker, {
            style: "width:" + positionRecord.trackerWidth + "px;",
            transition: Effect.Transitions.spring,
            sync: true
        })];
        if (this.tracker.getStyle("opacity") === 0) {
            effects.push(new Effect.Opacity(this.tracker, {
                from: 0,
                to: 1,
                sync: true
            }))
        }
        new Effect.Parallel(effects, {
            duration: 1,
            afterFinish: function(){
                self.lastPositionRecord = positionRecord;
                self.transitioning = false
            }
        })
    },
    mouseMoved: function(e){
        gg.log("mouseMoved with event %o", e);
        e.stop();
        var newX = e.clientX - $("filtercontent").cumulativeOffset().left;
        if (geograffiti.debug) {
            gg.log("X = %d - %d = %d", e.clientX, $("filtercontent").cumulativeOffset().left, newX)
        }
        
        if (this.transitioning !== true) {
            this.transitioning = true;
            var positionRecord = this.positionTable[newX];
            if (positionRecord) {
                if (positionRecord != this.lastPositionRecord) {
                    this.transitionTracker(positionRecord)
                }
                else {
                    this.transitioning = false
                }
            }
            else {
                this.transitioning = false
            }
        }
        else {
            if (gg.debug) {
                gg.log("transitioning...so skipping")
            }
        }
    },
    disappear: function(){
        var self = this;
        var effects = [new Effect.Move(this.tracker, {
            x: 0,
            mode: "absolute",
            sync: true,
            transition: Effect.Transitions.sinoidal
        }), new Effect.Morph(this.tracker, {
            style: "width: 20px",
            sync: true
        }), new Effect.Opacity(this.tracker, {
            from: 1,
            to: 0,
            sync: true
        })];
        new Effect.Parallel(effects, {
            duration: 0.5,
            afterFinish: function(){
                self.lastPositionRecord = null;
                self.transitioning = false
            }
        })
    },
    mouseInBounds: function(x, y){
        var dimensions = this.filterBarContainer.getDimensions();
        var inBounds = false;
        var bounds = {
            topLeft: {
                x: 0,
                y: 0
            },
            bottomRight: {
                x: dimensions.width,
                y: dimensions.height
            }
        };
        if (x >= bounds.topLeft.x && x <= bounds.bottomRight.x) {
            if (y >= bounds.topLeft.y && y <= bounds.bottomRight.y) {
                inBounds = true
            }
        }
        return inBounds
    },
    mouseOut: function(e){
        gg.log("mouseOut with event %o", e);
        e.stop();
        var x = e.clientX - $("filtercontent").cumulativeOffset().left;
        var y = e.clientY - $("filterbar-container-outer").cumulativeOffset().top;
        if (this.mouseInBounds(x, y) === false) {
            if (this.activePositionRecord === null) {
                this.disappear()
            }
            else {
                this.transitionTracker(this.activePositionRecord)
            }
        }
    },
    mouseClick: function(e){
        gg.log("mouseClick with event %o", e);
        var x = e.clientX - $("filtercontent").cumulativeOffset().left;
        var record = this.positionTable[x];
        if (record) {
            this.activePositionRecord = record
        }
    },
    initializeMouseListeners: function(){
        $("filterbar-container").observe("mouseover", this.mouseMoved.bindAsEventListener(this));
        $("filterbar-container").observe("mouseout", this.mouseOut.bindAsEventListener(this));
        $("filterbar-container").observe("click", this.mouseClick.bindAsEventListener(this))
    }
});

