// Type 1=Wasser, 2=GasPrivat, 3=GasGeschaeft

var GOMAPS = Class.create({

	initialize: function(obj) {
		this.encoding = 'ISO-8859-1';
		if(GBrowserIsCompatible()) {
			this.map = new GMap2(document.getElementById("gMaps"));
			this.map.setCenter(new GLatLng(53.47660466, 8.70391846), 9);
			this.map.disableDragging();
			//this.map.enableScrollWheelZoom();
			this.type = obj.type || 1;
			this.url = 'http://' + obj.url;
			this.initFields(obj);
		}
	},
	
	initFields: function(obj) {
		if(this.type==1) {
			this.coords = obj.coords;
			this.initWaterField();
		} else {
			this.selLand = 'PLZ, Stadt auswählen ...';
			this.selStreet = 'Straße auswählen ...';
			this.addressError = 'Bei der Prüfung der Adresse ist ein Fehler aufgetreten!';
			this.infoError = 'Bei der Ermittlung der Infodaten ist ein Fehler aufgetreten!';
			this.outOfLandError = 'Sie befinden sich außerhalb des EWE NETZ-Gebietes. Leider können wir Ihnen hierfür keine Daten zur Verfügung stellen.';
			this.initGasField();
		}
	},
	
	initGasField: function() {
		$('gPlzOrt').value = this.selLand;
		$('gStrasse').value = this.selStreet;
		$('gSearch').onsubmit = this.searchGas.bind(this);
		$('gPlzOrt').onblur = this.onBlurElm.curry($('gPlzOrt'),this.selLand);
		$('gPlzOrt').onfocus = this.onFocusElm.curry($('gPlzOrt'),this.selLand);
		$('gStrasse').onblur = this.onBlurElm.curry($('gStrasse'),this.selStreet);
		$('gStrasse').onfocus = this.onFocusElm.curry($('gStrasse'),this.selStreet);
		this.map.setCenter(new GLatLng(53.07629008, 8.73516083), 8);
		new Ajax.Autocompleter('gPlzOrt', 'gPlzOrtChoices', '../googleajax/gmAutoCompleter.php', {
			minChars: 2,
			method: 'post'
		});
	},
	
	onBlurElm: function(elm, text) {
		if(elm.value=='') elm.value = text;
	},
	
	onFocusElm: function(elm, text) {
		if(elm.value == text) elm.value = '';
		//elm.select();
	},
	
	searchGas: function() {
		//console.log('suche');
		this.map.clearOverlays();
		if($('gPlzOrt')!=this.selLand) {
			var address = $('gPlzOrt').value;
			var _self = this;
			new Ajax.Request(
				this.url + '/googleajax/gmSearchCheck.php',
				{
					method: 'post',
					requestHeaders:['Content-Type', 'application/x-www-form-urlencoded; charset='+_self.encoding,'Cache-Control', 'no-cache, must-revalidate'],
					parameters: 'check='+address,
					onFailure: function() {
						alert(this.addressError);
					},
					onSuccess: _self.searchResultGas.bind(_self)
				}
			);
	 	}
	 	return false;
	},
	
	searchResultGas: function(r) {
		var json = r.responseText.evalJSON();
		if(json.error) {
			alert(this.outOfLandError);
		} else {
			var address = json.plz + ', ' + json.ort;
			if($('gStrasse').value != this.selStreet) {
				address += ', '+$('gStrasse').value; 
			}
			var geocoder = new GClientGeocoder();
			geocoder.getLatLng(address, function(point) {
				if(!point) {
					geocoder.getLatLng($('gPlzOrt').value, function(point) {
						if(!point) {
							alert(this.outOfLandError);
						} else {
							this.map.setCenter(point, 12);
							this.setGasMarker(point, address);
						}
					}.bind(this));
				} else {
					this.map.setCenter(point, 15);
					this.setGasMarker(point, address);
				}
	 		}.bind(this));
	 	}
	},
	
	setGasMarker: function(point, address) {
		var marker = new GMarker(point);
		this.map.addOverlay(marker);
		var _self = this;
		new Ajax.Request(
			this.url + '/googleajax/gmInfo.php',
			{
				method: 'post',
				requestHeaders:['Content-Type', 'application/x-www-form-urlencoded; charset='+_self.encoding,'Cache-Control', 'no-cache, must-revalidate'],
				parameters: 'get='+address+'&type='+_self.type,
				onFailure: function() {
					alert(_self.infoError);
				},
				onSuccess: function(r) {
					_self.setInfoWindow(r, marker);
				}
			}
		);
	},
	
	setInfoWindow: function(r, marker) {
		var json = r.responseText.evalJSON();
		if(json.error) {
			alert(this.infoError);
		} else {
			GEvent.addListener(marker, 'click', function() {
	        	var html = this.setGasBubbleInfo(json);
	        	marker.openInfoWindowHtml(html);
	      	}.bind(this));
		}
	},
	
	setGasBubbleInfo: function(json) {
		var gmInfo = new Element('div',{'class':'gmInfo','style':'width: 350px;'});
		
		/*var h2 = new Element('h2');
		h2.update('Erdgas Probe');
		gmInfo.insert(h2);
		
		var h3 = new Element('h3');
		h3.update(json.title);
		gmInfo.insert(h3);*/
		
		var table = new Element('table');
		var tbody = new Element('tbody');
		tbody.insert('<tr><th class="left">Brenntechnische Kenndaten</th><th class="middle">Einheit</th><th class="middle">Wert</th></tr>');
		
		var cssClass = 'lightblue';
		var data = json.data
		for(var i=0; i<data.length; i++) {
			tbody.insert('<tr class="'+cssClass+'"><td>'+data[i].name+'</td><td class="middle">'+data[i].einheit+'</td><td class="right">'+data[i].wert+'</td></tr>');
			if(cssClass=='lightblue') cssClass = 'lightgray';
			else cssClass = 'lightblue';
		}
		
		table.insert(tbody);
		gmInfo.insert(table);
		if(this.type==3) {
			var aLink = new Element('a',{'href':'#','class':'redLink'});
			aLink.update('Messwerte');
			var param = 'type=3&' + json.param;
			aLink.onclick = this.loadData.bind(this,param);
			gmInfo.insert(aLink);
		}
		return gmInfo;
	},
	
	initWaterField: function() {
		$('waterSelect').value = 0;
		$('waterSelect').onchange = this.waterChanged.bind(this);
		this.waterChanged();
	},
	
	waterChanged: function() {
		this.map.clearOverlays();
		if($('waterSelect').value!=0) {
			var coord = this.coords[$('waterSelect').value];
			this.map.setCenter(new GLatLng(coord.lat, coord.lng), coord.zoom);
			this.setWaterMarker(coord);
		} else {
			this.map.setCenter(new GLatLng(53.47660466, 8.70391846), 9);
			this.setWaterPolies();
		}
		$('gm').focus();
	},
	
	setWaterPolies: function() {
		this.setWaterPoly('yqscIkt~p@?cki@|cM?iIbki@syL?', 'BBBBB', 4);
		this.setWaterPoly('kh}gI_hqs@cIws^zbIeP?bv_@wxHeP', 'BBBBB', 4);
		this.setWaterPoly('mftcI_ilx@?co\\`~H??|}[a~HdP', 'BBBBB', 4);
		this.setWaterPoly('yhseIg`fv@dIm_d@`pI??hnc@apIbP', 'BBBBB', 4);
		this.setWaterPoly('kbaeIqthp@dI_pUzgH??~oUarH?', 'BBBBB', 4);
	},
	
	setWaterPoly: function(poly, lvl, width) {
		var encPol = new GPolyline.fromEncoded({
   			weight: width,
			points: poly,
			levels: lvl,
   			zoomFactor: 32,
   			numLevels: 3,
   			color: '#012E71'
		});
		this.map.addOverlay(encPol);
	},
	
	setWaterMarker: function(coord) {
		if(coord.type=='point') {
			var point = new GLatLng(coord.lat, coord.lng);
			var marker = new GMarker(point);
			this.map.addOverlay(marker);
			this.showWaterInfo(coord.name, coord.range, marker);
		} else if(coord.type=='more') {
			var lands = coord.lands;
			for(var i=0; i<lands.length; i++) {
				this.setWaterMarker(lands[i]);
			}
		} else if(coord.type=='mixed') {
			this.setWaterPoly(coord.poly, coord.lvl, 2);
			var newCoord = {
				'type' : 'point',
				'lat' : coord.lat,
				'lng' : coord.lng,
				'name' : coord.name,
				'range' : coord.range || 0
			}
			this.setWaterMarker(newCoord);
		}
	},
	
	showWaterInfo: function(name, range, marker) {
		var div = new Element('div',{'class':'gmInfo'});
		var h2 = new Element('h2');
		h2.update('Netzgebiet<br/>Wasserwerk ' + name);
		var aLink = new Element('a',{'href':'#','class':'redLink'});
		aLink.update('Messwerte');
		var param = 'type=1&value=' + $('waterSelect').value + '&range=' + range;
		aLink.onclick = this.loadData.bind(this,param);
		div.insert(h2);
		div.insert(aLink);
		GEvent.addListener(marker, 'click', function() {
        	marker.openInfoWindowHtml(div);
      	});
	},
	
	decodeLine: function(encoded) {
		var len = encoded.length;
		var index = 0;
		var array = [];
		var lat = 0;
		var lng = 0;

		while (index < len) {
			var b;
			var shift = 0;
			var result = 0;
			do {
				b = encoded.charCodeAt(index++) - 63;
				result |= (b & 0x1f) << shift;
				shift += 5;
			} while (b >= 0x20);
			var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
			lat += dlat;

			shift = 0;
			result = 0;
			do {
				b = encoded.charCodeAt(index++) - 63;
				result |= (b & 0x1f) << shift;
				shift += 5;
			} while (b >= 0x20);
   			var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
			lng += dlng;
			//var gll = new GLatLng(lat * 1e-5, lng * 1e-5);
			//array.push(gll);
			array.push([lat * 1e-5, lng * 1e-5]);
		}

		return array;
	},

	decodeLevels: function(encoded) {
		var levels = [];

		for (var pointIndex = 0; pointIndex < encoded.length; ++pointIndex) {
			var pointLevel = encoded.charCodeAt(pointIndex) - 63;
			levels.push(pointLevel);
		}

		return levels;
	},

	loadData: function(param) {
		var _self = this;
		new Ajax.Request(
			this.url + '/googleajax/gmData.php',
			{
				method: 'post',
				requestHeaders:['Content-Type', 'application/x-www-form-urlencoded; charset='+_self.encoding,'Cache-Control', 'no-cache, must-revalidate'],
				parameters: param,
				onFailure: function() {
					alert(_self.infoError);
				},
				onSuccess: function(r) {
					var json = r.responseText.evalJSON();
					if(json.error) {
						alert(_self.infoError);
					} else {
						var div = new Element('div',{'class':'gmOverlay','id':'gmOverlay'});
						div.update(json.htmlText);
						
						var aPrint = new Element('a',{'class':'printer','href':'javascript:void(0);'});
						aPrint.update('Messwerte drucken');
						aPrint.onclick = printContent.curry('gmOverlay');
						div.insert(aPrint);
						
						if(_self.type==3) {
							if(json.csvExport) {
								_self.generateCsvExport(json.csvExport,div);
							}
						}
						
						var over = new Overlay();
						over.callContent(div);
					}
				}
			}
		);
		return false;
	},
	
	generateCsvExport: function(csvExport, div) {
		this.csvExport = csvExport;
		
		this.csvSelect = new Element('select',{'class':'gmCsvSelect'});
		for(var i=0; i<csvExport.length; i++) {
			var selOpt = new Element('option');
			selOpt.value = i;
			selOpt.update(csvExport[i].deDatum);
			this.csvSelect.insert(selOpt);
		}
		
		aExport = new Element('a',{'class':'gmCsvExportLink','href':'#'});
		aExport.update('CSV Datei-Export');
		aExport.onclick = this.downloadCsvExport.bind(this);
		
		div.insert(this.csvSelect);
		div.insert(aExport);
	},
	
	downloadCsvExport: function() {
		var data = this.csvExport[this.csvSelect.value];
		var param = encodeURI('pid=' + data.EntnahmeOrtId + '&pDZ=' + data.DatumZeit);
		location.href = this.url + '/googleajax/gmCsvExport.php?'+param;
		return false;
	}
});
