﻿general.namespace('SW.Controls');

(function () {

        var ZoomSliderControl = SW.Controls.ZoomSliderControl = function (zoomLevels) {
            this.zoomLevels = zoomLevels; // array of levels which can be clicked
        };
        if (typeof GMap !== 'undefined') {
            ZoomSliderControl.prototype = new GControl(); 
        }
        ZoomSliderControl.prototype.constructor = ZoomSliderControl;

        /* part of GControl interface */
        ZoomSliderControl.prototype.printable = function () {
            return false; // not printable
        };
        
        /* * part of GControl interface */
        ZoomSliderControl.prototype.selectable = function () {
            return false; // no selectable text in the control
        };
        
        var BASE_OFFSET = 22;     // enclosure variables
        var OFFSET_PER_ZOOM = 8;
        var ZOOM_19_RIGHT_BACKGROUND_LEFT = 103;
        var ZOOM_19_LEFT_BACKGROUND_WIDTH = 104;
        var ZOOM_19_DIV_WIDTH = 201;
        
        /**/
        ZoomSliderControl.prototype.initialize = function (map) { // assigned to 'initialize'
            this.map = map;
            this.numTicks = SWMap.info.maxZoom - SWMap.info.minZoom + 1;
            this.leftAdjustment = 0;
        
            this.div = $C('div', {width: '201px', height: '20px'}, {id: 'zoom-slider', className: 'alphaPNG'},
                this.leftBackground =
                $C('div', { width: '104px', height: '20px', cursor: 'pointer', position: 'absolute', background: 'transparent url(/assets/images/zoom_slider.png) repeat scroll 0px 0px' }, { className: 'alphaPNG' }),
                this.rightBackground =
                $C('div', { left: '103px', width: '98px', height: '20px', cursor: 'pointer', position: 'absolute', background: 'transparent url(/assets/images/zoom_slider_right.png)' }, { className: 'alphaPNG' }),
                this.slider = 
                $C('img', {position: 'absolute', left: '40px'}, {src: '/assets/images/zoom_slider_grabber.png', className: 'alphaPNG'})
            );
            
            var me = this;
            GEvent.addListener(map, "zoomend", function (oldZoom, newZoom) {
                var offset = BASE_OFFSET + (OFFSET_PER_ZOOM  * (newZoom - 1));
                me.slider.style.left = offset + 'px';
            });
            
            GEvent.addDomListener(map, "moveend", function(e) {
                me.setMaxZoom();
            });
            
            GEvent.addDomListener(map, "maptypechanged", function(e) {
                me.setMaxZoom();
            });
            
                    
            GEvent.addDomListener(this.div, "mousedown", function(e) {
            
                var target = e.target || e.srcElement;
            
                var x = e.layerX || e.offsetX; // offsetX is IE semi-equivalent of layerX
                var y = e.layerY || e.offsetY;  // offsetX is IE semi-equivalent of layerX
            
                if (target === me.slider || y > 17) { // if hit ticker or clicked too lower
                    return;
                }
                
                if (target === me.rightBackground) {
                    x += (ZOOM_19_RIGHT_BACKGROUND_LEFT - me.leftAdjustment);
                }
                
                if (x >= 2 && x <= 19) { // zoom out button
                    mapGeneral.zoomOut(map);
                }
                else if (x >= (183 - me.leftAdjustment) && x <= (199 - me.leftAdjustment)) { // zoom in button
                    mapGeneral.zoomIn(map);
                }
                else if (x >= 22 && x <= (178 - me.leftAdjustment)) { // clicked on one of the zoom ticks
                    // need to infer zoom level from x
                    x -= 23; // not 22; was a bit too biased towards the right
                    var zoom = Math.floor(x / OFFSET_PER_ZOOM) + 1;
                    mapGeneral.setZoom(map, zoom);
                }
            });
            
            map.getContainer().appendChild(this.div);
            return this.div;
        };
        
        /**/
        ZoomSliderControl.prototype.getDefaultPosition = function () {
            return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 10));
        };
        
        /**/
        ZoomSliderControl.prototype.setMaxZoom = function (maxZoom) {
            this.numTicks = maxZoom = maxZoom || this.map.getCurrentMapType().getTileLayers()[0].maxResolution();
        
            if (maxZoom > 19) maxZoom = 19;
            if (maxZoom < 10) maxZoom = 10;
        
            this.leftAdjustment = (19 - maxZoom) * 8; // how far left from zoom 19 position
            this.leftBackground.style.width = (ZOOM_19_LEFT_BACKGROUND_WIDTH - this.leftAdjustment) + 'px';
            this.rightBackground.style.left = (ZOOM_19_RIGHT_BACKGROUND_LEFT - this.leftAdjustment) + 'px';
            this.div.style.width = (ZOOM_19_DIV_WIDTH - this.leftAdjustment) + 'px';
        };
})();