function initialize() {
	//check meta tag for language
	var lang = $('Language').getProperty('content');

	function accentSort(a, b) {
		alph = "ABCČĆDĐEFGHIJKLMNOPQRSŠTUVWXYZŽ";
		alph.split();
		var searchA = a.charAt(0);
		var searchB = b.charAt(0);
		if (alph.indexOf(searchA) < alph.indexOf(searchB)) {
			minusOne = -1;
			return minusOne;
		} 
		else {
			return 0;
		}
	}

	//set latlng as the centre of the map (currently Brcko)
	var startlatlng = new google.maps.LatLng(43.65, 17.967);
	
	//set the initial options for the map: zoom, center, and map type  
	var myOptions = {
		zoom: 6,
		center: startlatlng,
		mapTypeControl: false,
		streetViewControl: false,
		panControl: false,
		zoomControlOptions: {
	        position: google.maps.ControlPosition.TOP_LEFT,
			style: google.maps.ZoomControlStyle.BIG
	    },
		mapTypeId: google.maps.MapTypeId.TERRAIN
	};
	
	//set up the map
	var map = new google.maps.Map(document.getElementById("map_canvas"),
	myOptions);
	
	var selectedMarker = new google.maps.Marker({
		position: new google.maps.LatLng(0, 0),
		map: map,
		visible: false
	});

	// default language values for drop down menus
	switch(lang) {
		case "en":
			selectCaseText = 'Select a case';
			selectPlaceText = 'Select a place';
			countryNameBih = 'BOSNIA AND HERZEGOVINA';
			countryNameCro = 'CROATIA';
			countryNameKos = 'KOSOVO';
			countryNameMak = 'THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA';
			countryNameSrb = 'SERBIA';
			break;
		case "fr":
			selectCaseText = 'Choisir une affaire';
			selectPlaceText = 'Choisir un lieu';
			countryNameBih = 'BOSNIE-HERZÉGOVINE';
			countryNameCro = 'CROATIE';
			countryNameKos = 'KOSOVO';
			countryNameMak = 'L\’EX-RÉPUBLIQUE YOUGOSLAVE DE MACÉDOINE';
			countryNameSrb = 'SERBIE';
			break;
		case "bcs":
			selectCaseText = 'Izaberite predmet';
			selectPlaceText = 'Izaberite lokaciju';
			countryNameBih = 'BOSNA I HERCEGOVINA';
			countryNameCro = 'HRVATSKA';
			countryNameKos = 'KOSOVO';
			countryNameMak = 'BIVŠA JUGOSLAVENSKA REPUBLIKA MAKEDONIJA';
			countryNameSrb = 'SRBIJA';
			break;
		case "mk":
			selectCaseText = 'Предмети';
			selectPlaceText = 'Одбери локација';
			countryNameBih = 'BOSNIA AND HERZEGOVINA';
			countryNameCro = 'CROATIA';
			countryNameKos = 'KOSOVO';
			countryNameMak = 'THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA';
			countryNameSrb = 'SERBIA';
			break;
		case "sq":
			selectCaseText = 'Çështjet e TPNJ-së';
			selectPlaceText = 'Zgjidh vendndodhjen';
			countryNameBih = 'BOSNIA AND HERZEGOVINA';
			countryNameCro = 'CROATIA';
			countryNameKos = 'KOSOVO';
			countryNameMak = 'THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA';
			countryNameSrb = 'SERBIA';
		break;
		default:
			selectCaseText = 'Select a case';
			selectPlaceText = 'Select a place';
			countryNameBih = 'BOSNIA AND HERZEGOVINA';
			countryNameCro = 'CROATIA';
			countryNameKos = 'KOSOVO';
			countryNameMak = 'THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA';
			countryNameSrb = 'SERBIA';
			break;
	}

	// Create a div to hold the caseFinder controls, and its class.
	var caseFinder = document.createElement('DIV');
	caseFinder.setAttribute('class', 'map_casefinder_container');

	// Create an alphabetically sorted array using cases.json
	var casesSorted = [];
	var casesValueSorted = [];
	
	// sort out case names depending on a language and their values
	for (var key in caseInfo) {
		//alert(key);
		switch(lang) {
			case "en":
				casesSorted.push(String(caseInfo[key].enName));
				break;
			case "fr":
				casesSorted.push(String(caseInfo[key].frName));
				break;
			case "bcs":
				casesSorted.push(String(caseInfo[key].bcsName));
				break;
			case "mk":
				casesSorted.push(String(caseInfo[key].mkName));
				break;
			case "sq":
				casesSorted.push(String(caseInfo[key].sqName));
				break;
			default:
				casesSorted.push(String(caseInfo[key].enName));
				break;
		}
		casesValueSorted.push(String(key));
	}
	
	//casesSorted.sort();
	//casesValueSorted.sort();
	//casesSorted.sort(accentSort);
	//casesValueSorted.sort(accentSort);

	// Create the containing dropdown, set its class
	var caseFinderDrop = document.createElement('SELECT');
	caseFinderDrop.setAttribute('class', 'map_casefinder_dropdown');
	caseFinder.appendChild(caseFinderDrop);
	
	// Create the drop down list for finding by case
	var caseOptionDefault = document.createElement('OPTION');
	var defaultText1 = document.createTextNode(selectCaseText);
	caseOptionDefault.setAttribute('value', 'Default');
	caseFinderDrop.appendChild(caseOptionDefault);
	caseOptionDefault.appendChild(defaultText1);
	
	for (var i = 0; i < casesSorted.length; i++) {
		var caseOption = document.createElement('OPTION');
		caseOption.appendChild(document.createTextNode(casesSorted[i]));
		caseOption.setAttribute('value', String(casesValueSorted[i]));
		caseFinderDrop.appendChild(caseOption);
	}
		
	// Create the containing dropdown for places
	var placeFinderDrop = document.createElement('SELECT');
	placeFinderDrop.setAttribute('class', 'map_placefinder_dropdown');
	
	// Create the drop down list for finding by place
	var placeOptionDefault = document.createElement('OPTION');
	var defaultText = document.createTextNode(selectPlaceText);
	placeOptionDefault.setAttribute('value', 'Default');
	placeFinderDrop.appendChild(placeOptionDefault);
	placeOptionDefault.appendChild(defaultText);
	
	//Create Country heading
	function countryOptions(name, placekey){
		var caseOption = document.createElement('OPTION');
		var defaultText = document.createTextNode(name);
		caseOption.setAttribute('value', placekey);
		placeFinderDrop.appendChild(caseOption);
		caseOption.appendChild(defaultText);
		
		// Create an alphabetically sorted array of places in BiH using places.js
		var sortedPlaces = [];
		for (var key in places) {
			if (places[key].country == placekey)
			sortedPlaces.push(String(places[key].name));
		}
		
		sortedPlaces.sort();
		sortedPlaces.sort(accentSort);
		
		for (var i = 0; i < sortedPlaces.length; i++) {
			var placeOption = document.createElement('OPTION');
			placeOption.setAttribute('value', String(sortedPlaces[i]));
			var placeFinderValue = document.createTextNode("\t- " + sortedPlaces[i]);
			placeOption.appendChild(placeFinderValue);
			placeFinderDrop.appendChild(placeOption);
		}
	}
	
	countryOptions(countryNameBih, 'BiH');
	countryOptions(countryNameCro, 'Hr');
	countryOptions(countryNameKos, 'Kos');
	countryOptions(countryNameMak, 'Mkd');
	countryOptions(countryNameSrb, 'Srp');
	
	//Push placefinder into place
	document.getElementById('mapdropdowns').appendChild(placeFinderDrop);
	document.getElementById('mapdropdowns').appendChild(caseFinderDrop);
	
	//Some things to be used by makeSceneBounds later
	var totalScenes = [];
	var sceneInfo = [];
	var sceneListForMultiple = [];
	var infoListForMultiple = [];
	var markerRegister = 0;
	
	//for marker clusterer
	//uncomment for marker clustering
	//var clusterArray = [];
		
	//create the markers
	var marker = function(location){
		var locationMarker = new google.maps.Marker({
			position: new google.maps.LatLng(location.lat, location.lng),
			map: map,
			flat : true
		});
		locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/marker.png');
		//locationMarker.setShadow('shadow.png');
		//uncomment for marker clustering
		//clusterArray.push(locationMarker);
		
		//Listen for selection of Place Dropdown menu, and if the name is in Placelist, do something with the marker.
		var getPlaceValue = function() {
			var s = placeFinderDrop.value;
			if (s == 'Default') {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/marker.png');
				map.setZoom(6);
				totalScenes.push(locationMarker.getPosition());
				closeInfo();
			}
			else if (s == location.name) {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/markerSelected.png');
				map.setZoom(7);
				caseFinderDrop.value = 'Default';
				totalScenes.push(locationMarker.getPosition());
				map.setCenter(locationMarker.getPosition());
				sceneInfo.push(openInfo);
			}
			else if (s == location.country) {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/markerSelected.png');
				map.setZoom(6);
				map.setCenter(startlatlng);
				totalScenes.push(locationMarker.getPosition());
				closeInfo();
			}
			else {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/marker.png');
			}			
			markerRegister++;
			makeSceneBounds(s);
		}

		//Listen for selection of Case Dropdown menu, and if the name is in Caselist, do something with the marker.
		var getCaseValue = function() {
			var s = caseFinderDrop.value;
			var caseSearch = location.caselist.indexOf(s);
			if (s == 'Default') {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/marker.png');
				totalScenes.push(locationMarker.getPosition());
				closeInfo();
			}
			else if (caseSearch >= 0) {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/markerSelected.png')
				placeFinderDrop.value = 'Default';
				totalScenes.push(locationMarker.getPosition());
				sceneInfo.push(openInfo);
				sceneListForMultiple.push(location);
				infoListForMultiple.push(openInfo);
			}
			else {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/marker.png');
			}
			markerRegister++;
			makeSceneBounds(s);
		}
		
		//list function for compiling a bunch of scenes into a list on the side
		var openSceneList = function(scenelist) {
		//empty out the info bar
			var externalBox1 = document.getElementById('map_info');
			externalBox1.innerHTML = '';

			switch(lang) {
			case "en":
				liListTitleText = 'Locations related to this case';
				break;
			case "fr":
				liListTitleText = 'Lieux liés à cette affaire';
				break;
			case "bcs":
				liListTitleText = 'Lokacije povezane sa odabranim predmetom';
				break;
			case "mk":
				liListTitleText = 'MK: Locations related to this case';
				break;
			case "sq":
				liListTitleText = 'SQ: Locations related to this case';
				break;
			default:
				liListTitleText = 'Locations related to this case';
				break;
			}

			var liList = document.createElement('UL');
			liList.setAttribute('class', 'listCasePlaces');
			var liListTitle = document.createElement('P');
			liListTitle.setAttribute('class', 'mapAddTitle');
			var liListTitleText = document.createTextNode(liListTitleText);
			liListTitle.appendChild(liListTitleText);
			
			for (i = 0; i < scenelist.length; i++) {
				//make the element
				var li = document.createElement('LI');
				var liValue = document.createTextNode(scenelist[i].name);
				li.appendChild(liValue);
				liList.appendChild(li);
				google.maps.event.addDomListener(li, 'click', infoListForMultiple[i]);
			}
			document.getElementById('map_info').appendChild(liListTitle);
			document.getElementById('map_info').appendChild(liList);
			infoListForMultiple.length = 0;
			sceneListForMultiple.length = 0;
		}
		
		//scene bounds function
		var makeSceneBounds = function(caseName) {
			if (markerRegister == markerCount && totalScenes.length != 1) {
				var caseName = new google.maps.LatLngBounds();
				for (i = 0; i < totalScenes.length; i++) {
					caseName.extend(totalScenes[i]);
				}
				//show full info here
				openSceneList(sceneListForMultiple);
				map.fitBounds(caseName);
				markerRegister = 0;
				totalScenes.length = 0;
				sceneInfo.length = 0;
				var externalBoxCases1 = document.getElementById('map_info_cases');
				var externalBoxAdd1 = document.getElementById('map_info_add');
				externalBoxCases1.innerHTML="";
				externalBoxAdd1.innerHTML="";
				externalBoxCases1.style.visibility='hidden';
				externalBoxAdd1.style.visibility='hidden';
			} else if (markerRegister == markerCount && totalScenes.length == 1) {
				sceneInfo[0]();
				markerRegister = 0;
				totalScenes.length = 0;
				sceneInfo.length = 0;
			}
		}
		
		//Function for opening window with relevant info (BUILDING CONTENT OF THE INFO WINDOW AND DISPLAYING INFO OUTSIDE OF THE MAP)
		var openInfo = function() {
			//default variables
			var caseList = location.caselist;
			var locationName = location.name;
			var locationCases = '<ul id="caseList">';
			var temp = [];
			//language switcher
			switch(lang) {
				case "en":
					var locationInfo = location.enInfo;
					var locationOutreach = location.enOutreach;
					var locationAdd = location.enAdditional;
					var caseTitle = 'Related cases';
					var outreachTitle = 'Outreach';
					temp = caseList.split(' ');
					//alert(temp);
					for (i=0; i < temp.length; i++) {
						var y = temp[i];
						caseName = caseInfo[y].enName;
						caseAddress = caseInfo[y].addr;
						locationCases += '<li><a href="' + caseAddress + '">' + caseName + '</a>   |  </li>';
					}
					locationCases += '</ul>';
					break;
				case "fr":
					var locationInfo = location.frInfo;
					var locationOutreach = location.frOutreach;
					var locationAdd = location.frAdditional;
					var caseTitle = 'Affaires liées à ce lieu';
					var outreachTitle = 'Activités de sensibilisation';
					temp = caseList.split(' ');
					for (i=0; i < temp.length; i++) {
						y=temp[i];
						caseName = caseInfo[y].frName;
						caseAddress = caseInfo[y].addr;
						locationCases += '<li><a href="' + caseAddress + '">' + caseName + '</a>   |</li>   ';
					}
					locationCases += '</ul>';
					break;
				case "bcs":
					var locationInfo = location.bcsInfo;
					var locationOutreach = location.bcsOutreach;
					var locationAdd = location.bcsAdditional;
					var caseTitle = 'Povezani predmeti';
					var outreachTitle = 'Outreach';
					temp = caseList.split(' ');
					for (i=0; i < temp.length; i++) {
						y=temp[i];
						caseName = caseInfo[y].bcsName;
						caseAddress = caseInfo[y].addr;
						locationCases += '<li><a href="' + caseAddress + '">' + caseName + '</a>   |</li>   ';
					}
					locationCases += '</ul>';
					break;
				case "mk":
					var caseTitle = 'Предмети';
					var outreachTitle = 'Outreach';
					if(location.mkInfo){
						var locationInfo = location.mkInfo;
						var locationOutreach = location.mkOutreach;
						var locationAdd = location.mkAdditional;
					} else {
						var locationInfo = location.enInfo;
						var locationOutreach = location.enOutreach;
						var locationAdd = location.enAdditional;
					}
					temp = caseList.split(' ');
					for (i=0; i < temp.length; i++) {
						y=temp[i];
						caseName = caseInfo[y].mkName;
						caseAddress = caseInfo[y].addr;
						locationCases += '<li><a href="' + caseAddress + '">' + caseName + '</a>   |</li>   ';
					}
					locationCases += '</ul>';
					break;
				case "sq":
					var caseTitle = 'Çështjet e TPNJ-së';
					var outreachTitle = 'Komunikim dhe Ndërgjegjësim';
					if(location.sqInfo){
						var locationInfo = location.sqInfo;
						var locationOutreach = location.sqOutreach;
						var locationAdd = location.sqAdditional;
					} else {
						var locationInfo = location.enInfo;
						var locationOutreach = location.enOutreach;
						var locationAdd = location.enAdditional;
					}
					temp = caseList.split(' ');
					for (i=0; i < temp.length; i++) {
						y=temp[i];
						caseName = caseInfo[y].sqName;
						caseAddress = caseInfo[y].addr;
						locationCases += '<li><a href="' + caseAddress + '">' + caseName + '</a>   |</li>   ';
					}
					locationCases += '</ul>';
					break;	
				default:
					var locationInfo = location.enInfo;
					var locationOutreach = location.enOutreach;
					var locationAdd = location.enAdditional;
					var caseTitle = 'Related cases';
					var outreachTitle = 'Outreach';
					temp = caseList.split(' ');
					//alert(temp[0]);
					for (i=0; i < temp.length; i++) {
						y=temp[i];
						caseName = caseInfo[y].enName;
						caseAddress = caseInfo[y].addr;
						locationCases += '<li><a href="' + caseAddress + '">' + caseName + '</a>   |</li>   ';
					}
					locationCases += '</ul>';
			}

			var externalBox = document.getElementById('map_info');

			var externalBoxCases = document.getElementById('map_info_cases');
			var externalBoxAdd = document.getElementById('map_info_add');

			//create an image tag if an image is present, 
			if (location.pic != '') {
				var locationImage = '<img class="mapImg" src="http://www.icty.org/x/maps/gmapdata/img/' + location.pic + '" />';
			}
			else {
				var locationImage = '';
			}
			
			if (locationOutreach || locationAdd) {
				externalBoxAdd.style.visibility='visible';
				outreachBox = '<p class="mapAddTitle">'+ outreachTitle + '</p><p>' + locationOutreach + '</p><p>' + locationAdd + '</p>';
			} else {
				outreachBox = '';
				externalBoxAdd.style.visibility='hidden';
			}

			externalBoxCases.style.visibility='visible';
			externalBox.style.visibility='visible';
	
			externalBox.innerHTML = '<h4 class="mapTitle">'+ locationName +'</h4><div class="mapInfoContent">' + locationImage + '<p>' + locationInfo + '</p></div>';
			externalBoxCases.innerHTML = '<p class="mapAddTitle">'+ caseTitle + '</p>' + locationCases;
			externalBoxAdd.innerHTML = outreachBox;
			//reset arrays for the location list related to a case
			infoListForMultiple.length = 0;
			sceneListForMultiple.length = 0;
			
			selectedMarker.setIcon('http://www.icty.org/x/maps/gmapdata/marker.png');
			map.panTo(locationMarker.getPosition());
		
			if (locationMarker.icon === 'http://www.icty.org/x/maps/gmapdata/marker.png') {
				locationMarker.setIcon('http://www.icty.org/x/maps/gmapdata/markerSelected.png');
				selectedMarker = locationMarker;
				caseFinderDrop.value = 'Default';
				placeFinderDrop.value = 'Default';
			}
		}
		google.maps.event.addListener(locationMarker, 'click', openInfo);
		google.maps.event.addDomListener(caseFinderDrop, 'change', getCaseValue);
		google.maps.event.addDomListener(placeFinderDrop, 'change', getPlaceValue);
	}
	
	// function to close the info windows
	var closeInfo = function(){
		var externalBox = document.getElementById('map_info');
		var externalBoxCases = document.getElementById('map_info_cases');
		var externalBoxAdd = document.getElementById('map_info_add');

		if(window.close){
			externalBox.innerHTML="";
			externalBoxCases.innerHTML=""; 
			externalBoxAdd.innerHTML="";
			externalBoxCases.style.visibility='hidden';
			externalBoxAdd.style.visibility='hidden';
			externalBox.style.visibility='hidden';
		} else {
			externalBox.textContent="";
			externalBoxCases.textContent="";
			externalBoxAdd.textContent="";
			externalBoxCases.style.visibility='hidden';
			externalBoxAdd.style.visibility='hidden';
			externalBox.style.visibility='hidden';
		}
	}
	
	//Run the markers function on places.json
	google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
		markerCount = 0;
		for (var key in places) {
			marker(places[key]);
			markerCount++;
		}
		//uncomment for marker clustering
		//var mc = new MarkerClusterer(map, clusterArray);
	}
)
};
