var GIPUZKOA_EXTENT = new OpenLayers.Bounds( -290161.04, 5295335.5, -191077.32, 5373290.31),
		GLOBAL_EXTENT   = new OpenLayers.Bounds( -20037508, -20037508, 20037508, 20037508.34),
		DONOSTIA_EXTENT = new OpenLayers.Bounds( -224779.99454734594, 5358980.567203188, -218946.8938273783, 5362319.909875799);

var MERCATOR_PROYECTION = "EPSG:900913";

var LAYERS = [
[ "Mapa Gipuzkoa 2009", "map", "png"],
[ "Orto Gipuzkoa 2006", "ort", "jpg"],
[ "Orto Gipuzkoa 1954", "ort1954", "jpg"]
];

var MAP_OPTIONS = {
	controls:           [new OpenLayers.Control.Navigation({zoomWheelEnabled: false}), new OpenLayers.Control.PanZoomBar(), new OpenLayers.Control.ScaleLine(), new OpenLayers.Control.MousePosition()/*,new OpenLayers.Control.LayerSwitcher()*/],
	maxExtent:          GLOBAL_EXTENT,
	maxResolution:      156543.0339,
	restrictedExtent:   GIPUZKOA_EXTENT,
	numZoomLevels:      20,
	units:              "m",
	projection:         new OpenLayers.Projection(MERCATOR_PROYECTION),
	displayProjection:  new OpenLayers.Projection("EPSG:4326")
};

var API_BASE_URL = "http://b5m.gipuzkoa.net/api/1.0/es/";
var layers = [], map;
var MIN_ZOOM = 12,
		MAX_ZOOM = 19;

function init() {
	// Mapa kargatu aurretik futzio hau exekutatzen dugu IEn maparen gainean scroll egiterakoan errorea ez emateko!!!!!!!!!!
	OpenLayers.Events.prototype.getMousePosition = function (evt) {
			if (!this.includeXY) {
					this.clearMouseCache();
			} else if (!this.element.hasScrollEvent) {
					OpenLayers.Event.observe(window, 'scroll',
							OpenLayers.Function.bind(this.clearMouseCache, this));
					this.element.hasScrollEvent = true;
			}
		 
			if (!this.element.scrolls) {
				this.element.scrolls = [
						(document.documentElement.scrollLeft
										 || document.body.scrollLeft),
						(document.documentElement.scrollTop
										 || document.body.scrollTop)
				];

			}

			if (!this.element.lefttop) {
				this.element.lefttop = [
						(document.documentElement.clientLeft || 0),
						(document.documentElement.clientTop  || 0)
				];
			}
		 
			if (!this.element.offsets) {
					this.element.offsets = OpenLayers.Util.pagePosition(this.element);
					this.element.offsets[0] += this.element.scrolls[0];
					this.element.offsets[1] += this.element.scrolls[1];
			}
			return new OpenLayers.Pixel(
					(evt.clientX + this.element.scrolls[0]) - this.element.offsets[0]
											 - this.element.lefttop[0],
					(evt.clientY + this.element.scrolls[1]) - this.element.offsets[1]
											 - this.element.lefttop[1]
			);
	};

	map = new OpenLayers.Map("b5map-mapArea", MAP_OPTIONS);
	//addPanels(map); // "manual zoom" eta "drag" funtzioak kendu behar ditut mouse wheel kentzeko...
	for(var i=0; i<LAYERS.length; i++) {
		var layerData = LAYERS[i] 
			layer = new OpenLayers.Layer.TMS( layerData[0],
				API_BASE_URL + "osgeo/tms/tileset/",
				{
				  layername:                layerData[1],
				  type:                     layerData[2],
				  proyection:               MERCATOR_PROYECTION,
				  displayOutsideMaxExtent:  false,
				  isBaseLayer:              true
				}
		  );
		map.addLayer(layer);
		layers.push(layer);
	}

	// bi layer sortu puntuak eta itzalak sartzeko
	shadowslayer = new OpenLayers.Layer.Markers("itzalak");
	map.addLayer(shadowslayer);
	markerslayer = new OpenLayers.Layer.Markers("puntuak");
	map.addLayer(markerslayer);

	// haseran puntuak kargatu
	loadDots(jstab,jszenbagarren,jstabsub,jsletra);

	var center = (new OpenLayers.LonLat(-2.16757, 43.28267)).transform( map.displayProjection, MAP_OPTIONS.projection);
	//map.setCenter(center, 14, false, true);
	map.setCenter(center , MIN_ZOOM+2, false, true);
	restrictZoom(map, MIN_ZOOM, MAX_ZOOM);
}

function loadDots(tab,zenbagarren,tabsub,abc) {
	
	shadowslayer.clearMarkers();// ezer kargatu aurretik itzalen layer hustu
	markerslayer.clearMarkers();// ezer kargatu aurretik puntuen layer hustu
	
	var shadowsize = new OpenLayers.Size(23,14); // itzalen ikonoak definitu
	var shadowoffset = new OpenLayers.Pixel(-8,-16);
	var shadow = new OpenLayers.Icon(jsroot+'botika/b5m/img/shadow.png',shadowsize,shadowoffset);
	
	var icon = new Array();
	var iconberri=new Array();
	var shadowberri=new Array();
	var	markersarray=new Array();
	
	//markers & shadows
	if(abc==0) { // letra gabe, denak jarraian
		for(i=jstots[tab-1];i>=1;i--) {	
			var size = new OpenLayers.Size(19,30); // puntuen ikonoak definitu
			var offset = new OpenLayers.Pixel(-10,-30);
			if(i==zenbagarren){
				icon[i] = new OpenLayers.Icon(jsroot+'botika/b5m/img/markeron'+i+'.png',size,offset);
				} else {
				icon[i] = new OpenLayers.Icon(jsroot+'botika/b5m/img/marker'+i+'.png',size,offset);
			}
			
			iconberri[i] = icon[i].clone();
			shadowberri[i] = shadow.clone();
			
			markersarray[i]=new OpenLayers.Marker(new OpenLayers.LonLat(jslon[tab][i], jslat[tab][i]).transform(map.displayProjection, MAP_OPTIONS.projection),iconberri[i]);
			shadows=new OpenLayers.Marker(new OpenLayers.LonLat(jslon[tab][i], jslat[tab][i]).transform(map.displayProjection, MAP_OPTIONS.projection),shadowberri[i]);
			
			markersarray[i].num=i; // zenbagarrena den jakiteko
			markersarray[i].icon.imageDiv.firstChild.title = i+'. '+jsnom[tab][i]; // puntuetan ALT agertzeko (title)
			
			markerslayer.addMarker(markersarray[i]); // puntua layer-ean sartzeko
			
			// puntu bakoitzaren "page" eta "hori" kalkulatzeko
			if(jstots[tab-1]>jspagesize) {
				zatitua=i/jspagesize;
				mod = zatitua % 1;
				if(mod==0) {
					markersarray[i].page=i/jspagesize; markersarray[i].hori=jspagesize;
				} else {
					markersarray[i].page=parseInt(i/jspagesize)+1; markersarray[i].hori=i-(jspagesize*(markersarray[i].page-1));
				}
			} else { markersarray[i].page=1; markersarray[i].hori=i; }
			
			// puntu bakoitza klikatzean gertatu beharrekoa definitzeko
			markersarray[i].events.register ("mousedown", this.num, function(evt) {
				for(j=jstots[tab-1];j>=1;j--) {
					markersarray[j].setUrl(jsroot+"botika/b5m/img/marker"+j+".png"); // denak OFF jarri
				}
				markersarray[this.num].setUrl(jsroot+"botika/b5m/img/markeron"+this.num+".png"); // bera ON jarri
				loadData(tab,0,this.page,this.hori); // fitxak berriro kargatu
			})
			//itzalak gehitu
			shadowslayer.addMarker(shadows);
		}
	} else { // letrakin, taldeka zerrendatuta
		for(i=jstotsabc[tab][abc];i>=1;i--) {	
			var size = new OpenLayers.Size(19,30); // puntuen ikonoak definitu
			var offset = new OpenLayers.Pixel(-10,-30);
			if(i==zenbagarren){
				icon[i] = new OpenLayers.Icon(jsroot+'botika/b5m/img/markeron'+i+'.png',size,offset);
				} else {
				icon[i] = new OpenLayers.Icon(jsroot+'botika/b5m/img/marker'+i+'.png',size,offset);
			}
			
			iconberri[i] = icon[i].clone();
			shadowberri[i] = shadow.clone();
			
			markersarray[i]=new OpenLayers.Marker(new OpenLayers.LonLat(jslonabc[tab][abc][i], jslatabc[tab][abc][i]).transform(map.displayProjection, MAP_OPTIONS.projection),iconberri[i]);
			shadows=new OpenLayers.Marker(new OpenLayers.LonLat(jslonabc[tab][abc][i], jslatabc[tab][abc][i]).transform(map.displayProjection, MAP_OPTIONS.projection),shadowberri[i]);
			
			markersarray[i].num=i; // zenbagarrena den jakiteko
			markersarray[i].icon.imageDiv.firstChild.title = i+'. '+jsnomabc[tab][abc][i]; // puntuetan ALT agertzeko (title)
			
			markerslayer.addMarker(markersarray[i]); // puntua layer-ean sartzeko
			
			// puntu bakoitzaren "page" eta "hori" kalkulatzeko
			if(jstotsabc[tab][abc]>jspagesize) {
				zatitua=i/jspagesize;
				mod = zatitua % 1;
				if(mod==0) {
					markersarray[i].page=i/jspagesize; markersarray[i].hori=jspagesize;
				} else {
					markersarray[i].page=parseInt(i/jspagesize)+1; markersarray[i].hori=i-(jspagesize*(markersarray[i].page-1));
				}
			} else { markersarray[i].page=1; markersarray[i].hori=i; }
			
			// puntu bakoitza klikatzean gertatu beharrekoa definitzeko
			markersarray[i].events.register ("mousedown", this.num, function(evt) {
				for(j=jstotsabc[tab][abc];j>=1;j--) {
					markersarray[j].setUrl(jsroot+"botika/b5m/img/marker"+j+".png"); // denak OFF jarri
				}
				markersarray[this.num].setUrl(jsroot+"botika/b5m/img/markeron"+this.num+".png"); // bera ON jarri
				loadData(tab,abc,this.page,this.hori); // fitxak berriro kargatu
			})
			//itzalak gehitu
			shadowslayer.addMarker(shadows);
		}
	}
}

function switchToLayer(index) {
	map.setBaseLayer(layers[index]);
}

// ZOOM restrict
function restrictZoom(map, zoomMin, zoomMax) {
	map.events.register("zoomend", this, function() {
		var zoom = map.getZoom();
		if(zoom < zoomMin) {
			//console.log("" + zoom + " < " + zoomMin);
			map.zoomTo(zoomMin);
		}
		if(zoom > zoomMax) {
			//console.log("" + zoom + " > " + zoomMax);
			map.zoomTo(zoomMax);
		}
		//console.log(zoom);
	});
}

// ZOOM bar
function addPanels(map) {
	var zoomBox = new OpenLayers.Control.ZoomBox( {title: "manual zoom"}),
			mouseDefaults = new OpenLayers.Control.MouseDefaults( {title: "drag"}),
			panel = new OpenLayers.Control.Panel( {defaultControl: mouseDefaults});

	panel.addControls([zoomBox, mouseDefaults]);
	map.addControl(panel);
}
