var addressNotFoundMsg = new Array(
	'Несъществуващ или некоректно зададен адрес',
	'Address not recognized'
);

var mi = 0;
var points_array = new Array();
var wanted_markers = new Array();
var nearByMarks = [];

var Dom = {
        get: function(el) {
          if (typeof el === 'string') {
            return document.getElementById(el);
          } else {
            return el;
          }
        },
        add: function(el, dest) {
          var el = this.get(el);
          var dest = this.get(dest);
          dest.appendChild(el);
        },
        remove: function(el) {
          var el = this.get(el);
          el.parentNode.removeChild(el);
        }
      };
      var Event2 = {
        add: function() {
          if (window.addEventListener) {
            return function(el, type, fn) {
              Dom.get(el).addEventListener(type, fn, false);
            };
          } else if (window.attachEvent) {
            return function(el, type, fn) {
              var f = function() {
                fn.call(Dom.get(el), window.event);
              };
              Dom.get(el).attachEvent('on' + type, f);
            };
          }
        }()
      };

function trim(val) {
	 var ret = val.replace(/^\s+/, '');
	 ret = ret.replace(/\s+$/, '');
	
	 return ret;
}

function createMarker(point, markerI) {
 	var marker = new GMarker(point, Icon);
	GEvent.addListener(marker, "click", function() {
		myClick(markerI);
  });
	return marker;
}

function myClick(guid){
	infoHtmlStr = '<div style="width:350px; font-size:12px; font-family:\"Trebuchet MS\",Arial,sans-serif;"><b>' + myPlacemarksInfo[guid]['title'] + '</b><br />' + myPlacemarksInfo[guid]['content'] +'</div>';
	allMarkersArray[myHashTable[guid]].openInfoWindow(infoHtmlStr);
}

function FillSideList(markersArray){
	markersArrayLength = markersArray.length
	tmp_markers = new Array()
	for(var n=0; n<markersArrayLength; n++)
	{
		var text_id = markersArray[n].guid;
		tmp_markers.push({
			'guid' : text_id,
			'title' : myPlacemarksInfo[text_id].title
		})
	}
	function sortByTitle(a, b) {
    	var x = a.title.toLowerCase();
    	var y = b.title.toLowerCase();
    	return ((x < y) ? -1 : ((x > y) ? 1 : 0));
	}
	tmp_markers.sort(sortByTitle)
	$('list').innerHTML = "";
	for(var n=0; n<tmp_markers.length; n++)
	{
		var el = document.createElement('li');
		var text_id = tmp_markers[n].guid;
		el.innerHTML = '<a>'+myPlacemarksInfo[text_id].title+'</a>';
		el.setAttribute('id', 'm_'+tmp_markers[n].guid);
		$('list').appendChild(el);
		Event2.add(el, 'click', function(e) {
			set_new_center(this.id);				
		});
	}
	var list_height = $('list').offsetHeight;
	if(list_height>360){
		set_scroll()
		$('scroller').show();
	}else{
		$('scroller').hide();
		$('scroll_content').style.top = 0;
	}
}

function enterPressed(e){
	var keycode;
	if (window.event) keycode = window.event.keyCode;
	else if (e) keycode = e.which;
	else return;
	if (keycode == 13){
		SearchThis();
	}

}

function SearchThis(){
	wanted_markers = allMarkersArray;
	searchStr = document.getElementById('searched_address').value + ', ' + document.getElementById('CitiesList').value;
	Search(searchStr);
}

function Search(searchedAddress){
	empty_search = false;
	if($('searched_address').value.empty()){
		current_city = $('CitiesList').value
		if(cities_zoom[current_city]){
			if(cities_zoom[current_city]){
				empty_search = true;
				city_zoom = cities_zoom[current_city]
			}
		}
	}
	$('list').innerHTML = "";
	$('scroll_content').style.top = 0;
	$('scroller').hide();
	searchedAddress += ', ' + country;  
	geocoder.getLocations(searchedAddress, function(result){
		if (!result || !result.Placemark) {
			$('search_result').innerHTML = addressNotFoundMsg[partOfString];
	  	} else {
	  		$('search_result').innerHTML = '';
			var place = result.Placemark[0];
			
			point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
			if(empty_search){
  				myMap.setCenter(point, city_zoom);
  			}else{
  				myMap.setCenter(point);
  			}
			nearByMarks = GetMarkersInCurrentViewport();
			FillSideList(nearByMarks);
			myMap.removeOverlay(markerCurrentPosition);
  			markerCurrentPosition = new GMarker(point, IconCurrentPosition);
  			myMap.addOverlay(markerCurrentPosition);
  			if(!empty_search){
      			var visibleMarks = [];
      			lastZoom = currentZoom;
      			while(visibleMarks.length==0){
					visibleMarks = GetMarkersInCurrentViewport();
					if(visibleMarks.length==0){			
      					if(currentZoom <= 11){
      						break;
						}
						myMap.zoomOut();
						systemZoom = true;
					}else{
					}
      			}
      		}
	  	}
  });
}
function set_scroll(){
	var Layer = $('scroll_content');
	var fSlider = new Control.Slider($('scroller').childNodes[0], 'scroller', {axis: 'vertical'});	
	fSlider.slider_gap = Layer.offsetHeight - $('scroller').offsetHeight;
	fSlider.options.onSlide = function(value) {
		Layer.style.top = -(value * fSlider.slider_gap) + 'px';
	}
}
function GetNearByMarkers(lat, lng){	
	var nearByMarks1 = [];
	for(i=0; i<wanted_markers.length; i++) {
		if(trim(document.getElementById('searched_address').value)!=''){
			if(CheckIsNearBy(lat, lng, wanted_markers[i].getPoint().y, wanted_markers[i].getPoint().x)) {
				nearByMarks1.push(wanted_markers[i]);
			} 
		} else{
			if(CheckIsInTown(wanted_markers[i].guid)){
				nearByMarks1.push(wanted_markers[i]);
			}
		}
	}	
	return nearByMarks1;
}

function CheckIsInTown(id){
	var searched_str = myPlacemarksInfo[id].content.toLowerCase();
	var search_str = document.getElementById('CitiesList').value.toLowerCase();
	if(searched_str.indexOf(search_str)!=-1){
		return true;
	}
	else return false;	
}

function CheckIsNearBy(lat1, lon1, lat2, lon2){
	
	var radlat1 = Math.PI * lat1/180;
	var radlat2 = Math.PI * lat2/180;
	var radlon1 = Math.PI * lon1/180;
	var radlon2 = Math.PI * lon2/180;
	var theta = lon1-lon2;
	var radtheta = Math.PI * theta/180;
	var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
	dist = Math.acos(dist);
	dist = dist * 180/Math.PI;
	dist = dist * 60 * 1.1515;
	dist = dist * 1.609344;
	if(dist<=1){
		return true;
	}
	else return false;
}

function GetMarkersInCurrentViewport(markers){
	if(!markers)
		markers = allMarkersArray
	var bounds = myMap.getBounds();
	var visibleMarks = [];
	for(i=0; i<markers.length; i++) {
		if(bounds.containsLatLng(markers[i].getPoint())) {
			visibleMarks.push(markers[i])
		} 
	}
	return visibleMarks;
}

function showHideMarkersSet(obj, set){

	if(obj.getMarkerCount(0) == 0){
		wanted_markers = allMarkersArray;
		obj.addMarkers(set, 0);
		obj.refresh();
		nearByMarks = GetMarkersInCurrentViewport();
	}else{
		wanted_markers = myMarkersArray;		
		obj.clearMarkers();
		nearByMarks = GetMarkersInCurrentViewport(myMarkersArray);
	}
	FillSideList(nearByMarks);
	FillCountriesSelect();
};

function getPointCoords(item){
	point_coords = item.getElementsByTagName('georss')[0];
	if(!point_coords || point_coords == null){
		point_coords = item.getElementsByTagName('georss:point')[0];
	}
	if(!point_coords || point_coords == null){
		point_coords = item.getElementsByTagName('point')[0];
	}
	if(!point_coords || point_coords == null){
		point_coords = item.getElementsByTagNameNS('http://www.georss.org/georss', 'point')[0];
	}
	return point_coords
}
