//----------- аякс для обновления карты ------------
test = '';
function mapRefresh(){
	sendXMLh2(onMapAllIds, "act=all");
	//alert('send refresh');
	//document.title = 'refresh';
	test='begin';
}

function sendXMLh(handler, param){
	XMLh = null;
	if (typeof XMLHttpRequest != "undefined"){
		XMLh = new XMLHttpRequest();
	}else if (window.ActiveXObject){
		var aVersions = [ "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp","Microsoft.XMLHttp" ];
		for (var i = 0; i < aVersions.length; i++){
			try {
				XMLh = new ActiveXObject(aVersions[i]);
			} catch (oError) { }
		}
	}else throw new Error("XMLHttp object could be created.");
	if( !XMLh ) return false;
	XMLh.onreadystatechange = handler;
	XMLh.open('POST', 'http://maps.atv-zone.ru/map_refresh.php', true);
	XMLh.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	if(myLocId > 0)
		if(param.length > 0){
			param = param + "&my_id=" + myLocId;
		}else{
			param = "my_id=" + myLocId;
		}
	XMLh.send(param);
	return true;
}
function sendXMLh2(handler, param){
	XMLh2 = null;
	if (typeof XMLHttpRequest != "undefined"){
		XMLh2 = new XMLHttpRequest();
	}else if (window.ActiveXObject){
		var aVersions = [ "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp","Microsoft.XMLHttp" ];
		for (var i = 0; i < aVersions.length; i++){
			try {
				XMLh2 = new ActiveXObject(aVersions[i]);
			} catch (oError) { }
		}
	}else throw new Error("XMLHttp object could be created.");
	if( !XMLh2 ) return false;
	XMLh2.onreadystatechange = handler;
	XMLh2.open('POST', 'http://maps.atv-zone.ru/map_refresh.php', true);
	XMLh2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	if(myLocId > 0)
		if(param.length > 0){
			param = param + "&my_id=" + myLocId;
		}else{
			param = "my_id=" + myLocId;
		}
	if(param.length > 0){
		param += "&isadmin="+ isAdmin;
	}else{
		param += "isadmin="+ isAdmin;
	}
	//alert(param);
	XMLh2.send(param);
	return true;
}

//-------------- обработчики принятия данных обновления карты ----------
err_msg = 'error';
empty_msg = 'empty';
ok_msg = 'ok';

iii = 0;
function endRefresh(flag){	tpause = 30000;	if(!flag) alert('Ошибка при обновлении данных карты. Повторная попытка через '+ tpause/1000 +' секунд.' + test);
	setTimeout(mapRefresh, tpause);
	iii++;
	//document.title = test+ iii;
}

function onMapAllIds(){
	if(XMLh2.readyState == 4){		test = 'all';
		var txt = new String(XMLh2.responseText);
		if(txt == err_msg){
            endRefresh(false);
			return;
		}
		if(txt != empty_msg){
			var arr = txt.split(',');
			var i=0;
			//alert(myLocId); alert(arr);
			if(myLocId > 0){
				var delMyLoc = true;
				for(i=0; i<arr.length; i++){					if( arr[i] == myLocId ){						delMyLoc = false;
						arr[i] = 0;
						break;					}
				}//for
				if(delMyLoc){
					myLocId = 0;
					map.removeOverlay(myLoc);
					myLoc = null;
					document.getElementById('but_myloc').value = "Показать себя на карте";
					alert('Вы были удалены с карты администратором.');
				}
			}
			var res = a.compareIds(arr);
			var inf = null;
			for(i=0; i<res.dels.length; i++){				inf = a.delOfId(res.dels[i]);
				if( adm.isShop(inf.key1) ) adm.delShop(inf.skey);
				else if( adm.isRoad(inf.key1) ) adm.delRoad(inf.skey);
				else if( adm.isUser(inf.key1) ) adm.delUser(inf.skey);
			}
			if(res.dels.length>0) adm.draw();
			if(res.news.length > 0){
				sendXMLh2(onMapNews, "act=news&ids="+ res.news.join(',') );
			}else{				sendXMLh2(onMapAfter, "act=aft&date="+ myTimeRefresh);
			}
			res = null;
		}else{
			if(myLocId > 0){
				myLocId = 0;
				map.removeOverlay(myLoc);
				myLoc = null;
				document.getElementById('but_myloc').value = "Показать себя на карте";
				alert('Вы были удалены с карты администратором.');
			}
			var arr = new Array();			var res = a.compareIds(arr);
			var inf = null;
			for(i=0; i<res.dels.length; i++){
				inf = a.delOfId(res.dels[i]);
				if( adm.isShop(inf.key1) ) adm.delShop(inf.skey);
				else if( adm.isRoad(inf.key1) ) adm.delRoad(inf.skey);
				else if( adm.isUser(inf.key1) ) adm.delUser(inf.skey);
			}
			if(res.dels.length>0) adm.draw();
            endRefresh(true);
		}
	}
}

function onMapNews(){
	if(XMLh2.readyState == 4){
		test = 'news';
		var txt = new String(XMLh2.responseText);
		//alert(txt);
		if( txt == err_msg || txt.length == 0){            endRefresh(false);
			return;
		}
		if( txt != empty_msg ){
			var arr = txt.split("^");
			var val = null;
			var fledit = false;
			var ids = new Array();
			for(var i=0; i<arr.length; i++){
				val = arr[i].match(/([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9\.]+),([0-9\.]+),([-0-9]+),(.*)/i);
				if(val != null){
					if(showUserId==val[2] && val[3]==0) flShowUserId = true;					a.add(val[3], val[4], val[5], val[6], val[1], val[8]);
					ids[ids.length] = val[1];
					if(isAdmin==1 || (myUserId > 0 && myUserId==val[2]) ) fledit=true;
					else fledit=false;
					if( adm.isShop(val[3]) ) adm.addShop(val[1], dbkeys[ val[3] ][ val[4] ], val[8], val[7], fledit );
					else if( adm.isRoad(val[3]) ) adm.addRoad(val[1], dbkeys[ val[3] ][ val[4] ], val[8], val[7], fledit );
					else if( adm.isUser(val[3]) ) adm.addUser(val[1], dbkeys[ val[3] ][ val[4] ], val[8], val[7], fledit );
				}
			}
			if(arr.length>0) adm.draw();
			sendXMLh2(onMapAfter, "act=aft&date="+ myTimeRefresh +"&ids="+ ids.join(',') );
		}else endRefresh(true);
	}
}

function onMapAfter(){
	if(XMLh2.readyState == 4){
		test = 'aft';
		var txt = new String(XMLh2.responseText);
		if( txt == err_msg || txt.length == 0){
            endRefresh(false);
			return;
		}
		if( txt != empty_msg ){			var arr = txt.split("^");
			if(arr[0].search(/^[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}:[0-9]{2}:[0-9]{2}$/) == 0){				myTimeRefresh = arr[0];
			}else{
	            endRefresh(false);
				return;
			}
			var val = null;
			for(var i=1; i<arr.length; i++){
				val = arr[i].match(/([0-9]+),([0-9\.]+),([0-9\.]+),([0-9]+),(.*)/i);
				if(val != null){
					a.moveOfId(val[1], val[2], val[3]);
					a.setInfaOfId(val[1], val[5]);
				}
			}
		}
		endRefresh(true);
	}
}

//общее для маркеров

function onMarkerDel(){
	if(XMLh.readyState == 4){
		if( XMLh.responseText == ok_msg ){
			var inf = a.delOfId( semafor.id );
			if( adm.isShop(inf.key1) ) adm.delShop(inf.skey);
			else if( adm.isRoad(inf.key1) ) adm.delRoad(inf.skey);
			else if( adm.isUser(inf.key1) ) adm.delUser(inf.skey);
			adm.draw();
		}else{ alert('Не удалось удалить маркер.'); }
		semafor.end();
	}
}

function onApproved(){	if(XMLh.readyState == 4){		if( XMLh.responseText == ok_msg ){			adm.approve(semafor.key1, semafor.key2);
			adm.draw();			alert('Маркер разрешен к показу.');
		}else{ alert('Не удалось авторизовать маркер.'); }
		semafor.end();
	}
}

//------------------------ myLoc --------
function delMyLoc(){
	map.removeOverlay(myLoc);
	myLoc = null;
	if(myLocId != 0){
		sendXMLh(onMyLocDel, "act=del&id="+ myLocId);
		myLocId = 0;
	}
}

function addMapMyLoc(x, y, infa, flDrag){
	var icon = new GIcon();
	icon.image = "images/mapicon/my.gif";
	icon.shadow = "images/mapicon/my.gif";
	icon.iconSize = new GSize(40, 26);
	icon.shadowSize = new GSize(40, 26);
	icon.iconAnchor = new GPoint(20, 13);
	icon.infoWindowAnchor = new GPoint(20, 13);
	var opts = {
		"icon": icon,
		"draggable": true
    }
	myLoc = new GMarker(new GLatLng(y, x), opts);
	myLoc.bindInfoWindowHtml(infa);
	myInfa = infa;
	map.addOverlay(myLoc);
	if(flDrag) myLoc.enableDragging();
	GEvent.addListener(myLoc, "dragend", function(){
		var l = myLoc.getLatLng();
		sendXMLh(onMyLocDrag, "act=move&id="+ myLocId +"&x="+ l.lng() +"&y="+ l.lat() );
	});
}

function onMyLocAdd(){
	if(XMLh.readyState == 4){
		var txt = XMLh.responseText;
		if(txt != err_msg){
			myLocId = txt;
			myLoc.enableDragging();
		}else{
			delMyLoc();
			document.getElementById('but_myloc').value = "Показать себя на карте";
			alert('Ошибка, не удалось добавить вас на карту.');
		}
		semafor.end();
	    editMyLoc();
	}
}
function onMyLocDel(){}
function onMyLocDrag(){}

function onMyLocUpd(){
	if(XMLh.readyState == 4){
		var txt = XMLh.responseText;
		if(txt != err_msg){			alert('Изменения внесены успешно');
			myInfa = semafor.infa;
			myLoc.bindInfoWindowHtml(myInfa);
		}else{
			alert('Ошибка, не удалось внести изменения.');
		}
		semafor.end();
	    editMyLoc();
	}
}

//-------------- пользователи ------------------
function onUserUpd(){	if(XMLh.readyState == 4){
		var txt = XMLh.responseText;
		if(txt != err_msg){
			var ret = a.setInfaOfId(semafor.id, semafor.infa);
			adm.updUser(semafor.id, dbkeys[ret.key1][ret.key2], semafor.infa, ret.skey);
			adm.draw();
		}else{
			alert('Ошибка, не удалось внести изменения.');
		}
		semafor.end();
	}
}

//-------------- магазины ----------------------
function onShopAdd(){	if(XMLh.readyState == 4){
		var txt = XMLh.responseText;
		if(txt != err_msg){
			a.add(semafor.key1, semafor.key2, semafor.x, semafor.y, txt, semafor.infa);
			var fledit;
			adm.addShop(txt, dbkeys[ semafor.key1 ][ semafor.key2 ],  semafor.infa, 0, true );
			adm.draw();
		}else{
	       	document.getElementById('but_shops').value = "Добавить магазин на карту";
			alert('Ошибка, не удалось добавить магазин на карту.');
		}
		semafor.end();
	}}

function onShopUpd(){
	if(XMLh.readyState == 4){
		var txt = XMLh.responseText;
		if(txt != err_msg){
			var ret = a.setInfaOfId(semafor.id, semafor.infa);
			adm.updShop(semafor.id, dbkeys[ret.key1][ret.key2], semafor.infa, ret.skey);
			adm.draw();
		}else{
			alert('Ошибка, не удалось внести изменения.');
		}
		semafor.end();
	}
}

//----------- места где покататься -------------
function onRoadAdd(){	if(XMLh.readyState == 4){
		var txt = XMLh.responseText;
		if(txt != err_msg){
			a.add(semafor.key1, semafor.key2, semafor.x, semafor.y, txt, semafor.infa);
			adm.addRoad(txt, dbkeys[ semafor.key1 ][ semafor.key2 ], semafor.infa, 1, true );
			adm.draw();
		}else{
	       	document.getElementById('but_shops').value = "Добавить на карту место где покататься";
			alert('Ошибка, не удалось добавить на карту место где покататься.');
		}
		semafor.end();
	}
}
function onRoadUpd(){	if(XMLh.readyState == 4){
		var txt = XMLh.responseText;
		if(txt != err_msg){			var ret = a.setInfaOfId(semafor.id, semafor.infa);
			adm.updRoad(semafor.id, dbkeys[ret.key1][ret.key2], semafor.infa, ret.skey);
			adm.draw();
		}else{
			alert('Ошибка, не удалось внести изменения.');
		}
		semafor.end();
	}}

