/**
* MAPFUNCTIONS
**/

// vars
var aktMarker = null;
var map; 
var geocoder; 
var address; 

var marker, markersArray=[];
var jobIcon = null;
var jobMultiIcon = null;
var jobHiddenIcon = null;
var centerIcon = null;

var rawArray = new Array();

/* google maps */
function initialize() {
  // init map with Zelinkagasse 11
  if ($('#user_map').length){
	  if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("user_map"));
		map.setCenter(new GLatLng(47.957722, 14.777223), 11);
		map.setUIToDefault();
		// init geocoder
		geocoder = new GClientGeocoder();
		// init page map
		try {
			init();
		} catch(err) {
			alert('initialize: ' + err);
		}
	  }
  }
  
  if ($('#job_map').length){
	  if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("job_map"));
		map.setCenter(new GLatLng(47.957722, 14.777223), 11);
		map.setUIToDefault();
		// init geocoder
		geocoder = new GClientGeocoder();
		// init page map
		try {
			init();
		} catch(err) {
			alert('initialize JobMap: ' + err);
		}
	  }
  }
  
  if ($('#mostjobs_map').length){
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("mostjobs_map"));
		map.setCenter(new GLatLng(48.03218251603595, 15.2490234375), 9);
		map.disableDragging();
		//map.setUIToDefault();
		// init geocoder
		geocoder = new GClientGeocoder();
		directions = new GDirections();
		// init page map
		
		// custom marker
		jobIcon = new GIcon(G_DEFAULT_ICON);
		jobIcon.image = 'markers/mostjob-job.png';
		jobIcon.iconSize = new GSize(30,30);
		jobIcon.shadow = 'markers/mostjob-job-shadow.png';
		jobIcon.shadowSize = new GSize(30,30);
		jobIcon.iconAnchor = new GPoint(1,30);
		jobIcon.infoWindowAnchor = new GPoint(17,9);
		
		// custom marker multi
		jobMultiIcon = new GIcon(G_DEFAULT_ICON);
		jobMultiIcon.image = 'markers/mostjob-job-multi.png';
		jobMultiIcon.iconSize = new GSize(30,30);
		jobMultiIcon.shadow = 'markers/mostjob-job-shadow.png';
		jobMultiIcon.shadowSize = new GSize(30,30);
		jobMultiIcon.iconAnchor = new GPoint(1,30);
		jobMultiIcon.infoWindowAnchor = new GPoint(17,9);
		
		// custom centerIcon
		centerIcon = new GIcon(G_DEFAULT_ICON);
		centerIcon.image = 'markers/mostjob-center.png';
		centerIcon.iconSize = new GSize(30,30);
		centerIcon.shadow = 'markers/mostjob-center-shadow.png';
		centerIcon.shadowSize = new GSize(30,30);
		centerIcon.iconAnchor = new GPoint(13,15);
		centerIcon.infoWindowAnchor = new GPoint(13,15);
		
		// hide
		$('#mostjobs_map').hide();
		
		try {
			init();
		} catch(err) {
			alert('initialize JobMap: ' + err);
		}
	  }
  }
}


function orderOfCreation(marker,b) {
        return 1;
}


/*---------------------------------- mostjob map ---------------------------------------*/

var centerMarker = null;
var bounds = new GLatLngBounds();
var mapState = 'big';
var markerRadius = 20;
var poly = null;
var oldMap = null;
var directions = null;

var aktJobMapPage = 1;
var jobsTotal = 0;
var isLastPage = false;


/**
 * setBackgroundImage
 */
 function setBackgroundImage(){
	//var boundaries = new GLatLngBounds(new GLatLng(47.66168780332917, 14.16412353515625), new GLatLng(48.48748647988415, 16.1993408203125)); 
	//var boundaries = new GLatLngBounds(new GLatLng(47.66168780332917,13.494), new GLatLng(48.48748647988415,16.968)); 
	var boundaries = new GLatLngBounds(new GLatLng(47.480,13.532), new GLatLng(48.704,16.922)); 
	oldmap = new GGroundOverlay("http://www.mostjobs.at/maps/mostjobs-maps-v8.png", boundaries); 
	map.addOverlay(oldmap); 
	
	// show map
	$('#mostjobs_map').fadeIn();
 }


/**
 * setDisplayTarget
 * set center of display
 */
function setDisplayTarget(marker, latlng){
	if (typeof latlng != 'undefined') { 
		createCenterMarker(latlng);
	} else {
		// clear marker & expand
		removeCenterMarker();
	}
}

function setSessionValues(lat,lng,radius){
	// set radius
	markerRadius = radius;
	// set center
	var thisLatLng = new GLatLng(lat,lng);
	setDisplayTarget('',thisLatLng);
}

/**
 * setCenterMarker
 */
function setCenterMarker(){
	/* add as overlay */
	map.addOverlay(centerMarker);
	/* drawCircle */
	drawCircle(centerMarker.getLatLng(), markerRadius, 50,'#5e8b1c',2,0.8,'#88ba44',0.3);
	
	callToAction('save','mapseite',1,'','');
	
	if(mapState=='big'){
		shrinkMap();
		mapState='small';
	} else {
		fit();
	}
	
	
	callToAction('save','centerLat',centerMarker.getLatLng().lat(),'','');
	callToAction('save','centerLng',centerMarker.getLatLng().lng(),'','');
	callToAction('save','centerRadius',markerRadius,'','');
	isLastPage = false;
}

function nextJobSeite(){
	// update aktJobMapPage
	var pagesTotal = Math.round(jobsTotal/10);
	var nextPage = parseInt(aktJobMapPage) + 1;
	
	//alert('pagesTotal:'+pagesTotal+' jobsTotal:'+jobsTotal+' aktPage:'+aktJobMapPage+' nextPage:'+nextPage);
	
	if(pagesTotal >= nextPage){
		isLastPage = false;
		jobsSeite(nextPage);
		return;
	}
	
	
}

function jobsSeite(seite){
	callToAction('save','mapseite',seite,'','');
	clearJobList();
	loadJobList();
}

/**
 * createCenterMarker
 */
function createCenterMarker(latlng){
	// clear
	clearMyOverlays();
	
	// set Marker
	///var  IconName = 'centerIcon'+markerRadius;
	switch(markerRadius){
		
		case 5:
			centerIcon.image = 'markers/mostjob-center-5.png';	
			break;
		
		case 10:
			centerIcon.image = 'markers/mostjob-center-10.png';	
			break;
		
		case 15:
			centerIcon.image = 'markers/mostjob-center-15.png';	
			break;
		
		case 20:
			centerIcon.image = 'markers/mostjob-center-20.png';	
			break;
		
		case 25:
			centerIcon.image = 'markers/mostjob-center-25.png';	
			break;
		
		case 30:
			centerIcon.image = 'markers/mostjob-center-30.png';	
			break;
		
		case 35:
			centerIcon.image = 'markers/mostjob-center-35.png';	
			break;
		
		case 50:

			centerIcon.image = 'markers/mostjob-center-50.png';	
			break;
		
		case 75:
			
			centerIcon.image = 'markers/mostjob-center-75.png';	
			break;
	}
	
	centerMarker =  new GMarker(latlng,{draggable: true, bouncy: true, bounceGravity:5, icon:centerIcon});	
	
	GEvent.addListener(centerMarker,"dragend",function() {
			var thislatlng = centerMarker.getLatLng()
			// clear poly
			clearMyOverlays();
			// set marker
			createCenterMarker(thislatlng);
		});
	
	setCenterMarker();
}

/**
 * removeCenterMarker
 */
function removeCenterMarker(){
	// clear marker
	clearMyOverlays();
	
	// 
	expandMap();
	mapState = 'big';
}

/**
 * clearMyOverlays
 */
function clearMyOverlays(){
	// clear marker
	if(centerMarker){
		map.removeOverlay(centerMarker);
	}
	// clear poly
	if(poly){
		map.removeOverlay(poly);
	}
	
	clearJobList();
}

/**
 *
 */
function clearJobList(){
	$("#jobList").html("");	
	//GLog.write('clear');
}

/**
 * drawCircle
 */
function drawCircle(center, radius, nodes, liColor, liWidth, liOpa, fillColor, fillOpa) {
// Esa 2006
	
	//calculating km/degree
	var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
	var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;
 
	//Loop 
	var points = [];
	var step = parseInt(360/nodes)||10;
	for(var i=0; i<=360; i+=step)
	{
	var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + 
	(radius/lngConv * Math.sin(i * Math.PI/180)));
	points.push(pint);
	bounds.extend(pint); //this is for fit function
	}
	points.push(points[0]); // Closes the circle, thanks Martin
	fillColor = fillColor||liColor||"#0055ff";
	liWidth = liWidth||2;
	poly = new GPolygon(points,liColor,liWidth,liOpa,fillColor,fillOpa);
	map.addOverlay(poly);

}

/**
 * fit
 */
function fit(type){
	map.checkResize();
	//map.setZoom(map.getBoundsZoomLevel(bounds));
	//map.setCenter( bounds.getCenter( ),map.getBoundsZoomLevel(bounds) );
	
	if(type == 'default'){
		//alert(myLat);
		map.panTo(new GLatLng(48.03218251603595, 15.2490234375));
	} else {
		var myLat = map.getCenter().lat();
		var myLng = centerMarker.getLatLng().lng();
		//map.panTo(bounds.getCenter());
		map.panTo(new GLatLng(myLat,myLng));
		
		// load Jobs
		loadJobList();
	}
}



function expandMap(){
	//$("#user_map").animate({left:'-=450px',width:'600px', height:'340px'},300);	
	$("#mostjobs_map").animate({left:'0px',width:'100%'},800, function() { fit('default'); });	
	mapState = 'big';
}

function shrinkMap(){
	$("#mostjobs_map").animate({left:'0px',width:'375px'},800,function() { fit(); });	
	mapState = 'small';
}


function getMapPosition(){
	//GLog.write('Zoom: '+map.getZoom() + ' Bounds:' + map.getBounds() + ' Center:' + map.getCenter());	
	if(oldMap){
	//GLog.write('Zoom: '+oldMap.getBounds());	
	}
}

function setMarkerRadius(radiusValue){
	
	var oldMarker = markerRadius;
	
	switch(radiusValue){
		
		case 10:
		case 20:
		case 30:
		
			markerRadius = radiusValue;
			break;
		default:
			markerRadius = 20;
	}
	
	if(oldMarker != markerRadius && centerMarker){
		clearMyOverlays();
		setSessionValues(centerMarker.getLatLng().lat(),centerMarker.getLatLng().lng(),markerRadius)
	}
}

var mostjobs = null;
var index = 0;
var refreshTimeoutRate = null;
var removeFirst = false;

/**
 * loadJobList
 */
function loadJobList(){
	
	$.ajax({
	  url: 'http://www.mostjobs.at/json',
	  dataType: 'json',
	  data: 'action=stellen&option[]=umkreis-'+ centerMarker.getLatLng().lat() +'-'+ centerMarker.getLatLng().lng() +'-'+markerRadius+'&rand='+Math.floor(Math.random()*99999999), 
	  error:function (xhr, ajaxOptions, thrownError){
            //alert(xhr.status);
            //alert(thrownError);
			drawEmptyJob(thrownError,xhr.status);
        }   ,
	  success: function(json){
			mostjobs = json;
			refreshTimeoutRate = 200;
			setTimeout(drawJob, refreshTimeoutRate);
    	}
	});
	
	callToAction('get','mapJobsTotal','','returnMapJobsTotal','');
	callToAction('get','mapseite','','returnValue','');
	
	//alert('jobsTotal:'+jobsTotal+' Page:'+aktJobMapPage);
	
}

/**
 * drawEmptyJob
 */
function drawEmptyJob(error,status){
	var jList = $( "#jobList" );
	jList.append($( "<li><span class='distance'>"+status+"</span><h2>Leider keine Treffer</h2><p>Bitte erweitern Sie den Radius ihrer Umkreissuche.</p></li>" ).hide().fadeIn());
}

/**
 * drawJob
 */
function drawMore(jobNum){
	// ellement to append
	var jList = $( "#jobList" );

	
	if(jobNum < 10){
		// add li
		jList.append($( "<li style='min-height:20px !important;'><a href='#' style='font-size:11px;' onclick='jobsSeite(1)';>&laquo; Seite 1</a></li>" ).hide().fadeIn());
	} else {
		// add li
		jList.append($( "<li style='min-height:20px !important;'><a href='#' style='font-size:11px;' onclick='jobsSeite(1)';>&laquo; Seite 1</a> <a style='float:right; font-size:11px;' href='#' onclick='nextJobSeite()';>weitere Treffer &gt;</a> </li>" ).hide().fadeIn());
	}
	//	next element
	index++;
	
	
}

/**
 * drawJob
 */
function drawJob(){
	// ellement to append
	var jList = $( "#jobList" );
	// num elements
	var jobNum = $(mostjobs).length;
	
	if(jobNum == 0){
		drawEmptyJob('','');
		return;
	}
	
	// remove first li
	if(removeFirst){
		//$('#jobList li:first').remove();
	}
	
	// catch subtitle empty
	if(mostjobs[index].subtitle == null){
		mostjobs[index].subtitle = '';
	}
	
	// add li
	jList.append($( "<li><span class='distance' rel='"+mostjobs[index].lat+"|"+mostjobs[index].lon+"'></span><h2><a href='"+app_url+"job/"+mostjobs[index].job_id+"-"+websave(mostjobs[index].title)+"'>" + mostjobs[index].title + "</a></h2><p>" + mostjobs[index].subtitle + "</p></li>" ).hide().fadeIn());
	
	//	next element
	index++;
	
	// check
	if(index == jobNum){
		
		
		
		index = 0;
		refreshTimeoutRate = 200;
		removeFirst = false;
		
		setTimeout(loadDistances, refreshTimeoutRate);
		
		drawMore(jobNum);
		
	} else {
		// repeat with delay
		setTimeout(drawJob, refreshTimeoutRate);	
	}
	
	
}

function loadDistances(){
	$.each($("span.distance"), function(i,v) {
    			/* save element */
				var theElement = $(this);
				/* get attribute rel */
				var theRel = $(this).attr('rel');
				
				/* split lat and lng */
				var splitRel = theRel.split("|");
				
				/* get location  */
    			var locationB = new GLatLng(splitRel[0],splitRel[1]);
				var locationA = centerMarker.getLatLng();
				
				/* ask google for distance and duration */
				var direction = new GDirections();
				
				direction.load("from: "+locationA+" to: "+locationB); 
				GEvent.addListener(direction, "load", function() { 
					var humanDistance = getHumanDistance(direction.getDistance().meters);
					var newText = "<span class='distanceText'>" + humanDistance + "<sup>*</sup></span>";
					var humanDuration = getHumanDuration(direction.getDuration().seconds);
					newText = newText + '' + "<span class='durationText'>ca." + humanDuration + "</span>";
					theElement.html(newText).hide().fadeIn();  
					//GLog.write(i+': ' + locationA +  ' => ' + locationB);
			   }); 
	});
}

function getHumanDistance(distanceInMeter){
	if(distanceInMeter > 1000){
		var newDistance = distanceInMeter/1000;
		return 	newDistance.toFixed(2) + ' km';
	} else {
		return distanceInMeter + ' m';	
	}
}

function getHumanDuration(durationInSeconds){
	var returnString = "";
	
	var hours = Math.floor(durationInSeconds / (60 * 60));
    
    var divisor_for_minutes = durationInSeconds % (60 * 60);
    var minutes = Math.floor(divisor_for_minutes / 60);
 
    var divisor_for_seconds = divisor_for_minutes % 60;
    var seconds = Math.ceil(divisor_for_seconds);
    
	if(hours){
		returnString = hours + 'h';	
	}
	if(minutes){
		returnString = returnString + ' ' + minutes + 'm';	
	}
	if(seconds){
		returnString = returnString + ' ' + seconds + 's';	
	}
	
	
    return returnString;
}

function initRadiusTabs(radius){
	
	if(radius != ''){
		markerRadius = radius;	
	}
	
	$("a.pageNav").click(function() {
								  $("a.pageNav").removeClass("active");
								  $(this).addClass("active");
								  });
}

function checkDistance(myLat,myLon){
	alert('lat:' + myLat + ' lng: '+myLon);	
}

/* ------------------------------------------------------------------------------------------------------------ */




/**
* getAddress from geocoder
**/

function getAddress(overlay, latlng) { 
  if (latlng != null) { 
    address = latlng; 
    geocoder.getLocations(latlng, showAddressWindow); 
  } 
} 

function initOneClickPosition(){
	clickListener = GEvent.addListener(map, 'click', addStartMarker);	
}

function addStartMarker(marker, latlng){
	if(!marker){
	aktMarker = createMarker(latlng,'draggable');
	map.addOverlay(aktMarker);
    map.panTo(latlng);
					
	writeLatLng(aktMarker.getLatLng());
	} 
}

/** map **/
//
function addToRawArray(id,lat,lng,icontyp,info){
	var rawLine = new Array();
	rawLine['id'] = id;
	rawLine['lat'] = roundVal(lat);
	rawLine['lng'] = roundVal(lng);
	rawLine['iconType'] = icontyp;
	rawLine['info'] = info;
	rawLine['marker'] = null;
	
	//
	var j = rawArray.length;
    for(var i=0; i<j; i++){
		// 
		if(rawArray[i].lat == roundVal(lat) && rawArray[i].lng == roundVal(lng)){
			GLog.write('equal');
			rawArray[i].iconType = 'jobMultiIcon';
			rawLine['iconType'] = 'jobHiddenIcon';
			return;
		}
	}

	rawArray.push(rawLine);
}

function drawRawArray(){
	var j = rawArray.length;
    for(var i=0; i<j; i++){
		// create Marker an add
		addOverlayToMap(rawArray[i].lat,rawArray[i].lng,rawArray[i].info,rawArray[i].iconType,i);
	}
}

/**
* create marker with lat,lng,info & icon
**/
function addOverlayToMap(lat,lng,info,icon,arrayId){
	// point
	point = new GLatLng(lat,lng); 
	
	// marker  options
	var opt = {};
	opt.title = info;
	switch(icon){
		case "jobIcon":
			opt.icon = jobIcon;
			break;
		case "jobMultiIcon":
			opt.icon = jobMultiIcon;
			break;
			
	}
	
	// create marker
    var marker = new GMarker(point, opt); 
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowTabsHtml('<p>'+info+'</p>');
		});
	
	rawArray[arrayId].marker = marker;
	
	// add to map
    map.addOverlay(marker); 
	
	// add link
	$("#jobsLegend").append('<li><a href="#" onclick="goToMarker(rawArray['+arrayId+'].marker);">'+info+'</a></li>');
	
}

/**
* trigger click event
**/
function goToMarker(myMarker){
	GEvent.trigger(myMarker,'click');	
}

// create Job Marker
function newMarker(markerLocation, markerId) {
	
	var marker=new GMarker(markerLocation, {title:'Marker['+markerId+']', icon: jobIcon});
	// icon
	//marker.setImage("css/pix/green-dot.png");
	
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowTabsHtml('<p>Marker['+markerId+'] clicked.</p>');
		});

	map.addOverlay(marker);

	//return marker;
} 

// add Marker to Array
function addMarkerToArray(marker,markerArray){
	var myArray = markersArray;
	var myMarker = marker;
	
	// new lat lng
	var newLat = roundVal(marker.getPoint().lat());
	var newLng = roundVal(marker.getPoint().lng());
	
	
	
	// is a point near this position
	var j = myArray.length;
    for(var i=0; i<j; i++){
		var marker = myArray[i];
		var tmpLat = roundVal(marker.getPoint().lat());
		var tmpLng = roundVal(marker.getPoint().lng());
		
		if(newLat == tmpLat && newLng == tmpLng){
			GLog.write(newLat + ' = ' + tmpLat + ' | ' + newLng + ' = ' + tmpLng);	
			// create new Tab
			GLog.write(myMarker);
			
			//GEvent.addListener(myArray[i], 'click', function() {});
			//return;
		}
		
	}
	
	myArray.push(myMarker);
}

// draw all markers in array
function drawMarkers(markersArray){
	var myArray = markersArray;
	var j = myArray.length;
    for(var i=0; i<j; i++){
		// add to map
		map.addOverlay(myArray[i]);
	}
	
	drawRawArray();
}





function showAddressWindow(response) { 
  map.clearOverlays(); 
  if (!response || response.Status.code != 200) { 
    alert("Status Code:" + response.Status.code); 
  } else { 
    place = response.Placemark[0]; 
    point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]); 
    marker = new GMarker(point); 
    map.addOverlay(marker); 
    marker.openInfoWindowHtml( 
        '<b>orig latlng:</b>' + response.name + '<br/>' +  
        '<b>latlng:</b>' + place.Point.coordinates[0] + "," + place.Point.coordinates[1] + '<br>' + 
        '<b>Status Code:</b>' + response.Status.code + '<br>' + 
        '<b>Status Request:</b>' + response.Status.request + '<br>' + 
        '<b>Address:</b>' + place.address + '<br>' + 
        '<b>Accuracy:</b>' + place.AddressDetails.Accuracy + '<br>' + 
        '<b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode); 
  } 
}

/* center map with polygon */
function centerPolygon(polyElement){
	map.setCenter(polyElement.getBounds().getCenter(),map.getBoundsZoomLevel(polyElement.getBounds()));	
}

function addJobMarker(point,info){
	var newMarker =  new GMarker(point);
	if(info != null){
		GEvent.addListener(newMarker, 'click', function() {   
			// When clicked, open an Info Window   
			newMarker.openInfoWindowHtml(info);   
			});   
	}
	map.addOverlay(newMarker);
}

/* set marker to position */
function createMarker(point,markerType){
	// clear marker
	map.clearOverlays();
	// set Options
	if (markerType == 'draggable'){
		markerOptions = {draggable: true};
	} else {
		markerOptions = {draggable: false};	
	}
	// set Marker
	marker =  new GMarker(point,markerOptions);
	
	// add functions
	if (markerType == 'draggable'){
		GEvent.addListener(marker,"dragend",function() {
		writeLatLng(marker.getLatLng());											
		map.panTo(marker.getLatLng());
		});
	}
	
	return marker;
}

function addMarker(marker){
	// add Marker to map
	map.addOverlay(marker);
	map.setCenter(marker.getLatLng(),11);	
}



function writeLatLng(myGLatLng){
	$('[name="lat"]').val(myGLatLng.lat());
	$('[name="lon"]').val(myGLatLng.lng())
}

function showAddress(address) {
	if (geocoder) {
    	geocoder.getLatLng(
        	address,
          	function(point) {
            	if (!point) {
              		alert("Die Adresse " + address + " konnte nicht gefunden werden.");
            	} else {
              		//map.setCenter(point,11);
					if(!aktMarker || aktMarker == null){
						aktMarker = createMarker(point,'draggable');
					} else {
              			aktMarker.setLatLng(point);
					}
					map.addOverlay(aktMarker);
              		map.panTo(point);
					
					writeLatLng(aktMarker.getLatLng());
            	}
          	}
        );
   	}
}

function loadAdress(){
	var cityValue = $('[name="city"]').val();
	var zipValue = $('[name="zip"]').val();
	var streetValue = $('[name="street"]').val();
		
	var address = zipValue + ' ' + cityValue + ', ' + streetValue;
	// show
	showAddress(address);	
}

function setPosition(){
	
	var latValue = $('[name="lat"]').val();
	var lonValue = $('[name="lon"]').val();
	
	// if lat lon empty
	if(!latValue || !lonValue){
		var cityValue = $('[name="city"]').val();
		var zipValue = $('[name="zip"]').val();
		var streetValue = $('[name="street"]').val();
		
		var address = zipValue + ' ' + cityValue + ', ' + streetValue;
		
		if(zipValue || cityValue || streetValue){
			
			// show
			showAddress(address);
		
			if(!aktMarker || aktMarker == null){
				//
				clickListener = GEvent.addListener(map, 'click', addStartMarker);
			}
		}
	} else {
		if(!aktMarker || aktMarker == null){
			aktMarker = createMarker(new GLatLng(latValue,lonValue),'draggable');
			addMarker(aktMarker);
		} else {
			aktMarker.setLatLng(new GLatLng(latValue,lonValue));
		}
		map.panTo(new GLatLng(latValue,lonValue));
	}
}

function toggleUserMap(){
	//alert($("#user_map").css("left"));
	if($("#user_map").width() == 150 &&  ( $("#user_map").css("left") == 'auto' || $("#user_map").css("left") == '0px' )){
		growUserMap();
	}
	if($("#user_map").width() == 600 && $("#user_map").css("left") == '-450px'){
		shrinkUserMap();
	}
	
}

function growUserMap(){
	//$("#user_map").animate({left:'-=450px',width:'600px', height:'340px'},300);	
	$("#user_map").animate({left:'-450px',width:'600px', height:'340px'},400, function() { map.checkResize(); map.panTo(aktMarker.getLatLng()); });	
}

function shrinkUserMap(){
	$("#user_map").animate({left:'0px',width:'150px', height:'140px'},400, function() { map.checkResize(); map.panTo(aktMarker.getLatLng()); });	
}

/******************** edit polyline ********************************/

/**
* initPolyline
**/
var latlngs = new Array();
var clickListener = null;
var polyline = null;
var markers = new Array();
var inEditMode = false;
var earthRadius = 6378137; // in meters

// color
var polygonLineColor = 'C0C0C0';
var polygonLineWeight = 2;
var polygonLineOpacity = 0.5;
var fillColor = 'FFFFFF';
var fillOpacity = 0.1;

var deselectCurrent = function() {}; // Empty function

function initPolyline(){
	clickListener = GEvent.addListener(map, 'click', handleMapClick);	
}

function setMyPosition(marker, latlng){
	aktMarker = createMarker(latlng,'draggable');
	// add Marker to map
	map.addOverlay(aktMarker);
	// center map
	map.panTo(aktMarker.getPoint());
	
	if (latlng != null) { 
    	address = latlng; 
    	geocoder.getLocations(latlng, showAddress); 
  	} 
	
}

/**
* handleMapClick
**/
function handleMapClick(marker, latlng) {
	// no marker clicked
	if (!marker) {
		if(inEditMode){
			alert('Klicken Sie auf das Gebiet, um den Bearbeitungsmodus zu verlassen.');
		} else {
			latlngs.push(latlng);
			initializePoint(latlngs.length - 1);
			redrawPolyline();
		}
	} else {
		if (inEditMode){
			marker.disableEditing();
			inEditMode = false;
			
			// get point from polygon
			convertPolygonToArray(marker,latlngs);
			
			// redraw changes
			redrawPolyline();
			// log
			logCoordinates();
			
		} else {
			marker.enableEditing();
			inEditMode = true;
		}
	}
}

/**
* convertShapeToArray
**/
// convert shape to array
function convertPolygonToArray(shape,targetArray) {
	var j = shape.getVertexCount(); // get the amount of points
	
    for (var i=0; i<j; i++){
    	targetArray[i] = shape.getVertex(i); // update polyPoints array
	}
	
	// clearArray
	var pointCount = targetArray.length;
	var lastEntry = pointCount -1;
	var penultimateEntry = lastEntry -1;
	if( ( targetArray[lastEntry].x == targetArray[penultimateEntry].x ) && ( targetArray[lastEntry].y == targetArray[penultimateEntry].y ) ){
		targetArray.pop();	
	}
	
}

/**
* initializePoint
**/
function initializePoint(id) {
	var marker = new GMarker(latlngs[id], { draggable:true });
	markers.push(latlngs[id]);
	
	var focusPoint = function() {
		deselectCurrent();
		deselectCurrent = function() {}
		map.panTo(latlngs[id]);
		return false;
	}

	GEvent.addListener(marker, 'click', focusPoint);
	// add to map
	map.addOverlay(marker);
	marker.enableDragging();
	
	GEvent.addListener(marker, 'dragend', function() {
		latlngs[id] = marker.getPoint();
		redrawPolyline();
	});
	
}

/**
* redrawPolyline
**/
function redrawPolyline() {
	var pointCount = latlngs.length;
	var id;
	
	if(polyline) map.removeOverlay(polyline);
	
	if(latlngs.length > 1){
		// Plot polyline, adding the first element to the end, to close the loop.
		latlngs.push(latlngs[0]);
	
		// draw Polyline
		polyline = new GPolygon(latlngs, polygonLineColor, polygonLineWeight, polygonLineOpacity,fillColor,fillOpacity);
		map.addOverlay(polyline);
	
		// restore the array to how it was
		latlngs.pop(); 
		// log
		logCoordinates();
	}
}

/**
* clearPolyline
**/
function clearMap(){
	inEditMode = false;
	map.clearOverlays();
	latlngs = new Array();
	redrawPolyline();
}

/**
* save polyPoints(array) as text to targetFieldName
**/
function logCoordinates(){
	// set target
	var target = document.getElementById('points');
	
	var j = latlngs.length;
	
    target.value = "var points =\n[\n";
    for(var i=0; i<j; i++){
        var lat = latlngs[i].lat();
        var longi = latlngs[i].lng();
        target.value += "new GLatLng(" + roundVal(lat) + "," + roundVal(longi) + ")";
        if(i < (j-1)) target.value += ",\n";
    }
    
	
	
    target.value +="\n];\n";
    target.value +="polyline = new GPolygon(points,'" + polygonLineColor + "'," + polygonLineWeight + "," + polygonLineOpacity + ",'" + fillColor + "'," + fillOpacity + ");\n";
    target.value +="map.addOverlay(polyline);";
}

// helper: spherePointAngle
function spherePointAngle(A, B, C) { 
// returns angle at B
	return Math.atan2(dotProduct(crossProduct(C, B), A),dotProduct(crossProduct(B, A), crossProduct(B, C)));
}

// helper: dotProduct
function dotProduct(a, b) {
	return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);
}

// helper: crossProduct
function crossProduct(a, b) {
	return [(a[1] * b[2]) - (a[2] * b[1]), (a[2] * b[0]) - (a[0] * b[2]),(a[0] * b[1]) - (a[1] * b[0])];
}

// helper: polylineArea
function polylineArea(latlngs) {
	var id, sum = 0, pointCount = latlngs.length, cartesians = [];
	if (pointCount < 3) return 0;
	for (id in latlngs) {
		cartesians[id] = cartesianCoordinates(latlngs[id]);
	}
	// pad out with the first two elements
	cartesians.push(cartesians[0]);
	cartesians.push(cartesians[1]);
	for(id = 0; id < pointCount; id++) {
		var A = cartesians[id];
		var B = cartesians[id + 1];
		var C = cartesians[id + 2];
	sum += spherePointAngle(A, B, C);
	}
	var alpha = Math.abs(sum - (pointCount - 2) * Math.PI);
	alpha -= 2 * Math.PI * Math.floor(alpha / (2 * Math.PI));
	alpha = Math.min(alpha, 4 * Math.PI - alpha);
	return Math.round(alpha * Math.pow(earthRadius, 2));
}

// helper: cartesianCoordinates
function cartesianCoordinates(latlng) {
	
	var x = Math.cos(latlng.latRadians()) * Math.sin(latlng.lngRadians());
	var y = Math.cos(latlng.latRadians()) * Math.cos(latlng.lngRadians());
	var z = Math.sin(latlng.latRadians());
	
	return [x, y, z];
}

// helper: roundValue
function roundVal(val){
    if(val.toString().length < 9){
        return val;
    }else{
    	var dec = 6;
    	var result = Math.round(val*Math.pow(10,dec))/Math.pow(10,dec);
    	return result;
    }
}


