google.load("maps", "3.x",{
	other_params: 'sensor=false'
});

var map;
var marker = {};
var markerStreets;
var bubbles = {};
var bubble;
var shadowURL = "/fileadmin/img/sms_foehr_az_img/shadow50.png";
var shadowMarker;
var marker_image_path = "/fileadmin/img/sms_foehr_az_img/";
var marker_color = {};
var map_rendered = false;
var suggOut;
var streetsSuggOut;

var printLat;
var printLon;
var printZoom;
var printType;

var categories = {
    'serv': {
        'marker': 'gelb.png',
        'name': 'Dienstleister'
    },
    'hotel': {
        'marker': 'apfelgruen.png',
        'name': 'Unterk&uuml;nfte'
    },
    'eat': {
        'marker': 'violett.png',
        'name': 'Gastronomie'
    },
    'place': {
        'marker': 'blau.png',
        'name': 'Orte'
    },
    'sight': {
        'marker': 'rot.png',
        'name': 'Sehensw&uuml;rdigkeiten'
    },
    'street': {
        'marker': 'orange.png',
        'name': 'Stra&szlig;e'
    }
};

Array.prototype.in_array = function(needle){
    for (var i = 0; i < this.length; i++) 
        if (this[i] === needle) 
            return true;
    return false;
};


google.setOnLoadCallback(function(){
		// get url-params
	jQuery.urlParam = function(name){
		var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
		if (results != null) return results[1];
		return 0;
	};
	
    jQuery(document).ready(function(){
        jQuery.each(jQuery('.marker_title'), function(){
            var img = marker_image_path + categories[$(this).parent().attr('id').replace('filter_', '')]['marker'];
            $(this).css({
                'background-image': 'url(' + img + ')'
            });
        });
        renderMap();
        jQuery('#map_filter input[type=checkbox]').click(function(){
            renderMarker();
        });
        jQuery('.tx-smsfoehrkarte-pi1 .printMap a').click(function(){
			var url = 'http://www.foehr.de/insel/karten-inselorte/inselkarte/?type=70';
			url += '&lat=' + printLat;
			url += '&lon=' + printLon;
			url += '&zoom=' + printZoom;
			url += '&maptype=' + printType;
            return openprint(url);
        });
        
        // gallery
        jQuery('.switch_prev').live('mouseup', function(){
            slideGallery('prev', jQuery(this).parent().attr('id').replace('curr_', ''));
        });
        jQuery('.switch_next').live('mouseup', function(){
            slideGallery('next', jQuery(this).parent().attr('id').replace('curr_', ''));
        });
        
		// autosuggest
        if (jQuery('#autoSuggest').length) {
            suggOut = jQuery('#suggOutput');
            streetsSuggOut = jQuery('#streetsSuggOutput');
            jQuery('input#suggInput').keyup(function(){
                makeSuggests(jQuery(this).val());
            });
            jQuery('input#streetsSuggInput').keyup(function(){
                makeStreetSuggests(jQuery(this).val());
            });
            jQuery('.suggPoint').live('click', function(){
				var id = jQuery(this).attr('id').replace('sugg_', '');
				jQuery('#map_filter input[value=' + jsonM.points[id].cat + ']').attr('checked', 'checked');
				renderMarker();
                getBubble(jsonM.points[id].marker);
            });
            jQuery('.suggStreetPoint').live('click', function(){
                showStreetBubble(jQuery(this).attr('id').replace('suggStreet_', ''));
            });
        }
		
		jQuery('#map li.cTab').live('click',function(){
			jQuery('.tabs li.active').removeClass('active');
			jQuery(this).addClass('active');
			jQuery('#map #info_tab').hide();
			jQuery('#map #contact_tab').show();
		});
		jQuery('#map li.iTab').live('click',function(){
			jQuery('.tabs li.active').removeClass('active');
			jQuery(this).addClass('active');
			jQuery('#map #contact_tab').hide();
			jQuery('#map #info_tab').show();
		});
    });
    
});

/* MAP */
function filterMarker(){
    var checked = [];
    jQuery.each(jQuery('#map_filter input[type=checkbox]:checked'), function(){
        checked.push(jQuery(this).val());
    });
}

function renderMap(){
	var initType = 'SATELLITE';
	// set map for print-page
	if (jQuery.urlParam('lat') && jQuery.urlParam('lon') && jQuery.urlParam('zoom') && jQuery.urlParam('maptype')){
		initLat = jQuery.urlParam('lat');
		initLon = jQuery.urlParam('lon');
		initZoom = parseInt(jQuery.urlParam('zoom'));
		initType = jQuery.urlParam('maptype');
	}
	initCenter = new google.maps.LatLng(initLat,initLon);

	map =  new google.maps.Map(jQuery('#map').get()[0],
		{
			center:initCenter,
			disableDefaultUI:false,
			zoom:initZoom,
			mapTypeId: google.maps.MapTypeId[initType.toUpperCase()],
			mapTypeControlOptions: {
		      style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
		    },
			navigationControlOptions: {
		      style: google.maps.NavigationControlStyle.SMALL
    		}
		}
	);
	google.maps.event.addListener(map,'bounds_changed',function(){
		var center = map.getCenter();
		printLat = center.lat();
		printLon = center.lng();
		printZoom = map.getZoom();
		printType = map.getMapTypeId();
	});
	
	map_rendered = true;
	
	jQuery.each(categories,function(){
		this.icon = new google.maps.MarkerImage(marker_image_path + this['marker']);
	});
	shadowMarker = new google.maps.MarkerImage(
		shadowURL,
		new google.maps.Size(26,23),
		new google.maps.Point(0,0),
		new google.maps.Point(6,23),
		new google.maps.Size(26,23)
	);
	
	bubble = new google.maps.InfoWindow();

	getAllMarker();
	renderMarker();
    return true;
}



function renderMarker(){
    var checked = [];
    jQuery.each(jQuery('#map_filter input[type=checkbox]:checked'), function(){
        checked.push(jQuery(this).val());
    });
	var i = 0;
    for (i; i < jsonM.points.length; i += 1) {
		var that = jsonM.points[i];
		if (checked.in_array(that.cat)) {
			if (that.marker.getMap() == null)
				that.marker.setMap(map);
		}
		else {
			that.marker.setMap(null);
		}
	}   
    for (i; i < jsonM.streets.length; i += 1) {
		jsonM.streets[i].marker.setMap(null);
	}   
}

function getBubble(marker){
	var point = jsonM.points[marker.id];
	var ll = new google.maps.LatLng(point.lat,point.lon);
	map.panTo(ll);
	map.setZoom(12);
	bubble.close();
	// Caching von Marker-Tabs
	if (bubbles[marker.id] != null) {
		bubble.setPosition(ll);
		bubble.setContent('');	
		bubble.setContent(bubbles[marker.id]);	
		bubble.open(map,marker);
        return;
    }
	// sonst Laden der Daten zum Point (params: Kategorie; UID in DB; Key im Marker-Array)
	tx_smsfoehrkarte_pi1_getBubble(point.cat + '::' + point.uid + '::' + marker.id);
}

function showAzBubble(response){
	var root = jQuery('<div/>').css({width:'390px','float':'left'});
	root.append('<ul class="tabs"><li class="cTab active">Kontakt</li><li class="iTab">Infos</li></ul>');
	root.append(response.cTab);
	root.append(response.iTab);
	
	var wrapper = root.find('.img_wrapper');
	if (wrapper.length) {
		var img = wrapper.find('img');
		var maxH = 0;
		for (var i = 0; i < img.length; i += 1) {
			h = parseInt(img.css('height').replace('px', ''));
			if (h > maxH) 
				maxH = h;
		}
		root.find('.image_gallery').css('height', (maxH+30) + 'px');
	}
	
	var az = jsonM.points[response.i];   
	map.setZoom(12);
	var ll = new google.maps.LatLng(az.lat,az.lon);
	map.panTo(ll);
	bubble.close();
	bubble.setPosition(ll);
	bubble.setContent(root.get()[0]);
	bubble.open(map,az.marker);
}

function showPlaceBubble(response){
    map.setZoom(12);
	var point = jsonM.points[response.i];
	bubble.setPosition(new google.maps.LatLng(point.lat,point.lon));
	var out = jQuery(response.bubble); 
	var wrapper = out.find('.img_wrapper');
	if (wrapper.length) {
		var img = wrapper.find('img');
		var maxH = 0;
		for (var i = 0; i < img.length; i += 1) {
			h = parseInt(img.css('height').replace('px', ''));
			if (h > maxH) 
				maxH = h;
		}
		out.find('.image_gallery').css('height', (maxH+30) + 'px');
	}
	bubble.setContent(out.get()[0]);
	bubbles[response.i] = out.get()[0];
	bubble.open(map,point.marker);
}

function showStreetBubble(i){
    jQuery('#map_filter input[type=checkbox]').attr('checked', '');
	renderMarker();
	
    var street = jsonM.streets[i];   
	map.setZoom(14);
	street.marker.setMap(map);
	var ll = new google.maps.LatLng(street.lat,street.lon);
	map.panTo(ll);	
	bubble.close();
	bubble.setPosition(ll);
	bubble.setContent('<div class="street_bubble">' + street.name + '</div>');	
	bubble.open(map,street.marker);
}

function getAllMarker(){
	var i = 0;
    for (i; i < jsonM.points.length; i+=1) {
        var that = jsonM.points[i];
		if (that.cat == null || typeof(categories[that.cat]) == 'undefined') that.cat = 'serv';

		that.marker = new google.maps.Marker({
			icon: categories[that.cat].icon,
			shadow: shadowMarker,
			title: that.name,
			position: new google.maps.LatLng(that.lat,that.lon)
		});
		that.marker.id = i;
		google.maps.event.addListener(that.marker,'click',function(){
			getBubble(this);
			return false;
		});
    }
	
    for (i=0; i < jsonM.streets.length; i+=1) {
        var that = jsonM.streets[i];
		that.marker = new google.maps.Marker({
			icon: categories['street'].icon,
			shadow: shadowMarker,
			title: that.name,
			position: new google.maps.LatLng(that.lat,that.lon)
		});
    }
};

/* SUGGESTS */
function makeSuggests(val){
    suggOut.html('');
    jQuery('#suggTip').hide();
    if (val.length < 2 || val == ' ') 
        return;
    
    var i = 0;
    var regExp = new RegExp(val.toLowerCase());
    var out = {
        place: '',
        sight: '',
        hotel: '',
        eat: '',
        serv: ''
    };
    var length = jsonM.points.length;
    for (i; i < length; i++) {
        var that = jsonM.points[i];
        if ((that['name'].toLowerCase()).match(regExp)) {
            tmp = '<li class="suggPoint" id="sugg_' + i + '">' + that.name + '</li>';
            switch (that.cat) {
                case 'place':
                    out.place += tmp;
                    break;
                case 'sight':
                    out.sight += tmp;
                    break;
                case 'hotel':
                    out.hotel += tmp;
                    break;
                case 'eat':
                    out.eat += tmp;
                    break;
                case 'serv':
                    out.serv += tmp;
                    break;
            }
        }
    }
    
    var out_html = '';
    for (part in out) {
        if (out[part].length) {
            out_html += '<ul><div class="sugg_cat">' + categories[part]['name'] + '</div>' + out[part] + '</ul>';
        }
    }
    suggOut.html(out_html);
    jQuery('#suggTip').show();
}

function makeStreetSuggests(val){
    streetsSuggOut.html('');
    jQuery('#suggTip').hide();
    if (val.length < 2 || val == ' ') 
        return;
    
    var regExp = new RegExp(val.toLowerCase());
    var length = jsonM.streets.length;
    var i = 0;
    var out = '<ul>';
    for (i; i < length; i++) {
        var that = jsonM.streets[i];
        if ((that['name'].toLowerCase()).match(regExp)) {
            out += '<li class="suggStreetPoint" id="suggStreet_' + i + '">' + that.name + '</li>';
        }
    }
    streetsSuggOut.html(out + '</ul>');
    jQuery('#suggTip').show();
}



/* GALLERIES */
// image-gallery
function slideGallery(direction, current){
    var count = parseInt(jQuery('.img_wrapper img').length);
    var next_img_to_show;
    var info;
    if (direction == 'prev') {
        next_img_to_show = (current - 1);
        info = current;
        if (next_img_to_show < 0) {
            next_img_to_show = (count - 1);
            info = count;
        }
    }
    if (direction == 'next') {
        next_img_to_show = (parseInt(current) + 1);
        info = (parseInt(current) + 2);
        if (next_img_to_show >= count) {
            next_img_to_show = 0;
            info = 1;
        }
    }
    jQuery('img[id=image_' + current + ']').hide();
    jQuery('img[id=image_' + next_img_to_show + ']').show();
    jQuery('[id=curr_' + current + ']').attr('id', 'curr_' + next_img_to_show);
    jQuery('.switch_info').text('Bild ' + info + ' von ' + count);
}

