
function GMapObjectProperties(ID, latitude, longitude, name, description) {
	this.latitude = latitude;
	this.longitude = longitude;
	this.ID = ID;
	this.name = name;
	this.description = description;
	this.clearText;
	this.PORT = null;
	this.RAIL_TERMINAL=null;
	this.ROAD_TERMINAL=null;
	this.AIRPORT=null;
	this.POSTAL_EXCHANGE=null;
	this.ICD=null;
	this.FTF=null;
	this.region = null;
	this.country = null;
	var __this = this;
	var __oldObject = null;
	
	this.toString = function () {
		
		return "ID - " + __this.ID + "; name - " + __this.name + "; descr - " + __this.description + ";\ntatitude - " + __this.latitude + "; longitude - " + __this.longitude + "\n" + 
				"PORT - " + __this.PORT + "; RAIL_TERMINAL - " + __this.RAIL_TERMINAL + "; ROAD_TERMINAL - " + __this.ROAD_TERMINAL + ";\n" + 
				"AIRPORT - " + __this.AIRPORT + "; POSTAL_EXCHANGE - " + __this.POSTAL_EXCHANGE + "; ICD - " + __this.ICD + "; FTF - " + __this.FTF + ";\n" + 
				"COUTNRY - " + __this.country + "; REGION - " + __this.region;
	}
	
	this.getValueByCode = function (code ) {
		
		switch(code) {
			case "PORT" : return __this.PORT;
			case "RAIL_TERMINAL" : return __this.RAIL_TERMINAL;
			case "ROAD_TERMINAL" : return __this.ROAD_TERMINAL;
			case "AIRPORT" : return __this.AIRPORT;
			case "ICD" : return __this.ICD;
			case "FTF" : return __this.FTF;
			case "POSTAL_EXCHANGE" : return __this.POSTAL_EXCHANGE;
		}
		
		return null;
	}
}

function GMapObject() {
	var map;
	var __ELEMENTS;
	var EDIT_MODE = false;
	var descrMaxLength = 120;
	var __this = this;
	var marker = null;
	var __currentObject = null;
	var __editingObject = null;
	
	var __descrObjects = [
	{	PORT :            {IMAGE : "port.gif",             VALUE : "Порт"}, 
		RAIL_TERMINAL :   {IMAGE : "railway_terminal.gif", VALUE : "Железнодорожный терминал"}, 
		ROAD_TERMINAL :   {IMAGE : "road_terminal.gif",    VALUE : "Автомобильный терминал"}, 
		AIRPORT :         {IMAGE : "avia.gif",             VALUE : "Аэропорт"}, 
		ICD :             {IMAGE : "warehouse.gif",        VALUE : "Внутренние таможенные склады"}, 
		FTF :             {IMAGE : "ftf.gif",              VALUE : "Фиксированные транспортные функции"}, 
		POSTAL_EXCHANGE : {IMAGE : "exchange.gif",         VALUE : "Почтовый обмен валюты"} 
	}];
	
	this.getCurrentObject = function () {
		return __currentObject;
	}
	this.getObject = function () {
		return EDIT_MODE ? __editingObject : __currentObject;
	}

	this.getCurrentEditingObject = function () {
		return __editingObject;
	}
	
	this.initializeGMapObject = function(_object) {
		__ELEMENTS = new Array();
		var objects = document.getElementById("object");
		
		for(var i = 0; i < objects.options.length; i++) {
			//alert(document.getElementById("object").options[i].value);
			if(document.getElementById("object").options[i].text)
				__ELEMENTS[i] = {ID : objects.options[i].value, NAME : objects.options[i].text, DESCR : "", LANTITUDE : "", LOGITUDE : ""};
	
		}
			
	  if (GBrowserIsCompatible()) {
	    map = new GMap2(document.getElementById("map_canvas"));
		
		map.enableScrollWheelZoom();
	    map.addControl(new GOverviewMapControl());
	    map.addControl(new GMapTypeControl());
	    map.addControl(new GLargeMapControl())
	    
	    map.setCenter(new GLatLng(55.25, 37.52), 10);
	    
	    map.addMapType(G_PHYSICAL_MAP);
		
	    //alert(__object);
	    
	    if(_object.latitude && _object.longitude && _object.name) {
	    	showObject(_object);
	    }
	  }
	}

	function showObject(_object) {
		
		__currentObject = _object;
		__editingObject = __currentObject;
		//alert(__object);
		var __node = makeInfoNode(_object);
		/*-------*/
		var coord = new GLatLng(_object.latitude, _object.longitude);
		map.openInfoWindow(coord, __node);
	   	
	    map.setCenter(coord);	
	    
	    /*-------*/
	    if(EDIT_MODE) {
	    	addControlMarker(_object, coord);
	    	setCurrentCoords(_object.latitude, _object.longitude);
	    }
	}
	this.hideInfoWindow = function() {
		map.closeInfoWindow();
		if(marker != null)
	    	map.removeOverlay(marker);		
	}
	
	function makeInfoNode(__object) {
		
		var __node = document.createElement("div"), __objectDescr = document.createElement("div"), __descr = document.createElement("div");
		__descr.setAttribute("style", "overflow:hidden; padding-top:3px;color:black");
		
		__objectDescr.innerHTML = ("<b style=\"color:black\">" + __object.name + "</b>&nbsp;<span style=\"font-size:9px;color:black;\">Широта: " + __roundValue(__object.latitude) + "&deg; " + (__object.latitude >= 0 ? "С" : "Ю") + " Долгота: " + __roundValue(__object.longitude) + "&deg; "  + (__object.longitude >= 0 ? "З" : "В") + "</span>");

		if(__object.clearText)
			__descr.innerHTML += "<span style=\"color:black;\">" + (__object.clearText.length > descrMaxLength ? __object.clearText.substring(0, descrMaxLength) + "..." : __object.clearText) + "</span>";
		
		__node.appendChild(__objectDescr);
		__node.appendChild(__descr);
		
		__node.innerHTML += getAdditionalParameters(__object);
	
		return __node;
	}


	function getAdditionalParameters(__object) {
		
		var str = "<div style=\"margin-top:10px;float:left;\">";
		
		var keys = new Array("PORT", "RAIL_TERMINAL", "ROAD_TERMINAL", "AIRPORT", "ICD", "FTF", "POSTAL_EXCHANGE");
		var divEnable = "<div style=\"text-align:center; border-bottom:1px solid gray; border-right:1px solid gray; border-top:1px solid #dddddd; border-left:1px solid #dddddd; padding-top:5px; height:27px; width:27px; float:left;;margin-right:3px;\">";
		var divDisable = "<div style=\"text-align:center; padding-top:5px; border-top:1px solid gray; border-left:1px solid gray; border-bottom:1px solid #dddddd; border-right:1px solid #dddddd; height:27px; width:27px; float:left;margin-right:3px;\">";
		for(var i in keys) {
			//alert(keys[i]);
			//try {
				if(__object.getValueByCode(keys[i]) > 0)	
					str +=  divEnable + "<img src=\"/images/map/" + __descrObjects[0][keys[i]].IMAGE + "\" title=\""+ __descrObjects[0][keys[i]].VALUE +"\" /></div>";
				else
					str +=  divDisable + "<img src=\"/images/map/disabled_" + __descrObjects[0][keys[i]].IMAGE + "\" title=\""+ __descrObjects[0][keys[i]].VALUE +"\" /></div>";
			//} catch (e){alert(keys[i]);}
		}
		
		str += "</div>";
		
		if(EDIT_MODE) {
			str += "<div style=\"float:left; margin-left:10px;margin-top:10px;\">";
			str += divEnable + "<a href=\"javascript:void(0)\" title=\"Сохранить\" onclick=\"adminTools.showDialogWindow('editObjectDialog', __map.getCurrentEditingObject()); return false;\"><img src=\"/img/maps/save.gif\"></a></div>";
			if(__object.ID > 0)
				str += divEnable + "<a href=\"javascript:void(0)\" onclick=\"adminTools.removeObject(__map.getCurrentEditingObject().ID); return false;\" title=\"Удалить\"><img src=\"/img/maps/delete.gif\"></a></div>";
			str += "</div>";
		}
		if(__object.ID > 0) {
			str += "<div style=\"clear:left; margin-top:20px; text-align:right;\" onclick=\"__map.showDialogWindow('editObjectDialog', __map.getObject())\">";
				str += "<a href=\"javascript:void(0);\" onclick=\"__map.showDialogWindow('editObjectDialog', __map.getObject())\" style=\"color:#3c8ac3; text-decoration:underline;font-size:10px;\">подробнее</a>";
			str += "</div>";
		}
		
		return str;
	}

	this.reverseEditMode = function() {
		EDIT_MODE = !EDIT_MODE;
	
		if(!EDIT_MODE) {
			if(marker != null) {
	    		map.removeOverlay(marker);
			}
		} else {
			__oldObject = __currentObject;
		}
		
		document.getElementById("editModeButton").setAttribute("title", EDIT_MODE ? "Выйти из режима редактирования" : "Установить режим редактирования");
		document.getElementById("editModeImage").setAttribute("src", EDIT_MODE ? "/img/maps/menu.gif" : "/img/maps/menu_disabled.gif");
		document.getElementById("adminToolBar").style.display = !EDIT_MODE ? "none" : "";
		document.getElementById("editModeSpan").innerHTML =  EDIT_MODE ? "Выйти из режима редактирования" : "Установить режим редактирования";
		
		if(!EDIT_MODE) {
			if(__oldObject != null)
				showObject(__oldObject);
			else if(__currentObject != null)
				showObject(__currentObject);
		}
		
		if(__currentObject != null && __currentObject.ID > 0) {
			showObject(__currentObject);
		}
			
		if(EDIT_MODE) { 
			
			setCurrentCoords(__currentObject.latitude, __currentObject.longitude);
		}
	}


	function setCurrentCoords(x, y) {
		document.getElementById("latitude").innerHTML = x;
		document.getElementById("longitude").innerHTML = y;
	}

	function reverseCoordsPanel() {
		document.getElementById("coords").style.display = document.getElementById("coords").style.display != "" ? "none" : ""
	}

	function addControlMarker(__object, coord) {
		if(marker != null)
	    	map.removeOverlay(marker);
	    marker = new GMarker(coord, { draggable:true });
	    map.addOverlay(marker);
	    	    
	    __editingObject = __object;
	    
	    marker.openInfoWindow(makeInfoNode(__object));
	    
	    GEvent.addListener(marker, "drag", function() {
			          var __point = marker.getPoint();
			          __editingObject.latitude = __point.y;
			          __editingObject.longitude = __point.x;
			          setCurrentCoords(__point.y, __point.x);
			        }
		);
	
	
	    GEvent.addListener(marker, "dragend", function() {		          
			          	__editingObject.latitude  = marker.getPoint().y;
			          	__editingObject.longitude =  marker.getPoint().x;
			          	var node = makeInfoNode(__editingObject);

			          marker.openInfoWindow(node);
			        }
		);
	
	}

	this.addNewPoint = function() {
		EDIT_MODE = true;
		
		var __object = new GMapObjectProperties(-1, map.getCenter().lat(), map.getCenter().lng(), "Новый объект", null);
		if(document.getElementById("country").options.selectedIndex >= 0) {
			__object.country = document.getElementById("country").options[document.getElementById("country").options.selectedIndex].value;
				if(document.getElementById("region").options.selectedIndex >= 0)
					__object.region = document.getElementById("region").options[document.getElementById("region").options.selectedIndex].value;
		}
		__editingObject = __object;
		showObject(__object);	
	}
	
	//  3400N 11809W = 34.00  ;  -118.09   - Los-Angeles
	//  5525N 03752E = 55.25  ;   37.52    - Domodedovo
	//  3411S 01826E = -34.11 ;   18.26    - simons town near cape town is south africa
	//  5308S 07056W = -53.08 ;  -70.56    - Punta Arenas in Chili
	//  
	//         N           +         
	//      W     E     -     +
	//         S           -
	
	/*--------*/

	function __roundValue(value) {
		value = Math.abs(value);
		var index = (value + "").indexOf(".");
		//index = index >= 0 ? index + 3 : value.length;
		return index >= 0 ? (value + "").substring(0, index + 3) : value;	
	}

	this.makeQuery = function(type) {
		var CID_obj = document.getElementById("country");
		var CID =  CID_obj.selectedIndex >= 0 ? CID_obj.options[ CID_obj.selectedIndex ].value : "-1";
	
		var RID_obj = document.getElementById("region");	
		var RID = RID_obj.selectedIndex >= 0 ? RID_obj.options[ RID_obj.selectedIndex ].value : "-1";
		
		var EID_obj = document.getElementById("object");
		var EID = EID_obj.selectedIndex >= 0 ? EID_obj.options[ EID_obj.selectedIndex ].value : "-1";
	
		switch(type) {
			case 1 : this.loadData(CID, "", "", type);  break;
			case 2 : this.loadData(CID, RID, "", type); break;
			case 3 : this.loadData(CID, RID, EID, type); break;
		}
	}

	this.removeCachedObject = function() {
		__oldObject = null;
		__currentObject = null;
	}
	
	this.loadData = function(CID, RID, EID, TYPE) {
		
		if(CID <=0 && TYPE == 1) return;
		if(RID <=0 && TYPE == 2) return;
		if(EID <=0 && TYPE == 3) return;
		
		if(EID > 0) {
			this.removeCachedObject();
		}
		
		var __url = _ajaxPage.replace("#CID#", CID);
		__url = __url.replace("#RID#", RID);
		__url = __url.replace("#OID#", EID);
		__url = __url.replace("#TYPE#", TYPE);
		
		if(_ajaxPage != null) {
			$.get( __url, function(data){
	  						PutData(data);
						}
			);
		}
	}
	
	function PutData(data)
	{
		var REGION_DESCR;
		var ELEMENT_DESCR;
	//alert(data);
		try {
			eval(data);
		} catch(e) {
			//alert(e.name + "\n" + data);
			return;
		}
		
		switch(TYPE) {
			case 1 : 
				var RID_obj = document.getElementById("region");
				var OID_obj = document.getElementById("object");
				
				removeOptions(RID_obj);
				removeOptions(OID_obj);
				
				var __option = null;
				var __elements;
				
				addOption(RID_obj, "-1", "Любой регион", false);		
				
				for(var i = 0; i < regions.length; i++)
					addOption(RID_obj, regions[i].ID, regions[i].NAME, i == 0);	
	
				for(var i = 0; i < elements.length; i++)
					addOption(OID_obj, elements[i].ID, elements[i].NAME, i == 0);			
					
			case 2 : 
				var EID_obj = document.getElementById("object");
				__ELEMENTS = elements;
				__this.filterValues();			
			break;
		}
	
		if(OBJECT_DESCR[0].LATITUDE != 0 && OBJECT_DESCR[0].LONGITUDE != 0 && OBJECT_DESCR[0].NAME) {
			var __object = new GMapObjectProperties(OBJECT_DESCR[0].ID, OBJECT_DESCR[0].LATITUDE, OBJECT_DESCR[0].LONGITUDE, OBJECT_DESCR[0].NAME, OBJECT_DESCR[0].DESCR);
				__object.PORT = OBJECT_DESCR[0].PORT;
				__object.clearText = OBJECT_DESCR[0].DESCR_CLEAR;
				__object.RAIL_TERMINAL = OBJECT_DESCR[0].RAIL_TERMINAL;
				__object.ROAD_TERMINAL = OBJECT_DESCR[0].ROAD_TERMINAL;
				__object.AIRPORT = OBJECT_DESCR[0].AIRPORT;
				__object.POSTAL_EXCHANGE = OBJECT_DESCR[0].POSTAL_EXCHANGE;
				__object.ICD = OBJECT_DESCR[0].ICD;
				__object.FTF = OBJECT_DESCR[0].FTF;
				__object.country = OBJECT_DESCR[0].COUNTRY;
				__object.region = OBJECT_DESCR[0].REGION;
				
			showObject(__object);
			//showObject(OBJECT_DESCR[0].ID, OBJECT_DESCR[0].LATITUDE, OBJECT_DESCR[0].LONGITUDE, OBJECT_DESCR[0].NAME, OBJECT_DESCR[0].DESCR);
		}
	}

	this.filterValues = function() {	
		
		if(__ELEMENTS == null) return;
		
	
		var __value = "";//document.getElementById("oName").value;
		
		
		var EID_obj = document.getElementById("object");
		
		removeOptions(EID_obj);
		
		
		for(var i = 0; i < __ELEMENTS.length; i++) {
			if(__value.length > 0 && __ELEMENTS[i].NAME.toLowerCase().indexOf( __value.toLowerCase() )  < 0)
				continue;
				
			addOption(EID_obj, __ELEMENTS[i].ID, __ELEMENTS[i].NAME, false);
		}
	}
	
	this.findObjects = function() {
		
		var __value = document.getElementById("oName").value;
		
		var CID_obj = document.getElementById("country");
		var CID =  CID_obj.selectedIndex >= 0 ? CID_obj.options[ CID_obj.selectedIndex ].value : "-1";
	
		var RID_obj = document.getElementById("region");	
		var RID = RID_obj.selectedIndex >= 0 ? RID_obj.options[ RID_obj.selectedIndex ].value : "-1";
		
		if(RID <=0) RID = "";
		
		var __url = _ajaxPage.replace("#CID#", CID);
		__url = __url.replace("#RID#", RID);
		__url = __url.replace("#OID#", "");
		__url = __url.replace("#TYPE#", "");
		
		
		__url += "&FIND_OBJECT=Y&name=" + __value;
		if(_ajaxPage != null) {
			$.get( __url, function(data){
	  						PutFindedObjects(data);
						}
			);
		}		
	}
	
	function PutFindedObjects(_data) {
		var data = eval(_data);
		var EID_obj = document.getElementById("object");
		removeOptions(EID_obj);
		for(var i = 0; i < elements.length; i++) {
			addOption(EID_obj, elements[i].ID, elements[i].NAME, false);
		}
	}
	
	function addOption(__obj, value, text, selected) {
		
		var __option= document.createElement("OPTION");
		__option.setAttribute("value", value);
		if(selected)
			__option.setAttribute("selected", selected);
		__option.appendChild(document.createTextNode(text));
		try {
			__obj.options.appendChild(__option);	
		} catch(E) {
			__obj.appendChild(__option);	
		}
	}
	function removeOptions(__obj) {
		try {
			__obj.options.length = 0;
			while(__obj.options.length > 0)
				__obj.remove(0);	
		} catch(e){}
	}
	
	//----------------------------------------------------------------------
	
	var __dialogID;
	
	function appendDialogPanel(__url, ID, __currentObject) {
		__url = __url.replace("#CID#", "");
		__url = __url.replace("#RID#", "");
		__url = __url.replace("#OID#", __currentObject.ID);
		__url = __url.replace("#TYPE#", "");
			$.get( __url, function(data){
	  						getDialogPanel(data, ID, __currentObject);
						}
			);
	};

	function getDialogPanel(data, ID, __currentObject) {
		//  потом раскоментить
		//isDialogCodeApplied = true;
		document.getElementById(ID).innerHTML = data;
		showWindow(ID, __currentObject);
	};

	this.showDialogWindow = function(ID, __currentObject) {	
		showGradient();
		showWaitIcon()
		appendDialogPanel(_ajaxPage+ "&SHOW_DESCRIPTION=Y", ID, __currentObject);
	};
	
	function showWindow(ID, __currentObject) {
		__target = __currentObject;
		__dialogID = ID;
		
		var xPos = 0;
		var yPos = 0;
		try {
			var w = GetWindowSize();
			var __div = document.getElementById(ID);
			xPos = parseInt(parseInt(w.scrollLeft + w.innerWidth) / 2 - parseInt(__div.style.width) / 2);
			yPos = parseInt((w.scrollTop + w.innerHeight / 2) - parseInt(__div.style.height) / 2);
		} catch(e){}
		
		//---
		document.getElementById("editObjectDialog2").style.top = (yPos + (!IsOpera() ? "px" : 0));
		document.getElementById("editObjectDialog2").style.left = (xPos + (!IsOpera() ? "px" : 0));
		document.getElementById("editObjectDialog2").style.display="block";
		
		//---
		
		
		document.getElementById(ID).style.top  = (yPos + (!IsOpera() ? "px" : 0));
		document.getElementById(ID).style.left = (xPos + (!IsOpera() ? "px" : 0));		
		document.getElementById(ID).style.display="block";

		
		hideWaitIcon();
		
		return false;		
	}
	
	function showWaitIcon() {
		var w = GetWindowSize();
		
		document.getElementById("waitDialog").style.top = ((w.scrollTop + w.innerHeight / 2) + (!IsOpera() ? "px" : 0));
		document.getElementById("waitDialog").style.display = "";
	}
	
	function hideWaitIcon() {
		document.getElementById("waitDialog").style.display = "none";
	}
	
	function showGradient() {
		var w = GetWindowSize();

		var height = document.getElementById('mainCont').clientHeight + 100;
			height = w.scrollHeight > height ? w.scrollHeight : height;
		document.getElementById("dialogContainer").style.height = (height) + "px";
		document.getElementById("dialogContainer").style.display="block";
	}
	
		function IsOpera() {
		return (navigator.userAgent.toLowerCase().indexOf('opera') != -1);
	};
	
	this.hideDialog = function() {
		document.getElementById(__dialogID).style.display='none';
		document.getElementById('dialogContainer').style.display='none'; 
		document.getElementById('editObjectDialog2').style.display='none';
	}
	
	function GetWindowSize() {
		var innerWidth, innerHeight;
	
		if (self.innerHeight) // all except Explorer
		{
			innerWidth = self.innerWidth;
			innerHeight = self.innerHeight;
		}
		else if (document.documentElement && document.documentElement.clientHeight) // Explorer 6 Strict Mode
		{
			innerWidth = document.documentElement.clientWidth;
			innerHeight = document.documentElement.clientHeight;
		}
		else if (document.body) // other Explorers
		{
			innerWidth = document.body.clientWidth;
			innerHeight = document.body.clientHeight;
		}
	
		var scrollLeft, scrollTop;
		if (self.pageYOffset) // all except Explorer
		{
			scrollLeft = self.pageXOffset;
			scrollTop = self.pageYOffset;
		}
		else if (document.documentElement && document.documentElement.scrollTop) // Explorer 6 Strict
		{
			scrollLeft = document.documentElement.scrollLeft;
			scrollTop = document.documentElement.scrollTop;
		}
		else if (document.body) // all other Explorers
		{
			scrollLeft = document.body.scrollLeft;
			scrollTop = document.body.scrollTop;
		}
	
		var scrollWidth, scrollHeight;
	
		if ( (document.compatMode && document.compatMode == "CSS1Compat"))
		{
			scrollWidth = document.documentElement.scrollWidth;
			scrollHeight = document.documentElement.scrollHeight;
		}
		else
		{
			if (document.body.scrollHeight > document.body.offsetHeight)
			scrollHeight = document.body.scrollHeight;
			else
			scrollHeight = document.body.offsetHeight;
	
			if (document.body.scrollWidth > document.body.offsetWidth ||
			(document.compatMode && document.compatMode == "BackCompat") ||
			(document.documentElement && !document.documentElement.clientWidth)
			)
			scrollWidth = document.body.scrollWidth;
			else
			scrollWidth = document.body.offsetWidth;
		}
	
		return {"innerWidth" : innerWidth, "innerHeight" : innerHeight, "scrollLeft" : scrollLeft, "scrollTop" : scrollTop, "scrollWidth" : scrollWidth, "scrollHeight" : scrollHeight};
	};
}
/*---  edit tools ---*/
