﻿// Copyright(c) 2008-2009 IT One, Ltd, Slovakia
// Do not use, change or distribute.

var map = null;
var geocoder = null;
var directions = null;
var markManager = null;

var selectedObj = -1;

var panoClient = null;
var svLatLng = null;
var svPOV = null;

var localeFromRequest = null;

function mapLoad() {
	var cultureCookie = getCookie("culture");
	TryGetLocaleFromRequest();

	if (google.maps.BrowserIsCompatible()){
		map = new google.maps.Map2(document.getElementById("map"));
		
		if (google.loader.ClientLocation != null){
			map.setCenter(new google.maps.LatLng(google.loader.ClientLocation.latitude, 
				google.loader.ClientLocation.longitude), 13);
				
			map.checkResize(); //needed for IE
				
			document.getElementById("loggedUser").innerHTML += "from " + google.loader.ClientLocation.address.country.toString();		    
			
			//we have country code, let's init locale or if avaiable, init from request (?lng=)
			
			if (localeFromRequest != null)
				initLocale(localeFromRequest, handleInitLocaleDone);
			else if (cultureCookie != null)
				initLocale(cultureCookie, handleInitLocaleDone);
			else
				initLocale(google.loader.ClientLocation.address.country_code, handleInitLocaleDone);
		}
		else {
			map.setCenter(new google.maps.LatLng(70, -70), 3);
			map.checkResize(); //needed for IE
			
			//we dont know client's location, init in default language
			if (localeFromRequest != null)
				initLocale(localeFromRequest, handleInitLocaleDone);
			else if (cultureCookie != null)
				initLocale(cultureCookie, handleInitLocaleDone);
			else
				initLocale("US", handleInitLocaleDone);
		}
  
	   map.enableScrollWheelZoom();
	   map.enableContinuousZoom();
	
	   map.addControl(new google.maps.MapTypeControl());
	   //map.addControl(new google.maps.SmallMapControl());
	   map.addMapType(G_NORMAL_MAP);
	   map.addMapType(G_PHYSICAL_MAP);
	   map.addMapType(G_SATELLITE_3D_MAP);
	
		geocoder = new google.maps.ClientGeocoder();
		
		directions = new google.maps.Directions(map);
		google.maps.Event.addListener(directions, "addoverlay", handleDirectionsLoaded);
		google.maps.Event.addListener(directions, "error", handleDirectionsError);
		
		if (google.loader.ClientLocation != null)
			geocoder.setBaseCountryCode(google.loader.ClientLocation.address.country_code);
		
		markManager = new google.maps.MarkerManager(map);
		
		google.maps.Event.addListener(map, 'dragend', handleDragEndOrZoomEvent);
		google.maps.Event.addListener(map, 'zoomend', handleDragEndOrZoomEvent);
		google.maps.Event.addListener(map, 'singlerightclick', showContextMenu);
		google.maps.Event.addListener(map, 'click', hideContextMenu);
		
		initLabeledMarker();
		
		panoClient = new GStreetviewClient();
		
		//earth
//		map.getEarthInstance(function(earth) { 
//			earth.getLayerRoot().enableLayerById(earth.LAYER_BORDERS, true); 
//			earth.getLayerRoot().enableLayerById(earth.LAYER_ROADS, true); 
//		}); 	        	        
	}
	else {
		//handle incompatible browser
	}
	
	if (handlePermaLink() && map != null){
		//center map
		map.setCenter(new google.maps.LatLng(permaLinkLat, permaLinkLng), 14);
	}
}

function restoreDynamicMarkers(){
	if (addingMarker != null){
		map.addOverlay(addingMarker);
	}
	if (directions != null){
		var overlay = directions.getPolyline();
		if (overlay != null){
			map.addOverlay(overlay);
		}
	}
	if (routeStart != null)
		map.addOverlay(routeStart);
	if (routeEnd != null)
	    map.addOverlay(routeEnd);
	if (routeVias.length > 0) {
	    var i;
	    for (i = 0; i < routeVias.length; i++) {
	        map.addOverlay(routeVias[i]);
	    }
	}
		
	if (selectionMarker != null)
		map.addOverlay(selectionMarker);
}

var getObjsRequestID = 0;
var getObjectsInProggress = false;

function handleDragEndOrZoomEvent(){
	//hide tooltip (for zooming)
	var tooltip = document.getElementById("markerTooltip");
	tooltip.style.visibility = "hidden";
	var mapZoom = map.getZoom();
	
	if (mapZoom < 10){ //showing aggregate data
		var aggrInf = document.getElementById("aggrInf");
		aggrInf.style.visibility = "visible";
	}
	else {
		var aggrInf = document.getElementById("aggrInf");
		aggrInf.style.visibility = "hidden";
	}
	
	hideContextMenu();

	//place for getting data
	textCenterMap.style.visibility = "visible";
	getObjectsInProggress = true;
	map.clearOverlays();
	
	restoreDynamicMarkers();

	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	
	resetAggrMarkerOffset();
	
	getObjsRequestID++;
	
	var minColor = Colors.ColorFromHex("#D9FF2C");
	var maxColor = Colors.ColorFromHex("#DC8276");
	var legendVisible = false;
	
	var c, refCount = 0;
	for (c = 0; c < layers.length; c++){
		if (layers[c].checked == true){
			refCount++;
			
			var combo = document.getElementById("catCmb" + layers[c].id.toString());
			var property = combo.options[combo.selectedIndex].getAttribute("propID");
			
			var filterString = getFilterStrings(layers[c].id);
			
			addAggrMarkerOffset(layers[c].id);

			if (mapZoom >= 10) { //single objects
			    if (layers[c].JSONQuery != "") {
			        GetObjectsFromJSONQuery(layers[c], bounds, property);
			        refCount--;
			    } else {
			        CleverGlobeService.GetObjects(getObjsRequestID, culture, layers[c].id, southWest.lng(), southWest.lat(), northEast.lng(), northEast.lat(), map.getZoom(), property,
					filterString,
					function(objects) {
					    if (mapZoom < 10)
					        return;

					    if (objects != null) {
					        if (objects.length == 1) {
					            showMessage(getLocaleString("_zoomCloser"), 4000);
					        }
					        else {
					            if (Number(objects[1]) != getObjsRequestID) //not the last request
					                return;

					            var i;
					            var cheapest = GetMinFromObjects(objects);
					            var worst = GetMaxFromObjects(objects);

					            var cat = getLayer(objects[0]);
					            for (i = 2; i < objects.length; i += 5) {
					                var days = Number(objects[i + 4]);
					                var isOld = ageDaysCount == 0 ? false : (days > ageDaysCount || days == 0);

					                if (cheapest != null && worst != null && cheapest != worst) {
					                    if (isNaN(objects[i + 3]) == false) {
					                        var num = Number(objects[i + 3]);

					                        if (num == 0 || isOld) { //number is zero or property is old
					                            objects[i + 3] = getLocaleString("locUpdMarker");
					                            marker = createMarker(cat.id, objects[i], Number(objects[i + 1]), Number(objects[i + 2]), cat.icon, objects[i + 3], "#aaFFCF");
					                        }
					                        else {
					                            var color = interpolateColor(minColor, maxColor, (num - cheapest) / (worst - cheapest));
					                            marker = createMarker(cat.id, objects[i], Number(objects[i + 1]), Number(objects[i + 2]), cat.icon, objects[i + 3], color.HexString());
					                            legendVisible = true;
					                        }
					                        continue;
					                    }
					                }

					                if (objects[i + 3] == "0" || objects[i + 3] == "" || isOld)
					                    objects[i + 3] = getLocaleString("locUpdMarker");

					                marker = createMarker(cat.id, objects[i], Number(objects[i + 1]), Number(objects[i + 2]), cat.icon, objects[i + 3], "#aaFFCF");
					            }

					        }
					    }

					    if (--refCount == 0) { //last async request has finished
					        textCenterMap.style.visibility = "hidden";
					        getObjectsInProggress = false;

					        //show legend if needed
					        if (legendVisible)
					            showLegend(minColor, maxColor, getLocaleString("locBest"), getLocaleString("locWorst"));
					        else
					            hideLegend();
					    }
					},

		        function() {
		            //timeout
		            showMessage("locTimeout", 3000, "WRONG");
		            textCenterMap.style.visibility = "hidden";
		            getObjectsInProggress = false;
		        });
			    }
			}
			else if (mapZoom >= 4){ //countries
				CleverGlobeService.GetCountries(layers[c].id, southWest.lng(), southWest.lat(), northEast.lng(), northEast.lat(), 
					property, "count",
					function(countries){
						if (mapZoom < 4)
							return;

						if (countries != null){
							var i;
							var cat = getLayer(countries[0]);
							for (i = 1; i < countries.length; i+=5){
								marker = createAggregateMarker(cat.id, countries[i], Number(countries[i+2]), Number(countries[i+3]), 
									cat.icon, /*countries[i+1] + "<br />" + */countries[i+4]);
							}
						}

						if (--refCount == 0){ //last async request has finished
							textCenterMap.style.visibility = "hidden";
							getObjectsInProggress = false;
						}
				});			
			}
			else { //country groups
				CleverGlobeService.GetCountryGroups(layers[c].id, 0, southWest.lng(), southWest.lat(), northEast.lng(), northEast.lat(), 
					property, "count",
					function(groups){
						if (groups != null){
							var i;
							var cat = getLayer(groups[0]);
							for (i = 1; i < groups.length; i+=5){
								marker = createAggregateMarker(cat.id, groups[i], Number(groups[i+2]), Number(groups[i+3]), 
									cat.icon, /*groups[i+1] + "<br />" + */groups[i+4]);
							}
						}

						if (--refCount == 0){ //last async request has finished
						    textCenterMap.style.visibility = "hidden";
						    getObjectsInProggress = false;
						}
                },

		        function() {
		            //timeout
		            showMessage("locTimeout", 3000, "WRONG");
		            textCenterMap.style.visibility = "hidden";
		            getObjectsInProggress = false;
		        });			
			}
		}
	}
	if (refCount == 0) {
	    textCenterMap.style.visibility = "hidden";
	    getObjectsInProggress = false;
	}
		
	//get o nodes
/*	CleverGlobeService.OctGetNodesPointsForBounds(southWest.lng(), southWest.lat(), northEast.lng(), northEast.lat(),
		function(points){
			var i = 0;
			for (i = 0; i < points.length; i+=2){
				createDraggableMarker(Number(points[i]), Number(points[i+1]));
			}
		}
	);*/
	
	recalculateSearchObjects();
}

function GetMinFromObjects(objects){
	var min = 100000000;
	for (i = 2; i < objects.length; i+=5){
		if (isNaN(objects[i+3]) == false){
			var num = Number(objects[i+3]);
			if (num == 0)
				continue;
			if (num < min){
				min = num;
			}
		}
	}
	
	if (min == 100000000)
		return null;
		
	return min;
}

function GetMaxFromObjects(objects){
	var max = -100000000;
	for (i = 2; i < objects.length; i+=5){
		if (isNaN(objects[i+3]) == false){
			var num = Number(objects[i+3]);
			if (num == 0)
				continue;
			if (num > max){
				max = num;
			}
		}
	}
	
	if (max == -100000000)
		return null;
		
	return max;
}


function searchAddressOnMap(str){
	var latLng = geocoder.getLatLng(str,
		function(point) {
		  if (!point) {
		   //TODO: handle address not found
		  } else {
			map.setCenter(point, map.getZoom());
			//createMarker(-1, -1, point.x, point.y, "http://labs.google.com/ridefinder/images/mm_20_red.png", "", "FFFFCD");
			handleDragEndOrZoomEvent();
		  }
		}
	  );
}

var srchObjects = new Array();

function searchObjects(str) {
    var latLng = map.getCenter();

    CleverGlobeService.GetSearchObjects(latLng.lat(), latLng.lng(), str, 30, function(objs) {
        srchObjects.length = 0;
        var objCont = document.getElementById("mySrcDiv");
        var table = document.createElement("table");
        objCont.innerHTML = "";
        objCont.appendChild(table);
        var i;
        for (i = 0; i < objs.length; i += 7) {
            var layer = getLayer(Number(objs[i + 1]));
            if (layer == null)
                continue;

            objs[i + 3] = objs[i + 3].replace(",", ".");
            objs[i + 4] = objs[i + 4].replace(",", ".");

            var tr = table.insertRow(-1);
            tr.style.cursor = "pointer";
            var cell = tr.insertCell(-1);
            cell.innerHTML = "<img src='" + layer.icon + "' />";
            cell.style.width = "15px";

            cell = tr.insertCell(-1);
            cell.style.fontSize = "10px";
            cell.style.fontWeight = "bold";
            cell.style.width = "130px";
            cell.innerHTML = objs[i + 2];

            //distance
            cell = tr.insertCell(-1);
            var distCell = cell;
            cell.style.fontSize = "10px";
            var dist = (new GLatLng(Number(objs[i + 3]), Number(objs[i + 4]))).distanceFrom(latLng) / 1000;
            cell.innerHTML = (Math.round(dist * 100) / 100) + " km";
            cell.style.width = "60px";

            cell = tr.insertCell(-1);
            cell.style.width = "10px";
            cell.innerHTML = objs[i + 6];

            tr.setAttribute("mID", objs[i]);
            tr.onclick = function() {
                handleSrcObjsClick(Number(this.getAttribute("mID")));
            }

            //add to array
            var item = new Object();
            item.id = Number(objs[i]);
            item.lat = Number(objs[i + 3]);
            item.lng = Number(objs[i + 4]);
            item.distCell = distCell;
            srchObjects.push(item);
        }
    });

    setActiveToolTab("my");
    handleMyUpdate('Search', document.getElementById("mySearch"));
}

function recalculateSearchObjects() {
    var latLng = map.getCenter();
    var i;
    
    for (i = 0; i < srchObjects.length; i++) {
        var dist = (new GLatLng(srchObjects[i].lat, srchObjects[i].lng).distanceFrom(latLng) / 1000);
        srchObjects[i].distCell.innerHTML = (Math.round(dist * 100) / 100) + " km";
    }
}

function handleSearchInputKeyDown(e){
    if (e.keyCode == 13) { //search map            
        var str = document.getElementById("searchText").value;
        if (searchType == 0) {
            searchAddressOnMap(str);
        }
        if (searchType == 1) { //search objects
            searchObjects(str);
        }
		
		return false;
	}
}

function handleSearchButton(){
    var str = document.getElementById("searchText").value;
    if (searchType == 0) {
        searchAddressOnMap(str);
    }
    if (searchType == 1) { //search objects
        searchObjects(str);
    }
}

var searchType = 1;

function handleSrchTypeChanged(combo){
    searchType = combo.options[combo.selectedIndex].value;
}

var tooltipRequestID = -1;

function handleMarkerMouseOver(id, layerID){
	var tooltip = document.getElementById("markerTooltip");
	tooltip.innerHTML = "";
	tooltip.style.visibility = "visible";
	
	if (window.event){
		if (window.event.clientX && window.event.clientY){
			tooltip.style.top = (window.event.clientY + 2) + "px";
			tooltip.style.left = (window.event.clientX + 2) + "px";
		}
		else if (window.event.pageX && window.event.pageY){
			tooltip.style.top = (window.event.pageY + 2) + "px";
			tooltip.style.left = (window.event.pageX + 2) + "px";
		}
	}
	else {
			tooltip.style.top = (mouseY + 2) + "px";
			tooltip.style.left = (mouseX + 2) + "px";
	}
	
	//begin loading info
	//var label = document.getElementById("tltpLab");
	//label.style.visibility = "visible";

	tooltipRequestID++;
	
    var layerDat = findJSONCat(layerID);
    var layerSer = JSON.stringify(layerDat);

	 CleverGlobeService.GetObjectTooltipJSON(tooltipRequestID, culture, layerSer, id, function(html){
		if (Number(html[0]) == tooltipRequestID){
			//loading done
			//var label = document.getElementById("tltpLab");
			//label.style.visibility = "hidden";
			tooltip.innerHTML = html[1];
		}
	 });
}

function handleMarkerMouseOut(){
	var tooltip = document.getElementById("markerTooltip");
	tooltip.style.visibility = "hidden";
}

function updateProperty(objectID, propertyID, value){

}

var activeIfr = null;

function getActiveIfr(){
	return activeIfr;
}

function setActiveIfr(elem){
	activeIfr = elem;
	alert("fsa");
}

function handleMarkerClick(id, layerID) {
    if (sessionID != "") {
        CleverGlobeService.GetObjectProperties(culture, id, "updatable", function(props) {
            if (props != null) {
                var infoContentDIV = document.getElementById("objInfoCon");
                infoContentDIV.innerHTML = "";

                var lab = document.createElement("label");
                lab.setAttribute("id", "updName");
                infoContentDIV.appendChild(lab);
                infoContentDIV.appendChild(document.createElement("br"));

                var tbl = document.createElement("table");
                tbl.style.overflow = "auto";
                infoContentDIV.appendChild(tbl);

                CleverGlobeService.GetObjectName(id, function(name) {
                    var nameLab = document.getElementById("updName");
                    if (nameLab != null) {
                        nameLab.style.fontSize = "12px";
                        nameLab.style.width = "100%";
                        nameLab.style.fontWeight = "bold";
                        nameLab.innerHTML += name + ":";
                    }
                });

                var i;
                for (i = 0; i < props.length; i += 5) {
                    var propRealID = props[i + 3];
                    var earnsPoints = Number(props[i + 4]) != 0;

                    var row = tbl.insertRow(-1);
                    row.style.height = "15px"

                    var cell = row.insertCell(-1);
                    cell.style.width = "2px";
                    if (earnsPoints == true)
                        cell.style.backgroundColor = "Yellow";

                    var cell = row.insertCell(-1);
                    cell.style.fontSize = "10px";
                    cell.style.width = "70px";
                    cell.innerHTML += "<label>" + props[i] + ":" + "</label>";

                    //prop input
                    var cell = row.insertCell(-1);
                    cell.style.fontSize = "10px";
                    if (props[i + 2].startsWith("enum")) {
                        var enumSelName = "propUpd" + i.toString();
                        var selIndex = Number(props[i + 1]);
                        cell.innerHTML += "<select id='" + enumSelName + "' type='text' style='font-size:10px; left:80px' onblur='handleUpdateProperty(this);' />";
                        cell.innerHTML += "<input id='orgPropValue" + i.toString() + "' type='hidden' value='" + props[i + 1] + "' />"; // 14-04-2009 Jano
                        
                        CleverGlobeService.GetEnumValues(culture, enumSelName, selIndex.toString(), props[i + 2], function(enumVals) {
                            var selElem = document.getElementById(enumVals[0]);
                            var selIndexLocal = Number(enumVals[1]);
                            var ei = 2;
                            for (ei = 2; ei < enumVals.length; ei++) {
                                var newOption = document.createElement("option");
                                newOption.text = enumVals[ei];
                                newOption.value = enumVals[ei];
                                selElem.options.add(newOption);
                                selElem.selectedIndex = selIndexLocal;
                            }
                        });
                    }
                    else if (props[i + 2] == "string" || props[i + 2] == "int" || props[i + 2] == "url" || props[i + 2] == "email") {
                    cell.innerHTML += "<input id='propUpd" + i.toString() + "' type='text' style='font-size:10px;width:90px' value='" + props[i + 1] + "' propRealID='" + propRealID.toString() + "' propID='" + i.toString() + "' propName='" + props[i] + "' earnsPoints='" + props[i + 4].toString() + "' onclick='this.select();' onblur='handleUpdateProperty(this);' />";
                    cell.innerHTML += "<input id='orgPropValue" + i.toString() + "' type='hidden' value='" + props[i + 1] + "' />"; // 20-03-2009 Jano
                    }
                    else if (props[i + 2] == "image") {
                        //set object id and property id
                        //cell.innerHTML += "<iframe id='propUpd" + i.toString() + "' PropRealID='" + propRealID.toString() + "' ObjectID='" + id.toString() + "' SessionID='" + sessionID + "' Culture='" + culture + "' target='ifrHidden' src='form.aspx' style='width:150px; height:70px; border-style:none; overflow:hidden' focus='setActiveIfr(this)' onfocus='setActiveIfr(this)' />";
                    }
                    else if (props[i + 2] == "money" || props[i + 2] == "dimension" || props[i + 2] == "area") {
                    cell.innerHTML += "<input id='propUpd" + i.toString() + "' type='text' style='font-size:10px; width:90px' value='" + props[i + 1] + "' propRealID='" + propRealID.toString() + "' propID='" + i.toString() + "' propName='" + props[i] + "' earnsPoints='" + props[i + 4].toString() + "' onclick='this.select();' onblur='handleUpdateProperty(this);' />";
                    cell.innerHTML += "<select id='UnitProp" + i.toString() + "' style='font-size:10px; left:190px' />";
                    cell.innerHTML += "<input id='orgPropValue" + i.toString() + "' type='hidden' value='" + props[i + 1] + "' />"; // 20-03-2009 Jano


                        CleverGlobeService.GetUnitsForType("UnitProp" + i.toString(), props[i + 2], function(units) {
                            var combo = document.getElementById(units[0]);
                            var ui;
                            for (ui = 1; ui < units.length; ui++) {
                                var newOption = document.createElement("option");
                                newOption.text = units[ui];
                                newOption.value = units[ui];
                                combo.options.add(newOption);
                            }
                        });
                    }


                    //refresh btn
                    var cell = row.insertCell(-1);
                    cell.style.fontSize = "10px";

                    if (props[i + 2] != "image") {
                        cell.innerHTML += "<img src='img/refresh.png' propRealID='" + propRealID.toString() + "' propID='" + i.toString() + "' propName='" + props[i] + "' style='cursor:pointer; height:20px;' onclick='handleUpdateProperty(this)'/>";
                    }
                }
                selectedObj = id;
            }
        });
    }

    //get object info into info DIV
    var layerDat = findJSONCat(layerID);
    var layerSer = JSON.stringify(layerDat);
    CleverGlobeService.GetObjectInfoJSON(culture, layerSer, id, function(html) {
        var infoDIV = document.getElementById("infoCont");
        infoDIV.innerHTML = html;
        var linkElem = document.getElementById("objLink");
        var shareElem = document.getElementById("shareLnk");

        CleverGlobeService.GetObjectLink(id, function(link) {
            linkElem.value = link;

            //update 'share' links
            CleverGlobeService.GetObjectName(id, function(objName) {
                if (linkElem != null && shareElem != null) {
                    var lnk = linkElem.value;
                    shareElem.setAttribute("href", lnk);
                    shareElem.setAttribute("title", objName);
                    shareElem.style.visibility = "visible";
                }
            });
        });

        //switch to info tab
        setActiveToolTab("info");
    });
	 
	 //determine, whether street view is avaiable for this location
	 document.getElementById("streetLab").style.visibility = "hidden";
 
     CleverGlobeService.GetObjectLatLng(id, function(latLng){
	     panoClient.getNearestPanorama(new google.maps.LatLng(Number(latLng[0].replace(',','.')), 
		    Number(latLng[1].replace(',','.'))), function(data){
			
		    streetViewAvaiable = false;
			
		    if (data != null){
			    if (data.code != 600 && data.code != 500){
				    var label = document.getElementById("streetLab");
				    label.style.visibility = "visible";
				    svLatLng = data.location.latlng;
				    svPOV = data.location.pov;
				    streetViewAvaiable = true;
			    }
		    }
			
		     //handle selection marker
		     handleSelectionMarker(Number(latLng[0].replace(',','.')), 
			    Number(latLng[1].replace(',','.')));

	    });
    });
}

function handleJSONMarkerClick(marker){
    //get object info into info DIV
    CleverGlobeService.GetObjectInfoForLayer(marker.layerID, function(html) {
        var infoDIV = document.getElementById("infoCont");
        var jsonObj = GetJSONObject(marker.layerID, marker.objectIndex);
        infoDIV.innerHTML = FillJSONObjectXml(html, jsonObj, marker);
        //reset link and share button
        var linkElem = document.getElementById("objLink");
        linkElem.value = "";
        var shareElem = document.getElementById("shareLnk");
        shareElem.style.visibility = "hidden";
        //switch to info tab
        setActiveToolTab("info");

        //reset update tab content
        var infoContentDIV = document.getElementById("objInfoCon");
        infoContentDIV.innerHTML = "";

        //handle selection marker
        var latLng = marker.getLatLng();
        handleSelectionMarker(latLng.lat(), latLng.lng());
    });
}

function handleJSONMarkerMouseOver(marker) {

}

function handleJSONMarkerMouseOut(marker) {

}

var streetViewVisible = false;
var streetViewAvaiable = false;

function handleStreetViewClick(){
	var streetDIV = document.getElementById("streetDiv");
	var streetDIVParent = document.getElementById("strtParent");
	streetDIVParent.style.visibility = "visible";
	var pano = new google.maps.StreetviewPanorama(streetDIV);
	pano.setLocationAndPOV(svLatLng, svPOV);
	
	centerElement(streetDIVParent);
	
	streetViewVisible = true;
}

function handleStreetViewOK(){
	var streetDIVParent = document.getElementById("strtParent");
	streetDIVParent.style.visibility = "hidden";
	streetViewVisible = false;
}

function createMarker(layerID, id, lat, lng, icon, caption, color){
/*	var ic = new google.maps.Icon(G_DEFAULT_ICON);
	ic.image = icon;
	ic.iconSize = new google.maps.Size(15, 20);
	markerOptions = {icon:ic, id:id};
	var marker = new google.maps.Marker(new google.maps.Point(lng, lat), markerOptions);
	google.maps.Event.addListener(marker, "click", function() {
		handleMarkerClick(this.id);
	});

	google.maps.Event.addListener(marker, "mouseover", function() {
		handleMarkerMouseOver(id);
	});
	google.maps.Event.addListener(marker, "mouseout", function() {
		handleMarkerMouseOut(id);
	});
	
	map.addOverlay(marker);
	//markManager.addMarker(marker);
*/	

	var ic = new google.maps.Icon(G_DEFAULT_ICON);
	ic.image = icon;
	ic.iconSize = new google.maps.Size(16, 16);
	ic.shadow = null;
	opts = {
		id:id,
		icon: ic,
		draggable: false,
		labelText: caption,
		labelClass: "markerLabel",
		labelOffset: new GSize(0, -16),
		labelColor: color
	};
	var marker = new LabeledMarker(new google.maps.Point(lng, lat), opts);
		
	google.maps.Event.addListener(marker, "click", function() {
		handleMarkerClick(this.id, layerID);
	});

	google.maps.Event.addListener(marker, "mouseover", function() {
		handleMarkerMouseOver(id, layerID);
	});
	google.maps.Event.addListener(marker, "mouseout", function() {
		handleMarkerMouseOut(id);
	});

    map.addOverlay(marker);
    
    	if (layerID != -1){ //add to client layer object
		var layer = getLayer(layerID);
		if (layer != null){
			layer.markers.push(marker);
		}
	}
}

function createJSONMarker(layerID, objIndex, jsonData, lat, lng, icon, caption, color, markerCallback) {
    var ic = new google.maps.Icon(G_DEFAULT_ICON);
    ic.image = icon;
    ic.iconSize = new google.maps.Size(16, 16);
    ic.shadow = null;
    opts = {
        icon: ic,
        draggable: false,
        labelText: caption,
        labelClass: "markerLabel",
        labelOffset: new GSize(0, -16),
        labelColor: color
    };

    
    //call markerCallback script
    if (markerCallback != "" && markerCallback != null) {
        try {
            eval(markerCallback);
        }
        catch(err){
        
        }
    }

    var marker = new LabeledMarker(new google.maps.Point(lng, lat), opts);

    google.maps.Event.addListener(marker, "click", function() {
        handleJSONMarkerClick(this);
    });

    google.maps.Event.addListener(marker, "mouseover", function() {
        handleJSONMarkerMouseOver(this);
    });
    google.maps.Event.addListener(marker, "mouseout", function() {
        handleJSONMarkerMouseOut(this);
    });

    marker.layerID = layerID;
    marker.objectIndex = objIndex;

    map.addOverlay(marker);

    if (layerID != -1) { //add to client layer object
        var layer = getLayer(layerID);
        if (layer != null) {
            layer.markers.push(marker);
        }
    }
}

function createDraggableMarker(lat, lng, icon){
    var ic = new google.maps.Icon(G_DEFAULT_ICON);
    if (icon != null)
        ic.image = "http://cleverglobe.com/img/icons/" + icon;
	ic.iconSize = new google.maps.Size(30, 40);
	markerOptions = {icon:ic, draggable:true};
	var draggableMarker = new google.maps.Marker(new google.maps.Point(lng, lat), markerOptions);
	map.addOverlay(draggableMarker);
	return draggableMarker;
}

var selectionMarker = null;

function handleSelectionMarker(lat, lng){
	if (selectionMarker == null){
		var ic = new google.maps.Icon(G_DEFAULT_ICON);
		ic.image = "http://cleverglobe.com/img/icons/sel.png";
		ic.shadow = null;
		ic.iconSize = new google.maps.Size(50, 50);
		ic.iconAnchor = new google.maps.Point(25, 40);
		markerOptions = {icon:ic, draggable:false, clickable:false};
		selectionMarker = new google.maps.Marker(new google.maps.Point(lng, lat), markerOptions);
		map.addOverlay(selectionMarker);
	}
	else {
		selectionMarker.setLatLng(new google.maps.LatLng(lat, lng));
	}
}


function createAggregateMarker(layerID, id, lat, lng, icon, caption){
	//get offset
	var i;
	for (i = 0; i < aggrMarkOffsets.length; i++){
		if (aggrMarkOffsets[i].layerID == layerID){
			lat += aggrMarkOffsets[i].offsLat;
			lng += aggrMarkOffsets[i].offsLng;
		}
	}
	
	var ic = new google.maps.Icon(G_DEFAULT_ICON);
	ic.image = icon;
	ic.iconSize = new google.maps.Size(16, 16);
	ic.shadow = null;
	opts = {
		id:id,
		icon: ic,
		draggable: false,
		labelText: caption,
		labelClass: "markerLabel",
		labelOffset: new GSize(0, -16)
	};
	var marker = new LabeledMarker(new google.maps.Point(lng, lat), opts);
		
    map.addOverlay(marker);
    
    if (layerID != -1){ //add to client layer object
		var layer = getLayer(layerID);
		if (layer != null){
			layer.markers.push(marker);
		}
	}
}

var aggrMarkOffsets = new Array();
var aggrMarkCurPosX = 0;
var aggrMarkCurPosY = 0;

function addAggrMarkerOffset(layerID){
	var i;
	for (i = 0; i < aggrMarkOffsets.length; i++)
		if (aggrMarkOffsets[i].layerID == layerID)
			return;
			
	var offs = new Object();
	offs.layerID = layerID;
	offs.offsLat = aggrMarkCurPosY;
	offs.offsLng = aggrMarkCurPosX;
	aggrMarkOffsets.push(offs);
	
	aggrMarkCurPosX += 1;
	if (aggrMarkCurPosX > 5){
		aggrMarkCurPosX = 0;
		aggrMarkCurPosY += 1;
	}
}

function resetAggrMarkerOffset(){
	aggrMarkOffsets.length = 0;
	aggrMarkCurPosX = 0;
	aggrMarkCurPosY = 0;
}

function handleCenterMap(){
	map.setCenter(contextMenuLatLng);
	handleDragEndOrZoomEvent();
}

function handleZoomInMap(){
	map.zoomIn();
	handleDragEndOrZoomEvent();
}

function handleZoomOutMap(){
	map.zoomOut();
	handleDragEndOrZoomEvent();
}