zs = {
    id: 'zoomslider',
    id_rail: 'zoomsliderrail',
    id_wrapper: 'zoomslider_wrapper',
    doubleClickMapZoomDisabled: true,
    map: null,
    objectToDrag: null,
    obj: null,
    obj_rail: null,
    containerWidth: null,
    railWidth: null,
    zoomLevelMin: 9,
    zoomLevelMax: 17,
    currentZoomLevel: 0,
    dragged: false,
    zoomFromSlider: false,
    
    init: function(map, id, id_rail, zoomLevelMin, zoomLevelMax){
      
      if (map == null) return false;
      else zs.map = map;
      
      if ((id != null) && (id != ''))  this.id = id;
      if ((id_rail != null) && (id_rail != '')) this.id_rail = id_rail;
        
      if (((zoomLevelMin != null) && (zoomLevelMin != '')) || (zoomLevelMin == 0)) this.zoomLevelMin = zoomLevelMin;
      if (((zoomLevelMax != null) && (zoomLevelMax != '')) || (zoomLevelMax == 0)) this.zoomLevelMax = zoomLevelMax;
      
      zs.currentZoomLevel = zs.map.getZoom();
       
      if (zs.doubleClickMapZoomDisabled) zs.map.disableDoubleClickZoom();
      
      //zoomslider
      
      zs.DOMElementsInit();
      
      zs.obj = d_obj(this.id);
      zs.obj_rail = d_obj(this.id_rail);
      
      zs.containerWidth = Math.round(zs.obj.style.width.substring(0,zs.obj.style.width.indexOf('px')));
      zs.railWidth = Math.round(zs.obj_rail.style.width.substring(0,zs.obj_rail.style.width.indexOf('px')));
      
      zs.objectToDrag = new GDraggableObject(zs.obj_rail, {draggingCursor: "pointer", draggableCursor: "pointer", container: zs.obj});    
      GEvent.addListener(zs.objectToDrag, "dragend", function() { zs.onDragEnd();});
      GEvent.addListener(zs.objectToDrag, "drag", function() { zs.changeStatus("drag");});
      
      GEvent.addListener(zs.map, "dblclick", function() { 
            zs.zoomFromSlider = false; 
            zs.setRailPosition(zs.currentZoomLevel);
      });
      GEvent.addListener(zs.map,"zoomend", function(oldLevel, newLevel) {
            zs.currentZoomLevel = newLevel;
            zs.setRailPosition(newLevel);
            zs.map.closeExtInfoWindow();
      });
      
      zs.addEvent(zs.obj, "click", function(e){ 
          var position = zs.getMousePosition(e);
          var relativePositionX = position.x - zs.obj.style.left.substring(0,zs.obj.style.left.indexOf('px'));
          relativePositionX =  relativePositionX - Math.round(zs.railWidth/2);
          
          //zoomsliderrail verschieben  
          if(zs.dragged == false){
            var left = Math.round(relativePositionX);
            zs.objectToDrag.left = left;
            zs.obj_rail.style.left = left + 'px';
          } else {
            zs.dragged = false;
          }
          
          //map zoom aendern
          var zoom = Math.round(zs.zoomLevelMax - (relativePositionX/(zs.containerWidth/(zs.zoomLevelMax-zs.zoomLevelMin+1))));
          zs.map.closeExtInfoWindow();
          zs.map.setZoom(zoom);
          zs.zoomFromSlider = true;
      } );
      zs.setRailPosition(zs.currentZoomLevel);
    },
    getMousePosition: function(e){
        var position = {
            x: null,
            y: null
        };
        //zum IE6 anpassen          
        if (navigator.appVersion.indexOf('MSIE') != -1){
            position.x = window.event.clientX;
            position.y = window.event.clientY;
        } else {
        //FF
            position.x = e.pageX;
            position.y = e.pageY;
        }
        return position;
    },
    changeStatus: function(status){
        //document.getElementById("info_pre").innerHTML = "Current event: " + status + " Left: "+zs.objectToDrag.left + " Top: "+zs.objectToDrag.top;
        return null;
    },
    onDragEnd: function(){
        zs.dragged = true;
        zs.zoomFromSlider = true;
        var zoom = Math.round(zs.zoomLevelMax - (zs.objectToDrag.left/(zs.containerWidth/(zs.zoomLevelMax-zs.zoomLevelMin+1))));
        zs.map.closeExtInfoWindow();
        zs.map.setZoom(zoom);
        zs.zoomFromSlider = true;
    },
    setRailPosition: function(zoomLevel){
        if (zs.zoomFromSlider == false) {
          var pxProLevel = zs.containerWidth/(zs.zoomLevelMax-zs.zoomLevelMin+1);
          var left = Math.round(zs.containerWidth - pxProLevel * (zoomLevel-zs.zoomLevelMin+1));
          
          if (left <=0) left = 0;
          if (left >=(zs.containerWidth-pxProLevel)) left = zs.containerWidth-pxProLevel;
          zs.objectToDrag.left = left;
          zs.obj_rail.style.left = left + 'px';
        }
    },
    setMapZoom: function(delta) {
      var zoom = zs.map.getZoom() + delta;
      if ((zoom>=zs.zoomLevelMin) && (zoom<=zs.zoomLevelMax)){ 
        zs.map.setZoom(zoom);
        zs.zoomFromSlider = false;
        zs.setRailPosition(zoom);
      }  
    },
    DOMElementsInit: function(){
    
      zs.obj = d_obj(this.id);
      zs.obj_rail = d_obj(this.id_rail);
      
      var obj_wrapper = d_obj(zs.id_wrapper);
      obj_wrapper.style.width = zs.obj.offsetWidth + 'px';
      obj_wrapper.style.height = zs.obj.offsetHeight + 'px';
      
      zs.obj.style.position = 'absolute';
      
      zs.obj.style.top = zs.obj.offsetTop + 'px';
      zs.obj.style.left = zs.obj.offsetLeft + 'px';
      zs.obj.style.width = zs.obj.offsetWidth + 'px';
      
      zs.obj_rail.style.width = zs.obj_rail.offsetWidth + 'px';
    },
    addEvent: function( obj, type, fn ){  // the add event function
      if (obj.addEventListener) obj.addEventListener( type, fn, false );
      else if (obj.attachEvent) {
        obj["e"+type+fn] = fn;
        obj[type+fn] = function() {
          obj["e"+type+fn]( window.event );
        };
        obj.attachEvent( "on"+type, obj[type+fn] );
      }
    }
    
}