function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function getWindowHeight()
{
	var wheight=(window.innerHeight)?window.innerHeight:
    	((document.all)?document.body.offsetHeight:null); 
	return wheight;
}


var ajax_sep = '~!~';
var ajax_address = '/ajax.php';

var mainMap;
var iconsDic = new Object();

var curMarker;

var autoPopupObjectId;
var markers = new Array();

function AjaxRequest()
{
	this.requestHandler = function()
	{
	};
	
	this.doRequest = function(url)
	{
		  http_request = false;
		  if (window.XMLHttpRequest) { // Mozilla, Safari,...
			 http_request = new XMLHttpRequest();
			 if (http_request.overrideMimeType) {
				// set type accordingly to anticipated content type
				//http_request.overrideMimeType('text/xml');
				http_request.overrideMimeType('text/html');
			 }
		  } else if (window.ActiveXObject) { // IE
			 try {
				http_request = new ActiveXObject("Msxml2.XMLHTTP");
			 } catch (e) {
				try {
				   http_request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			 }
		  }
		  if (!http_request) {
			 alert('Cannot create XMLHTTP instance');
			 return false;
		  }
		  http_request.onreadystatechange = this.requestHandler;
		  http_request.open('GET', url, true);
		  http_request.send(null);
	};
}

function initMainMap(el, hideObjects)
{
	if (el && GBrowserIsCompatible())
	{
		el.style.height = getWindowHeight() + 'px';
		mainMap = new GMap2(el);
		mainMap.enableGoogleBar();
			
		//mainMap.setCenter(new GLatLng(55, 37), 6);
		
		if (!hideObjects)
		{
			GEvent.addListener(mainMap, "zoomend", function() { clearMarkers(mainMap); loadObjects(this, this.cityId); });
			GEvent.addListener(mainMap, "moveend", function() { loadObjects(this, this.cityId); });
			GEvent.addListener(mainMap, "dragend", function() { autoPopupObjectId = undefined; });
		}

		mainMap.setUIToDefault();
		
		//loadObjects(mainMap, document.getElementById('city').value);
	}
}

function showAddress(map, address, zoom, doLoadObjects, showStartInfoWindow)
{
	var gc = new GClientGeocoder();
	
	gc.getLatLng(address, function(point) {
		if (!point)
			alert("Адрес не найден");
		else
		{
			if (!zoom)
				map.setCenter(point, 13);
			else
				map.setCenter(point, zoom);
			if (doLoadObjects)
			{
				loadObjects(map, map.cityId, showStartInfoWindow);
			}
		}
	});
}

function loadNearObjectsTable(tableid, lat, lng)
{
	//alert(tableid + ' ' + lat + ' ' + lng);
	var el = document.getElementById(tableid);
	if (!el)
		return;
	var tbody = el.getElementsByTagName("tbody")[0];
	var trs = tbody.getElementsByTagName("tr");
	for (var i = trs.length - 1; i >= 0; i--)
		tbody.removeChild(trs[i]);

	var req = new AjaxRequest();
	req.requestHandler = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{
				result = http_request.responseText;
				var vals = result.split(ajax_sep);
				for (var i = 0; i < vals.length - 3; i += 3)
				{
					var tr = document.createElement("tr");
					var tdName = document.createElement("td");
					tdName.innerHTML = '<a href="object.php?id=' + vals[i] + '">' + vals[i+1] + '</a>';
					var tdAddress = document.createElement("td");
					tdAddress.innerHTML = vals[i+2];
					tbody.appendChild(tr);
					tr.appendChild(tdName);
					tr.appendChild(tdAddress);
				}
			} else 
			{
				//alert('There was a problem with the request.');
			}
		}
	};
	
	var p = new GLatLng(lat, lng);
	req.doRequest(ajax_address + '?action=loadNearObjects&lat=' + lat + '&lng=' + lng + '&mpd_x=' + p.distanceFrom(new GLatLng(lat + 1, lng)) +
		'&mpd_y=' + p.distanceFrom(new GLatLng(lat, lng + 1)));
}

function loadObjectsTableByUser(tbl, userId)
{
	var req = new AjaxRequest();
	
	var tbody = tbl.getElementsByTagName("tbody")[0];
	var trs = tbody.getElementsByTagName("tr");
	for (var i = trs.length - 1; i > 0; i--)
		tbody.removeChild(trs[i]);
	
	req.requestHandler = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{
				result = http_request.responseText;
				var vals = result.split(ajax_sep);
				for (var i = 0; i < vals.length - 3; i += 3)
				{
					var tr = document.createElement("tr");
					var tdName = document.createElement("td");
					tdName.innerHTML = '<a href="index.php?objectId=' + vals[i] + '">' + vals[i+1] + '</a>';
					var tdAddress = document.createElement("td");
					tdAddress.innerHTML = vals[i+2];
					tbody.appendChild(tr);
					tr.appendChild(tdName);
					tr.appendChild(tdAddress);
				}
			} else 
			{
				//alert('There was a problem with the request.');
			}
		}
	};
	
	req.doRequest(ajax_address + '?action=loadObjectsByUser&userId=' + userId);
}

function loadCatNums(cityId)
{
	
	var req = new AjaxRequest();
	req.requestHandler = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{
				result = http_request.responseText;
				//alert(result);
				
				var els = document.getElementById('cat_list_td').getElementsByTagName('span');
				for (var i = 0; i < els.length; i++)
				{
					if (els[i].id.indexOf('cat_num_') == 0)
						els[i].innerHTML = '0';
				}
				
				var vals = result.split(ajax_sep);
				for (var i = 0; i < vals.length - 2; i += 2)
				{
					var el = document.getElementById('cat_num_' + vals[i]);
					if (el)
					{
						el.innerHTML = vals[i+1].toString();
					}
				}
			}
		}
	}
	
	req.doRequest(ajax_address + '?action=getCatNums&cityId=' + cityId);
}

function showObjectPhoto(n)
{
	var el;
	for (var i = 0; i < 3; i++)
	{
		el = document.getElementById('objectPhoto' + i);
		if (el)
		{
			if (i == n)
				el.style.display = 'block';
			else
				el.style.display = 'none';
		}
	}
}

function loadObjectPhotos(id, target)
{
	var req = new AjaxRequest();
	req.requestHandler = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{
				result = http_request.responseText;
				
				var urls = result.split(';');
				
				var el = document.getElementById(target);
				
				if (el)
				{
					var html = '';
					if (urls.length == 1)
						html = '<img alt="" src="' + urls[0] + '" width="' + (el.offsetWidth) + '" />';
					else
					{
						html = '<img id="objectPhoto0" alt="" src="' + urls[0] + '" width="' + (el.offsetWidth) + '" />';
						for (var i = 1; i < urls.length; i++)
							html += '<img id="objectPhoto' + i + '" alt="" src="' + urls[i] + '" width="' + (el.offsetWidth) + '" style="display: none;" />';
						html += '<div style="position: relative; background: #CCC; text-align: right;">';
						for (var i = 0; i < urls.length; i++)
							html += '<a href="#" onclick="showObjectPhoto(' + i + '); return false;">' + (i+1) + '</a> ';
						html += '</div>';
					}
						
					el.innerHTML = html;
				}
			}
		}
	}
	req.doRequest(ajax_address + '?action=loadObjectPhotos&objectId=' + id);
}

function clearMarkers(map)
{
	for (var i = 0; i < markers.length; i++)
		map.removeOverlay(markers[i]);
	while (markers.length > 0)
		markers.pop();
}

function loadObjects(map, cityId, showStartInfoWindow)
{
	var req = new AjaxRequest();
	req.requestHandler = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{
				result = http_request.responseText;
//				alert(result);
				//map.clearOverlays();
//				clearMarkers(map);
				
				var vals = result.split(ajax_sep);
				for (var i = 0; i < vals.length - 23; i += 23)
				{
					var id = vals[i];
					var fullname = vals[i+1];
					var desc = vals[i+2];
					var lat = vals[i+3];
					var lng = vals[i+4];
					var url = vals[i+5];
					var email = vals[i+6];
					var phone = vals[i+7];
					var addr = vals[i+8];
					var worktime = vals[i+9];
					var style = vals[i+10];
					var iconUrl = vals[i+11];
					var iconAnchorX = vals[i+12];
					var iconAnchorY = vals[i+13];
					var iconSizeX = vals[i+14];
					var iconSizeY = vals[i+15];
					var level = vals[i+16];
					var date = vals[i+17];
					var userId = vals[i+18];
					var userLogin = vals[i+19];
					var items = vals[i+20].toString();
					var catIcons = vals[i+21].split(';');
					var hasPhoto = parseInt(vals[i+22]);
					if (url != '' && url.indexOf('http') == -1)
						url = 'http://' + url;
						
					var add = true;
					for (var k = 0; k < markers.length; k++)
					{
						if (markers[k].objectId == id)
						{
							add = false;
							break;
						}
					}
					if (!add)
						continue;
					
					if (!iconsDic[iconUrl])
					{
						iconsDic[iconUrl] = new GIcon(G_DEFAULT_ICON);
						iconsDic[iconUrl].image = iconUrl;
						iconsDic[iconUrl].iconAnchor = new GPoint(iconAnchorX, iconAnchorY);
						iconsDic[iconUrl].iconSize = new GSize(iconSizeX, iconSizeY);
						iconsDic[iconUrl].shadow = '';
					}
					
					var m = new GMarker(new GLatLng(lat, lng), {title: fullname, icon: iconsDic[iconUrl]});
					m.html = '<span style="font-weight: bold; font-size: 12pt;">' + fullname + 
						'</span><table><tr><td valign="top"><div id="divPhotos" ';
					
					if (hasPhoto == 1)
						m.html += 'style="width: 200px; height: 300px; border: none;"';
					m.html += '></div><b>' + level + ':</b>';
					
					if (items.substr(0, 1) == '1')
						m.html += '<br/>Ступени: 1-2';
					if (items.substr(1, 1) == '1')
						m.html += '<br/>Ширина дверей &gt; 0.8 м.';
					if (items.substr(2, 1) == '1')
						m.html += '<br/>Въезд с земли';
					if (items.substr(3, 1) == '1')
						m.html += '<br/>Пандус &lt; 35&#176;';
					if (items.substr(4, 1) == '1')
						m.html += '<br/>Лифт';
					if (items.substr(5, 1) == '1')
						m.html += '<br/>Туалет оборудован';
					if (items.substr(6, 1) == '1')
						m.html += '<br/>Подъемник для коляски';
					if (items.substr(7, 1) == '1')
						m.html += '<br/>Верх кнопок &lt; 1.6 м.';
					if (items.substr(8, 1) == '1')
						m.html += '<br/>Доступна помощь персонала';
					if (items.substr(9, 1) == '1')
						m.html += '<br/>Место для пеленания';
					
					
					m.html += '</td><td valign="top">';
					for (var ci = 0; ci < catIcons.length; ci++)
						m.html += '<img align="left" alt="" src="' + catIcons[ci] + '" />';
					m.html += '<div style="clear:both"></div><p><b>Полное название:</b> ' + fullname + 
						'</p><p><b>Адрес:</b> ' + addr + '</p>';
					if (url != '')
						m.html += '<p><b>Сайт:</b> <a target="_blank" href="' + url + '">' + url + '</a></p>';
					if (phone != '')
						m.html += '<p><b>Телефон:</b> ' + phone + '</p>';
					if (worktime != '')
						m.html += '<p><b>Часы работы:</b> ' + worktime + '</p>';
					if (desc != '')
						m.html += '<p><b>Комментарии:</b> ' + desc + '</p>';
					
					m.html += '<p><b>Объект добавлен:</b> ' + date + ',<br/>добавил: <a href="/profile.php?id=' + userId + '">' + userLogin + '</a></p>';
					
					m.html += '</td></tr></table>';
					//m.html += '<a href="object.php?id=' + id + '">Подробнее...</a>';
					//alert(m.html);
					m.objectId = parseInt(id);
					GEvent.addListener(m, "click", function() {
						GEvent.addListener(mainMap, "infowindowopen", function() {
							GEvent.clearListeners(mainMap, "infowindowopen");
							loadObjectPhotos(autoPopupObjectId, 'divPhotos');
						});
						autoPopupObjectId=this.objectId;
						this.openInfoWindowHtml(this.html); 
					});
					
					markers.push(m);
					map.addOverlay(m);
					
					if (map.getInfoWindow().isHidden() && id == autoPopupObjectId)
					{
						GEvent.addListener(mainMap, "infowindowopen", function() {
							GEvent.clearListeners(mainMap, "infowindowopen");
							loadObjectPhotos(autoPopupObjectId, 'divPhotos');
						});
						m.openInfoWindowHtml(m.html);
					}
				}

				if (curMarker)
					map.addOverlay(curMarker);
				
				if (showStartInfoWindow)
				{
					GEvent.clearListeners(map, "moveend");
					map.openInfoWindowHtml(map.getCenter(), '<p style="font-size:12pt">Добро пожаловать!</p><p>На этой карте собраны и классифицированы места в городе, куда можно попасть с инвалидной и детской коляской.</p><p>Для того, чтобы <b>найти доступные объекты</b>, выберите в меню слева нужную категорию и приблизьте район города, который Вас интересует.</p><p>Пожалуйста, когда будете передвигаться по городу, <b>записывайте места</b>, которых на карте пока еще нет, <b>и вносите их в карту</b>, это очень просто!</p><p>Если Вы хотите <b>создать карту своего города</b>, напишите на <a href="mailto:time2be@barierovnet.org">time2be@barierovnet.org</a></p><p><b>Заранее благодарим!</b></p>', {maxWidth: 500});
					GEvent.addListener(map, "infowindowclose", function() {
						GEvent.clearListeners(map, "infowindowclose");
						GEvent.addListener(map, "moveend", function() { loadObjects(this, this.cityId); });
					});
				}

				if (document.getElementById('objectsDiv'))
					loadObjectsList(0);
			} else 
			{
				//alert('There was a problem with the request.');
			}
		}
	};
	
	var b = map.getBounds();
	var sz = map.getSize();
	var req_str = ajax_address + '?action=loadObjects&latmin=' + b.getSouthWest().lat() + '&latmax=' + b.getNorthEast().lat() + '&lngmin=' + b.getSouthWest().lng() + '&lngmax=' + b.getNorthEast().lng() + '&cityId=' + cityId + '&width=' + sz.width + '&height=' + sz.height;
	var cf = document.getElementById('cat_filter');
	if (cf)
		req_str += '&cats=' + cf.value.replace(/(^\s+)|(\s+$)/g,'').split(' ').join(',');
	if (autoPopupObjectId)
		req_str += '&reqObjectId=' + autoPopupObjectId;
	req.doRequest(req_str);
}

function createCurMarker(point)
{
	curMarker = new GMarker(point, {draggable: true});
	GEvent.addListener(curMarker, "dragend", function() {
		document.getElementById('latitude').value = this.getPoint().lat();
		document.getElementById('longitude').value = this.getPoint().lng();
	});
	mainMap.addOverlay(curMarker);
}

function searchObjects(text)
{
	var req = new AjaxRequest();
	req.requestHandler = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{
				result = http_request.responseText;
				//alert(result);
				var div = document.getElementById('divSearchResults');
				var vals = result.split(ajax_sep);
				var html = '<b>Найдено объектов: ' + ((vals.length - 1) / 5) + '</b><br/><div style="overflow: auto; height: 200px; max-width: 450px;"><ul style="list=style-type: none;">';
				
				for (var i = 0; i < vals.length - 5; i += 5)
				{
					html += '<li><a href="javascript:mainMap.getInfoWindow().hide();autoPopupObjectId=' + vals[i] +';mainMap.setCenter(new GLatLng(' + vals[i+3] +
						',' + vals[i+4] + '), 16);">' + vals[i+1] + '</a><br/>' + vals[i+2] + '</li>';
				}
				
				html += '</ul></div>';
				
				div.innerHTML = html;
			} else 
			{
				//alert('There was a problem with the request.');
			}
		}
	};
	
	var req_str = ajax_address + '?action=search&text=' + encodeURIComponent(text) + '&cityId=' + mainMap.cityId;
	req.doRequest(req_str);
}

function loadObjectsList(p)
{
	if (!p)
		p = 0;
	var req = new AjaxRequest();
	req.requestHandler = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{
				result = http_request.responseText;
				//alert(result);
				var vals = result.split(ajax_sep);
				
				if (parseInt(vals[0]) > 1)
				{
					var pager_html = '';
					for (var i = 0; i < parseInt(vals[0]); i++)
						pager_html += '<a href="#" onclick="loadObjectsList(' + i + '); return false;">' + (i + 1) + '</a> ';
					document.getElementById('objectsPager').innerHTML = pager_html;
				} else
					document.getElementById('objectsPager').innerHTML = '';
				
				var ul_html = '';
				for (var i = 1; i < vals.length; i += 5)
				{
					ul_html += '<li><a href="javascript:mainMap.getInfoWindow().hide();autoPopupObjectId=' + vals[i] + '; mainMap.setCenter(new GLatLng(' + vals[i+3] + ',' + vals[i+4] + '), 16);">' + vals[i+1] +
						'</a><br/>' + vals[i+2] + '</li>';
				}
				//alert(vals.length);
				document.getElementById('objectsList').innerHTML = ul_html;
				
				loadCatNums(mainMap.cityId);
			} else 
			{
				//alert('There was a problem with the request.');
			}
		}
	};

	var b = mainMap.getBounds();
	var req_str = ajax_address + '?action=loadObjectsPage&latmin=' + b.getSouthWest().lat() + '&latmax=' + b.getNorthEast().lat() + '&lngmin=' + b.getSouthWest().lng() + '&lngmax=' + b.getNorthEast().lng() + '&cityId=' + mainMap.cityId + '&page=' + p;
	var cf = document.getElementById('cat_filter');
	if (cf)
		req_str += '&cats=' + cf.value.replace(/(^\s+)|(\s+$)/g,'').split(' ').join(',');
	req.doRequest(req_str);
}