// ###################### GLOBALS ############################

var map;
var markersArray = [];
var allMarkersArray = [];
var markerClusterer;
var mc;
var infowindow;
var partnerdata;
var geocoder;

var style = [{
    url: '../images/cluster_small.png',
    height: 50,
    width: 50
  }, {
  url: '../images/cluster_small.png',
    height: 50,
    width: 50
  }, {
    url: '../images/cluster_medium.png',
    height: 84,
    width: 84
  }];
var clusterOptions = { maxZoom: 10, gridSize: 25, styles: style };

// ###################### Anmeldung / Intern #################

/*
 * getCoordinates ermittelt anhand eines 
 * Webservices von google die zu einer Adresse 
 * gehörenden Koordinaten.
 * 
 * Sollte es kein eindeutiges Ergebnis geben, 
 * wird eine Adresskorrektur angeboten, basieren 
 * auf den Vorschlägen von Google und einer manuellen 
 * Möglichkeit zur Positionsfindung.
 * 
 */
function getCoordinates() {
	if(!$('#portaldata-type-3').attr('checked'))
	{		
		var street;
		var zipcode;
		var city;
		var hnumber;
		var country;
		var tmp_offer;
		var code;
		
	    $.getJSON("/Ajax/geocode", 
	            {
	    			street: $("input[name='portaldata[street]']").val(), 
					hnumber: $("input[name='portaldata[hnumber]']").val(), 
					city: $("input[name='portaldata[city]']").val(), 
					zipcode: $("input[name='portaldata[zipcode]']").val(), 
					county: "GERMANY" 
	            },
	            function(data){
	            	if(data.results.length > 1)
	            	{
	            		$('#offers').html('');
	            		for (i = 0; i < data.results.length; i++) 
	            		{
	            			addressOffer = data.results[i].formatted_address;            			
	            			lat = data.results[i].geometry.location.lat;
	            			lng = data.results[i].geometry.location.lng;
	            			
	            			$.each(data.results[i].address_components, function(i, offer){
	            				switch (offer.types[0])
	            				{
		            				case "street_number":
		            					hnumber = offer.long_name;
		            					break;
		            				case "postal_code":
		            					zipcode = offer.long_name;
		            					break;
		            				case "route":
		            					street = offer.long_name;
		            					break;
		            				case "locality":
		            					city = offer.long_name;
		            					break;
		            				case "country":
		            					country = offer.long_name;
	            				}
	            			});            			
	            			code = '<div id="offer_'+i+'">';
	            			code += '	<input id="radiooffer_'+i+'" type="radio" name="addressoffers[]" value="'+lat+','+lng+'"/>';
	            			code += '	<span name="street">'+street+'</span>, ';
	            			code += '	<span name="hnumber">'+hnumber+'</span>, ';
	            			code += '	<span name="zipcode">'+zipcode+'</span>, ';
	            			code += '	<span name="city">'+city+'</span>, ';
	            			code += '	<span name="city">'+country+'</span>';
	            			code += '</div>';
	            			$('#offers').append(code);            			
	            		}
	            		$('.dialogbox').dialog({
				            					title: 'Adresskorrektur',
				            					width: 550, 
				            					modal: true,
				            					height: 'auto' 
	            								});
	            		getCoordinatesMap();
	            	}else if(data.results.length <= 0)
	            	{
	            		$('.dialogbox').dialog({
        					title: 'Adresskorrektur',
        					width: 550, 
        					modal: true,
        					height: 'auto' 
							});
	            		getCoordinatesMap();
	            	}  
	            	else if(data.results.length == 1)
	            	{
	            		$.each(data.results[0].address_components, function(i, offer){
            				switch (offer.types[0])
            				{
	            				case "street_number":
	            					data['hnumber'] = offer.long_name;
	            					break;
	            				case "postal_code":
	            					data['zipcode'] = offer.long_name;
	            					break;
	            				case "route":
	            					data['street'] = offer.long_name;
	            					break;
	            				case "locality":
	            					data['city'] = offer.long_name;
	            					break;
	            				case "country":
	            					data['country'] = offer.long_name;
            				}
            			});
	        			data['lat'] = data.results[0].geometry.location.lat;
	        			data['lng'] = data.results[0].geometry.location.lng;
	        			$.each(data, function(key, value){
	        				$("input[name='portaldata[" + key +"]']").val(value);
	        			});
	            		$('#portaldata').submit();
	            	}
	            });
	}
	else{
		$('#portaldata-mancoords').val('0');
		$('#portaldata').submit();
	}
}
function getCoordinatesMap() 
{
	var myLatlng = new google.maps.LatLng(51.235625,10.459734);
	var myOptions = {
						zoom: 6,
						center: myLatlng,
						mapTypeId: google.maps.MapTypeId.ROADMAP
	}
	map = new google.maps.Map(document.getElementById("miniMap"), myOptions);
	google.maps.event.addListener(map, 'click', function(event) {
		placeMarker(event.latLng);
	});
}
function deleteOverlays()
{	
	if (infowindow) {infowindow.close();}
	if (markersArray) {
		for (i in markersArray) 
		{
			markersArray[i].setMap(null);
		}
		markersArray.length = 0;
	}
	if (mc){mc.clearMarkers();}
}
function placeMarker(location) 
{
	if(markersArray) {
		deleteOverlays();
		markersArray.length = 0;
	}
	var marker = new google.maps.Marker({
											position: location, 
											map: map
										});
	var message = 	"<div>Diese Position &uuml;bernehmen</div>" +
					"<div><input type='button' value='OK' onClick='acceptManCoordinates();'/></div>";
	markersArray.push(marker);
	var infowindow = new google.maps.InfoWindow({
				content: message,
				size: new google.maps.Size(50,50)
			});
	infowindow.open(map,marker);
	infowindowArray.push(infowindow);
	map.setCenter(location);
}
function acceptManCoordinates(){
	$('.dialogbox').dialog('close');
	$('#portaldata-lat').val(markersArray[0]['position'].lat());
	$('#portaldata-lng').val(markersArray[0]['position'].lng());
	$('#portaldata-mancoords').val('1');
	$('#portaldata').submit();
}
/*
 * confirmChange �bertr�gt die Koordinaten bzw.
 * die Adress�nderung in das Formular. 
 * 
 */
function confirmChange() 
{
	var coords;
	var formElements;
	var formElementName;
	var data = {};
	
	$.each($('#offers :input[type=radio]'), function(i, offer){
		if($(offer).attr('checked') == true) 
		{	
			coords = $(offer).val().split(',');
			formElements = $(offer).parent().find('span');
			formElements.each(function(){
				data[$(this).attr('name')] = $(this).html();
			});
			data['lat'] = coords[0];
			data['lng'] = coords[1];
			$.each(data, function(key, value){
				$("input[name='portaldata[" + key +"]']").val(value);
			});
		}
	});	
	$('.dialogbox').dialog('close');
	$('#portaldata').submit();
}
function copyTimes(arrow){
	targetboxes = $(arrow).parents('.timesgroup').next().find('select');
	$.each($(arrow).parents('.timesgroup').find('select'), function(i, box){
		$(targetboxes[i]).val($(box).val());
	});
}
/*
 * isValid �bertr�gt die Koordinaten bzw.
 * die Adress�nderung in das Formular. 
 * 
 */
function isValid(formname) 
{
	//TODO Formname dynamisch machen
	var formname = 'Portaldata';
	var formnameLC = formname.toLowerCase();
	//TODO das hier w�rde gehen, wenn ich nicht subforms und normale elemente gemischt h�tte ...
	// wenn der firmenname falsch ist, setzt er den error unter die subform ....
	var url = '/Ajax/valid'
	var data = { formname: formname };
	$("input").each(function()
	{
	        data[$(this).attr('name')] = $(this).val();
	});
    $.post(url,data,function(resp)
    {
    	if(resp != '0')
    	{
    		$('#fieldset-'+formnameLC).find('.errors').remove();
	    	$.each(resp.portaldata, function(name, obj) {
	    		if(parseInt($("input[name='"+formnameLC+"[" + name +"]']").css('width')) >= 120)
	    		{
		    		$("input[name='"+formnameLC+"[" + name +"]']").parent().after(getErrorHtml(obj));
	    		}
	    		else
	    		{
		    		$("input[name='"+formnameLC+"[" + name +"]']").parent().parent().append(getErrorHtml(obj));
	    		}		    		
	    	});
	    	return false;
    	}
    	else{
    		return true;
    	}
    },'json');
}
function getErrorHtml(formErrors)
{
	var o ='<ul class="errors">';
	for(errorKey in formErrors)
	{
		o += '<li>' + formErrors[errorKey] + '</li>';
	}
	o += '</ul>';
	return o;	
}
function initializeGMap() {
		var myOptions = {
							zoom: 6,
							mapTypeControl: false,
							mapTypeId: google.maps.MapTypeId.ROADMAP,
							scrollwheel: false
						};
		map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
		map.setCenter(new google.maps.LatLng(51.3, 10.435252));
		geocoder = new google.maps.Geocoder();
		mc = new MarkerClusterer(map, [], clusterOptions);
		if($('#providerMode').val() != 'false') {
			getSingleProviderMarker($('#providerMode').val());
		}
		else {
			getMarker();
		}		
}
function getMarker(){	
	$.getJSON("/Ajax/getmarker", {},
            function(resp)
            {
				partnerdata = resp;
				setMarker(partnerdata);				
            });
}
function getSingleProviderMarker(prov){	
	$.getJSON("/Ajax/getsingleprovider", {prov: prov},
            function(resp)
            {
				partnerdata = resp;
				setMarker(partnerdata);				
            });
}
function setMarker(resp){	
	var marker;
	var image;
	markersArray = [];

	infowindow = new google.maps.InfoWindow();
	$.each(resp, function(i, details) 
	{				
		image = '../images/marker/marker_'+details.image+'.gif';
		marker = new google.maps.Marker({
	        position: new google.maps.LatLng(details.lat, details.lng), 
	        map: map,
	        icon: image,
	        title: details.firm,
	        provider: details.provider,
	        actions: details.actions,
	        uid: details.uid
	    });										
		google.maps.event.addListener(marker, 'click', function() {
			openBubble(infowindow, details);
		});						
		markersArray.push(marker);
	});		
	allMarkersArray = markersArray;
	mc.addMarkers(markersArray);
}
function providerFilter()
{
	var j;
	markersArray = allMarkersArray;
	var selection = $('.fhform :input:checked');
	var selected = new Array();
	if (mc){mc.clearMarkers();}
	if (infowindow) {infowindow.close();}
	if (markersArray) {
		for (i in markersArray) 
		{
			j=0;
			while (j < selection.length)
			{
				if(markersArray[i].provider[$(selection[j]).val()])
				{
					markersArray[i].setMap(map);
					selected.push(markersArray[i]);
					break;
				}
				j++;
			}
		}
	}
	mc.addMarkers(selected);
}
function actionFilter(aid)
{
	var selected = new Array();
	markersArray = allMarkersArray;
	if (mc){mc.clearMarkers();}
	if (infowindow) {infowindow.close();}
	if (markersArray) {
		for (i in markersArray) 
		{
			if(markersArray[i].actions[aid])
			{
				markersArray[i].setMap(map);
				selected.push(markersArray[i]);				
			}
		}
	}
	mc.addMarkers(selected);
}
function moveToAddress(address)
{
	geocoder.geocode({ 'address': address+" GERMANY"}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			map.setZoom(11);
			map.setCenter(results[0].geometry.location, 12);
		} else {
				//TODO
				alert("Die Adresse wurde nicht gefunden.");
		}
	});	
}
function awardOpenBubble(uid){
	var details = { uid: uid };
	infowindow = new google.maps.InfoWindow();
	$.each(markersArray, function() {
		if(this.uid == details.uid)
		{
			details.lat = this.position.lat();
			details.lng = this.position.lng();
			openBubble(infowindow, details);
		}
	});
}
function sealOpener(){
	$(".sealbox").dialog({width:585, height:430, modal: true, resizable: false, draggable: false});
}
function openBubble(infowindow, details)
{
	var content="";
	$.getJSON("/Ajax/getpartnerinfo", {uid: details.uid},
            function(resp)
            {
					infowindow.close();		
					content += '<div class="bubbleBox" id="b_'+details.uid+'">';
					
						content += '<div style="width:250px;">';
						content += '	<div class="bubble_contact"></div>';
						content += '	<div class="bubble_shops"></div>';
						content += '	<div class="bubble_times"></div>';
						content += '	<div class="clear">&nbsp;</div>';
						content += '</div>';
						content += '<div class="contact">';
						content += 		'<h3>Ihr Fachh&auml;ndler</h3>';
						content += 		'<div>'+resp.firm+' '+ getIcons(resp.provider) +'</div>';
						content += 		'<div class="addressbox">';					
						content += 			'<div class="tgray">'+resp.others+'</div>';
						if(resp.subdomain != null) {
							content += 		'<div><a target="_blank" href="http://'+(resp.subdomain).toLowerCase()+'.anschlussberater.de">Zum Webauftritt...</a></div>';
						}
						content +=			'<br/>';
						content += 			'<div>'+resp.street+' '+resp.hnumber+'</div>';
						content += 			'<div>'+resp.zipcode+' '+resp.city+'</div>';
						if(resp.phone != null && resp.phone != '') {
							content += 			'<div>Tel.: '+resp.phone+'</div>';
						}else{
							content += 			'<div>&nbsp;</div>';
						}
						if(resp.fax != null && resp.fax != '') {
							content += 			'<div>Fax.: '+resp.fax+'</div>';
						}else{
							content += 			'<div>&nbsp;</div>';
						}
						content +=		'</div>';
						content += 		'<div class="imgbox">';
						content += 			'<img src="/upload/'+resp.picture+'"/>';
						content +=		'</div>';
						content +=	'</div>';						
						content += '<div class="shops" style="display:none;">';
						if(resp.wsid != false)
						{
							content += 		'<h3>Hier k&ouml;nnen Sie bei diesem H&auml;ndler direkt online bestellen:</h3>';
							$.each(resp.fixprovider, function(i, fixprov) 
							{
								content += '<div>';
								content += 		'<a target="_blank" href="'+fixprov.shoplink+'?abdirekt=1&wsid='+resp.wsid+'" ';
								if(resp.tfgid > 0)									
								{
									content +=		'onClick="loadShortRegistration('+resp.tfgid+','+fixprov.tfgid+')"';
								}								
								content += 			'/><img src="/images/provider_'+fixprov.pid+'.gif" alt="'+fixprov.name+' Onlineshop">';
								content += 			'<span>'+fixprov.name+' Onlineshop</span>';
								content +=		'</a>';
								content += '</div>';
							});
						}
						else
						{	
							content += 		'<h3>&nbsp;</h3>';
							content += 		'<div>Dieser Partner hat sich nicht f&uuml;r eine Online-Bestellm&ouml;glichkeit registriert.</div>';
						}
						content +=	'</div>';						
						content += '<div class="times" style="display:none;height:160px;">';												
						if(resp.officehours != null)
						{
							content += 		'<h3>Zu diesen Zeiten ist Ihr Fachh&auml;ndler f&uuml;r Sie<br/>erreichbar</h3>';
							content +=		'<div style="font-weight: bold; float: left; width: 90px;">&nbsp;</div>';
							content += 		'<div style="margin-bottom: 3px;"><span>&Ouml;ffnungszeiten</span><span style="margin-left: 21px;">Pause</span></div>';
							content += 		'<div style="font-weight: bold; float: left; width: 90px;">Montag</div><div><span>'+resp.officehours.Montag.open+'</span><span style="margin-left: 32px;">'+resp.officehours.Montag.breaktime+'</span></div>';
							content += 		'<div style="font-weight: bold; float: left; width: 90px;">Dienstag</div><div><span>'+resp.officehours.Dienstag.open+'</span><span style="margin-left: 32px;">'+resp.officehours.Dienstag.breaktime+'</span></div>';
							content += 		'<div style="font-weight: bold; float: left; width: 90px;">Mittwoch</div><div><span>'+resp.officehours.Mittwoch.open+'</span><span style="margin-left: 32px;">'+resp.officehours.Mittwoch.breaktime+'</span></div>';
							content += 		'<div style="font-weight: bold; float: left; width: 90px;">Donnerstag</div><div><span>'+resp.officehours.Donnerstag.open+'</span><span style="margin-left: 32px;">'+resp.officehours.Donnerstag.breaktime+'</span></div>';
							content += 		'<div style="font-weight: bold; float: left; width: 90px;">Freitag</div><div><span>'+resp.officehours.Freitag.open+'</span><span style="margin-left: 32px;">'+resp.officehours.Freitag.breaktime+'</span></div>';
							content += 		'<div style="font-weight: bold; float: left; width: 90px;">Samstag</div><div><span>'+resp.officehours.Samstag.open+'</span><span style="margin-left: 32px;">'+resp.officehours.Samstag.breaktime+'</span></div>';
						}
						else
						{	
							content += 		'<h3>&nbsp;</h3>';
							content += 		'<div>Es handelt sich bei diesem Partner um einen<br/>Fachhandelspartner ohne Ladenlokal.<br/><br/>Ein pers&ouml;nliches Erscheinen ist im Regelfall<br/>nicht vorgesehen.</div>';
						}						
						content +=	'</div>';					
					content +=	'</div>';
					
					
					infowindow.setContent(content);
					infowindow.setPosition(new google.maps.LatLng(details.lat,details.lng));
					infowindow.open(map);
					
					
					$(".bubble_times").bind("click", function() {
						$(".shops").hide();
						$(".contact").hide();
						$(".times").show();
//						return false;
					});
					$(".bubble_shops").bind("click", function() {
						$(".times").hide();
						$(".contact").hide();
						$(".shops").show();
//						return false;
					});
					$(".bubble_contact").bind("click", function() {
						$(".shops").hide();
						$(".times").hide();
						$(".contact").show();
//						return false;
					});
					
            });	
}
function getIcons(provdata)
{
	var html = "";
	$.each(provdata, function(i, prov) 
	{
		html += '<img src="/images/provider_'+prov.pid+'.gif" alt="'+prov.name+'"/> ';
	});
	return html;
}
function restoreActionBox(button)
{
	$(button).parents('.actionbox').find('.details').slideUp();
	$(button).parents('.actionbox').find('.close').hide();
	$(button).parents('.actionbox').find('.more').show();
	$(button).parents('.actions').children().slideDown();
}
function randomUUID() {
	var s = [], itoh = '0123456789abcdef';
	for (var i = 0; i <36; i++) {
		s[i] = Math.floor(Math.random()*0x10);
	}
	s[14] = 4;
	s[19] = (s[19] & 0x3) | 0x8;
	for (var i = 0; i <36; i++)
	{
		s[i] = itoh[s[i]];
	}
	s[8] = s[13] = s[18] = s[23] = '-';
	return s.join('');
}
function loadShortRegistration(mid, cid)
{
	$.get('/Ajax/shortregistration', {url: "http://ws.tarifguard.de/getshortreg?mid=" + mid + "&cid=" + cid + "&redirect=/Ajax/shortregistration"},
			function(resp)
			{
				if(resp != "Mentor nicht gefunden!"){
					$("#target").html(resp);
				}
			}
		);	
}


