
// Images
var activeIconUrl= "http://test.smart.qred.fi/smartWidgets/apps/SaloVisit/gfx/aktiivinen.png";

var icons=new Array();
icons[1]="http://test.smart.qred.fi/smartWidgets/apps/SaloVisit/gfx/passiivinen.png";	// Visit
icons[2]="http://smart2.qred.fi/files/salovisit/media/shoppailu.png";					// Shops
icons[3]="http://smart2.qred.fi/files/salovisit/media/herkuttelu.png";					// Food

var shadowUrl = "http://test.smart.qred.fi/smartWidgets/apps/SaloVisit/gfx/shadow.png";

var companyNamesToIds=new Array();
var companiesToMarkers=new Array();
var markers=new Array();				
var placesMarkers=new Array();		 
var geocoder;
var map=null;
var mgr=null;
var marker=null;
var open=null;
var overlay=null;
var bubbleMarker=null;

var accordionActive=false;
var open="#alpha";
var bubbleStatus="none";
var livesearchOn=false;
var inProcess=false;
var lastResultSet=null;
var shadow=null;
var mapInitialized=false;

function mapLoad()
{
	initializeMap();
}

function initializeMap()
{
	if (mapInitialized) return;
		
	mapInitialized=true;

	shadow = new google.maps.MarkerImage(shadowUrl,
        new google.maps.Size(48.0, 40.0),
        new google.maps.Point(0, 0),
        new google.maps.Point(10.0, 40.0)
    );

	// Set center
	var myLatlng = new google.maps.LatLng(60.382, 22.810);
	var myOptions = {
		zoom: 9,
		center: myLatlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		mapTypeControl: false,
		navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL}
	}
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
 
	google.maps.event.addListenerOnce(map, 'idle', function() {
		$(window).trigger( 'hashchange' );
	});

	google.maps.event.addListener(map, 'zoom_changed', onZoomChanged);
	setupMarkers();
}


function onZoomChanged()
{
	hideBubble();
	addHash("");

	if (inProcess) return;

	if (map.getZoom() > 17) {
		inProcess = true;
		map.setZoom(17);
		inProcess = false;
		return
	}
	else if (map.getZoom() < 6) {
		inProcess = true;
		map.setZoom(6);
		inProcess = false;
		return;
	}
}


function doSearch()
{
	//event.stopPropagation();
	accordionExpand('#searchResults');
	doLiveSearch(true);
	return false;
}


function doLiveSearch(convertResults)
{
	if (livesearchOn) return;
	livesearchOn=true;

	var q=$("#q").val();
	if (q.length>0) {
		accordionExpand('#searchResults');
		$('#results .loading').addClass('loadingActive');
			
		$.get(basePath+"/search", {q: $('#q').val()}, function(val) {
			$('#results .loading').removeClass('loadingActive');
			lastResultSet=val;
			$('#resultTxt').html("Löytyi<br />"+val.length+" kohdetta");

			livesearchOn=false;
			
			$('#textSearchResults').html("");
			$.each(val, function(index, value) {
				// Add results 
				$('#textSearchResults').append('<div class="textResult" id="result_'+value.company_id+'">'+value.index+'. '+value.name+'</div>');
			});

			if (convertResults) {
				convertResultsToIcons();
			}
		});
	} else {
		 livesearchOn=false;
	}
}


function accordionExpand(name)
{
	if (accordionActive) {
		return false;
	}
	
	addHash("");
	
	if (open!=name) {
		accordionActive=true;
		$(open+" .content").animate({height: 0}, 700, 'linear', function() {
			$(this).css({display: 'none'});
		});
		$(name+" .content").css({height: 0, display: "block"});
		$(name+" .content").animate({height: 300}, 700, 'linear', function() {
			accordionActive=false;
		});
		open=name;		// Last
	}
	return false;
}

var showing=false;

$(document).ready(function() {

	$(".tag").change(function() {
		var className=$(this).attr('class').split(' ')[1];		// second is the class
		if (className) {
			var id=className.split('_')[1];
			var total=0;

			$('.'+className).each(function(val, key) {
				if ($(this).is(":checked")) {
					total++;
				}
			});

			if (total==0) {
				$('#parent_'+id).removeAttr('checked');
			} else {
				$('#parent_'+id).attr('checked', 'checked');
			}
			updateTagSearchResults();
		}
	});
	
	$(".windowTag").click(function() {
		var className=$(this).attr('class').split(' ')[1];		// second is the class
		var on=$(this).is(":checked") ? true : false;
		
		if (className) {
			var id=className.split('_')[1];
			var total=0;

			$('.parentTag'+id).each(function(val, key) {
				if (on) {
					$(this).attr('checked', 'checked');
				} else {
					$(this).removeAttr('checked');
				}
			});

			if (total==0) {
				$('#windowparent_'+id).removeAttr('checked');
			} else {
				$('#windowparent_'+id).attr('checked', 'checked');
			}
		}
		// Update results 
		updateWindowResults();
	});

	$('.group').click(function () {
		var className=$(this).attr('class').split(' ')[1];              // second is the class

		var status;

		if ($(this).is(':checked')) {
			status=true;
		} else {
			status=false;
		}

		var id=$(this).attr('id').split('_')[1];
		$('.parent_'+id).each(function(val1, key) {
			if (!status) {
				$(key).removeAttr('checked')
			} else {
				$(key).attr('checked', 'checked');
			}
		});
		updateTagSearchResults();
	});


	$('.groupTag').live('change', function(event) {
		var id=$(this).attr('id').split('_')[1];
		var val;

		if ($(this).is(":checked")) {
			val=true;
		} else {
			val=false;
		}

		$('.wparent_'+id).each(function(val1, key) {
			if (!val) {
				$(key).removeAttr('checked')
			} else {
				$(key).attr('checked', 'checked');
			}
		});
		updateWindowResults();
		return false;
	});

	// Search 
	$('#q').keyup(function(event) {
		if (event.keyCode == "13") { 
			event.preventDefault(); 
			doLiveSearch(true); 
		} else {
			doLiveSearch(false);
		}
	});

	$('#q').focus(function() {
		accordionExpand('#searchResults');
	});

	// Initial update 
	updateWindowResults();

	// Ajax page loading 
	$('.dlink').live('click', function() {
		// Get link
		var url=$(this).attr('href');
		if (url) {
			var h=($('#masterContent').height());
			
			$.scrollTo('#masterContent', 700);
			$('#masterContent').html('<div style="height: '+h+'px" class="loading"></div>').load(url, null, function() {

			});
		}
		return false;
	});

	initializeMap();
	
	$(window).bind( 'hashchange', function(e) {
		var fragment=e.fragment;
		
		// Remove first item 
		var s=fragment.substr(1);
		var item=s.split('=');

		switch(item[0]) {
			
			case 'ikkuna':
				$('#searchWindow').show();
				$('#searchBar').hide();
				break;
			
			case 'alue':
				getByArea(item[1]);
				break;
			
			case 'getCompany':
				$('#searchWindow').hide();
				$('#searchBar').show();
				openBubble(item[1]);
				break;
				
			case '.yritys':
				$('#searchWindow').hide();
				$('#searchBar').show();
				openBubbleByName(decodeURIComponent(item[1]), true);
				break;
				
			case 'yritys':
				$('#searchWindow').hide();
				$('#searchBar').show();
				openBubbleByName(decodeURIComponent(item[1]));
				break;
		}
	});
	
	// Trigger has change 
});


function setupMarkers()
{
	overlay = new CustomMarker(map.getCenter(), map);
}


function showResults()
{
	convertResultsToIcons();
	accordionExpand('#searchResults');
}


var limits={min_lat: null, max_lat: null, min_lng: null, max_lnt: null};
	
function convertResultsToIcons()
{
	// First we hide certain elements 
	for (var i = 0; i < markers.length; i++) {
		markers[i].setIcon(markers[i].origIcon);
		markers[i].setVisible(false);
	}

	// Clear results 
	$('#textSearchResults').html('');
	limits={min_lat: null, max_lat: null, min_lng: null, max_lng: null};		// Reset 
	
	// Display result set 
	$.each(lastResultSet, function(index, value) {
		
		// Check result limits 
		if (limits.min_lat == null) {
			limits.max_lat=limits.min_lat=value.lat;
			limits.max_lng=limits.min_lng=value.lng;
		}

		if (value.lat<limits.min_lat) limits.min_lat=value.lat;
		if (value.lat>limits.max_lat) limits.max_lat=value.lat;
		if (value.lng<limits.min_lng) limits.min_lng=value.lng;
		if (value.lng>limits.max_lng) limits.max_lng=value.lng;
		
		// Add clickable result  
		$('#textSearchResults').append('<div class="textResult" id="result_'+value.company_id+'"><a href="#!yritys='+encodeURIComponent(value.name)+'">'+value.index+'. '+value.name+'</a></div>');

		// Does we have this company position in cache? 
		if (!companiesToMarkers[value.company_id]) {
			addCompanyToMap(value);
			
		} else {	
			// Update index text 
			companiesToMarkers[value.company_id].setOptions({labelContent: value.index});
		}
		companiesToMarkers[value.company_id].setVisible(true);
	});
	
	
	// Clustering 
	//var mcOptions = {gridSize: 50, maxZoom: 14};
	//var markerCluster = new MarkerClusterer(map, markers, mcOptions);
	
	panToBounds(limits);
}



function addCompanyToMap(value)
{
	var pos = new google.maps.LatLng(value.lat, value.lng);

	var marker = new MarkerWithLabel({
		position: pos,
		map: map,
		icon: icons[value.type_id],
		origIcon: icons[value.type_id],
		shadow: shadow,
		labelContent: value.index,
		labelAnchor: new google.maps.Point(12, 34),
		labelClass: "labels",						// the CSS class for the label
	  labelStyle: {opacity: 0.50}
	});

	// Add one marker 
	markers.push(marker);
	companiesToMarkers[value.company_id]=marker;
	companyNamesToIds[value.name]=value.company_id;

	// Click event 
	google.maps.event.addListener(marker, 'click', function() {
		addHash('yritys='+encodeURIComponent(value.name));
	});
}


function updateTagSearchResults()
{
	var tagIds=new Array();
	$('.tag').each( function(key, value) {
		if ($(value).is(":checked")) {
			tagIds.push($(value).val());
		}
	});

	$('#results .loading').addClass('loadingActive');
	$.post(basePath+'/searchTags', {"tagIds[]": tagIds}, function(val) {
		$('#results .loading').removeClass('loadingActive');
		lastResultSet=val;
		$('#resultTxt').html("Löytyi<br />"+val.length+" kohdetta");
    });
}


function updateWindowResults()
{
	var tagIds=new Array();
	$('.windowTag').each( function(key, value) {
		if ($(value).is(":checked")) {
			tagIds.push($(value).val());
		}
	});

	$('.windowLoading').addClass('windowLoadingActive');
	$.post(basePath+'/searchTags', {"tagIds[]": tagIds}, function(val) {
		$('.windowLoading').removeClass('windowLoadingActive');
		lastResultSet=val;
		$('#windowResultTxt').html("Löytyi "+val.length+" kohdetta");
    });
}


function showAll()
{
	$('.windowLoading').addClass('windowLoadingActive');
	$.post(basePath+'/getAll', null, function(val) {
		$('.windowLoading').removeClass('windowLoadingActive');
		lastResultSet=val;
		$('#windowResultTxt').html("Löytyi "+val.length+" kohdetta");
		convertResultsToIcons();
		accordionExpand('#searchResults');
    });
}


function showWindowResults()
{
	closeWindow();
	convertResultsToIcons();
	accordionExpand('#searchResults');
}


function closeBubble()
{
	addHash("");
	hideBubble();
}


function hideBubble()
{
	$('#rightInfo').slideUp();
	bubbleStatus="none";
}


function addHash(str)
{
	if (str.length) {
		window.location.hash="!"+str;
	} else {
		window.location.hash="";
	}
}


function openBubble(company_id, closeOthers)
{
	if (companiesToMarkers[company_id]) {
		openBubbleReal(company_id, closeOthers)
	} else {
		$.get(basePath+'/getCompanyData?company_id='+company_id, null, function(tmp) {
			// Does we have this company position in cache? 
			addCompanyToMap(tmp);
			openBubbleReal(company_id, closeOthers);
		});
	}
}


function openBubbleByName(name, closeOthers)
{
	if (companyNamesToIds[name]) {
		company_id=companyNamesToIds[name];
		openBubbleReal(company_id, closeOthers);
	} else {
		$.get(basePath+'/getCompanyDataByName', {name: name} , function(tmp) {
			addCompanyToMap(tmp);
			openBubbleReal(tmp.company_id, closeOthers);
		});
	}
}


function openBubbleReal(company_id, closeOthers)
{
	var tmp=companiesToMarkers[company_id];
	var coords=overlay.getCoords(tmp.getPosition());

	// Reset marker types 
	for (var i = 0; i < markers.length; i++) {
		markers[i].setIcon(markers[i].origIcon);
		markers[i].setZIndex(undefined);
		if (closeOthers) {
			markers[i].setVisible(false);
		}
	}

	// Remove active results 
	$('.activeResult').removeClass('activeResult');

	// Highlight results 
	$('#result_'+company_id).addClass('activeResult');

	
	// Show 
	companiesToMarkers[company_id].setIcon(activeIconUrl);
	companiesToMarkers[company_id].setVisible(true);
	companiesToMarkers[company_id].setZIndex(999);


	// get 20 pixel
	var p=new google.maps.Point(0, 260);
	var offset=overlay.getPointToCoords(p);
	var tmpY=0;

	// Center 
	var center=map.getCenter();
	var offsetY=center.lat()-offset.lat();
	var pan=new google.maps.LatLng(tmp.getPosition().lat()+offsetY, tmp.getPosition().lng());
	var realPan=new google.maps.LatLng(tmp.getPosition().lat(), tmp.getPosition().lng());
	map.panTo(pan);					// Set to center

	// WE SHOULD CONVERT PAN
	var coords=overlay.getCoords(realPan);
	coords.y-=10;
	
	$('#rightInfoContent').html('Ladataan...');
	$('#rightInfo').slideDown();						// Panel down
	
	$('#rightInfoContent').load(basePath+"/getCompany?company_id=" + company_id, function() {
		$(".lightbox").fancybox({overlayOpacity: 0.5, overlayColor: "#4a6203"});
	});
}


function getCompany(company_id)
{
	for (var i = 0; i < markers.length; i++) {
		markers[i].setIcon(markers[i].origIcon);
		markers[i].setVisible(false);
	}

	$.getJSON(basePath+"/getCompany?company_id="+company_id, function(val) {
		$.each(val, function(index, value) {
			if (value.company_id) {
				companiesToMarkers[value.company_id].setIcon(markers[i].origIcon);
				companiesToMarkers[value.company_id].setVisible(true);
			}
		});
	});
}


function panToBounds(pos)
{
	if (!pos.min_lat) {
		return;
	}
	
	//var p=new google.maps.LatLng(pos.lat, pos.lng);
	var ne = new google.maps.LatLng(pos.min_lat, pos.min_lng);
	var sw = new google.maps.LatLng(pos.max_lat, pos.max_lng);

	var bounds = new google.maps.LatLngBounds();
	bounds.extend(ne);
	bounds.extend(sw);
	
	map.fitBounds(bounds);
}


function getCompanyInfo(company_id)
{
	for (var i = 0; i < markers.length; i++) {
		markers[i].setIcon(markers[i].origIcon);
		markers[i].setVisible(false);
		//companiesToMarkers[company_id].setZIndex(500);
	}
	
	if (company_id) {
		companiesToMarkers[company_id].setIcon(activeIconUrl);
		//companiesToMarkers[company_id].setZIndex(1000);
		companiesToMarkers[company_id].setVisible(true);

		// Set more zoom
		map.setZoom(15);
	}
	openBubble(company_id);
}


function closeWindow()
{
	addHash("");
	
	$('#searchWindow').hide();
	$('#searchBar').show();
	
	// Remove active search result 
	$('.activeResult').removeClass('activeResult');
	
	// Sync tags 
	$('.tag').each(function(val, key) {
		$(this).removeAttr('checked');
	});
	
	$('.windowTag').each( function(key, value) {
		if ($(value).is(":checked")) {
			var id=$(this).val();
			$('#tag_'+id).attr('checked', 'checked');
		}
	});
	updateTagSearchResults();
}


function getByArea(area)
{
	hideBubble();

	$.getJSON(basePath+"/getArea?area="+area, function(items) {
		lastResultSet=items;
		convertResultsToIcons();
	});
}


function zoomIn()
{
	map.setZoom(map.getZoom()+1);
}


function zoomOut()
{
	map.setZoom(map.getZoom()-1);
}
//////////////////////////////////////////
// Custom marker
//////////////////////////////////////////

// Special overlay for the markers 
function CustomMarker(latlng, map) {
	this.latlng_ = latlng;
	this.setMap(map);
}

CustomMarker.prototype = new google.maps.OverlayView();
CustomMarker.prototype.draw = function() {

};

CustomMarker.prototype.getCoords = function(latlng) {
	 var point = this.getProjection().fromLatLngToDivPixel(latlng);
	 return point;
};


CustomMarker.prototype.getPointToCoords = function(point) {
	 var latlng= this.getProjection().fromContainerPixelToLatLng(point);
	 return latlng;
};


