KetabeavvalMap = new Class({
    Implements: [Options],

    options: {
        defaultLat: 35.697,
        defaultLon: 51.366,
        defaultZoom: 11,
        markerZIndex: 11,
        markerShadowZIndex: 10,
        proj: new OpenLayers.Projection("EPSG:4326"),
        mapProj: new OpenLayers.Projection("EPSG:900913"),
        mapSeverPath1: 'http://avval.ir/images/tiles/',
        mapSeverPath2: 'http://avval.ir/images/tiles/',
        mapSeverPath3: 'http://avval.ir/images/tiles/',
        mapBounds: [51.091041, 35.509701, 51.626207, 35.8765], // Tehran boundry - Xmin, Ymin, Xmax, Ymax
        openLayersImgPath: '/images/map/dark/',
        markerIconPath: '/images/map/marker.png',
        markerIconShadowPath: '/images/map/marker-shadow.png',
        markers: [],
        overlayMaps: [],
        permalink: null
    },
    initialize: function (container, options) {
        this.setOptions(options);
        OpenLayers.ImgPath = this.options.openLayersImgPath;
        var fullExtent = new OpenLayers.Bounds.fromArray(this.options.mapBounds).transform(this.options.proj, this.options.mapProj);
        this.map = new OpenLayers.Map(container, {
            controls: [
					new OpenLayers.Control.Navigation(),
					new OpenLayers.Control.PanZoomBar(),
					new OpenLayers.Control.ScaleLine({ geodesic: true }),
					new OpenLayers.Control.Attribution()
					],
            maxExtent: fullExtent,
            restrictedExtent: fullExtent,
            units: 'm'

        });
        if (this.options.permalink) {
            this.map.addControl(new OpenLayers.Control.Permalink(this.options.permalink));
        }

        var BaseMapUrlArray = [
				this.options.mapSeverPath1 + "base/${z}/${x}/${y}.png",
				this.options.mapSeverPath2 + "base/${z}/${x}/${y}.png",
				this.options.mapSeverPath3 + "base/${z}/${x}/${y}.png",
			];
        var baseMapOptions = {
            sphericalMercator: true,
            buffer: 0,
            transitionEffect: "resize",
            attribution: "<div id='ka-logo'></div>",
            minZoomLevel: 11,
            zoomOffset: 11,
            numZoomLevels: 8,
            displayInLayerSwitcher: false
        };
        ketabeavvalBaseMap = new OpenLayers.Layer.XYZ("Base Map", BaseMapUrlArray, baseMapOptions);
        this.map.addLayer(ketabeavvalBaseMap);

        if (this.options.overlayMaps.length >= 1) {
            this.addOverlayMaps(this.options.overlayMaps);
        }
        if (this.options.markers.length >= 1) {
            this.addMarkers(this.options.markers);
        }
        var centerlonLat = new OpenLayers.LonLat(this.defaultLon, this.options.defaultLat).transform(this.options.proj, this.map.getProjectionObject());
        var zoom = this.options.defaultZoom;
        if (!this.map.getCenter()) {
            this.map.setCenter(centerlonLat, zoom);
        }

        //this.map.addControl(new OpenLayers.Control.OverviewMap());

        return this;
    },

    addOverlayMaps: function (layers) {
        var layerObjects = [];
        var overlayMapOptions = {
            sphericalMercator: true,
            buffer: 0,
            transitionEffect: "resize",
            attribution: "<div id='ka-logo'></div>",
            minZoomLevel: 11,
            zoomOffset: 11,
            numZoomLevels: 7,
            transparent: 'true',
            reaspect: 'false',
            isBaseLayer: false,
            opacity: 0.4,
            visibility: false
        };
        layers.each(function (layer) {
            var layerUrlArray = [
				this.options.mapSeverPath1 + layer + "/${z}/${x}/${y}.png",
				this.options.mapSeverPath2 + layer + "/${z}/${x}/${y}.png",
				this.options.mapSeverPath3 + layer + "/${z}/${x}/${y}.png",
			];
            var label;
            switch (layer) {
                case 'zojofard':
                    label = 'زوج و فرد';
                    break;
                case 'traffic':
                    label = 'طرح ترافیک';
                    break;
                case 'shahrdari':
                    label = 'شهرداری';
                    break;
            }
            layerObject = new OpenLayers.Layer.XYZ(label, layerUrlArray, overlayMapOptions);
            layerObjects.push(layerObject);
        } .bind(this));
        this.map.addLayers(layerObjects);
        //layerObjects.setVisibility(false);
        //var switcherControl = new OpenLayers.Control.LayerSwitcher({'div':OpenLayers.Util.getElement('layer-switcher'), roundedCorner:false});
        var switcherControl = new OpenLayers.Control.LayerSwitcher({ roundedCorner: false });
        this.map.addControl(switcherControl);
    },

    addMarkers: function (markers) {
        markersLayer = new OpenLayers.Layer.Vector("Markers",
			{
			    styleMap: new OpenLayers.StyleMap({
			        externalGraphic: this.options.markerIconPath,
			        backgroundGraphic: this.options.markerIconShadowPath,
			        backgroundXOffset: -3,
			        backgroundYOffset: 1,
			        graphicZIndex: this.options.markerZIndex,
			        graphicWidth: 18,
			        graphicHeight: 27,
			        backgroundHeight: 14,
			        backgroundWidth: 39,
			        backgroundGraphicZIndex: this.options.markerShadowZIndex
			    }),
			    isBaseLayer: false,
			    rendererOptions: { yOrdering: true },
			    displayInLayerSwitcher: false
			}
		);
        this.map.addLayer(markersLayer);

        var totalPOIs = markers.length;
        var features = [];
        for (var i = 0; i < totalPOIs; i++) {
            var MarkerDef = markers[i];
            features.push(new OpenLayers.Feature.Vector(
				new OpenLayers.Geometry.Point(MarkerDef.LON, MarkerDef.LAT).transform(this.options.proj, this.options.mapProj)
			));
        }
        //console.log(features);

        markersLayer.addFeatures(features);

    },

    kmZoomToExtent: function (extent) {
        this.map.zoomToExtent(new OpenLayers.Bounds.fromArray(extent).transform(this.options.proj, this.options.mapProj));
    }
});

