// JavaScript mapPoint Class

function mapPlacemark(data) {
	// Global Variables

	
	// Private Variables
	var lOffset = parseInt($jq(mapCont).offset().left);
	var tOffset = parseInt($jq(mapCont).offset().top);
	var mapContW = parseInt(fnGetContWidth());
	var mapContH = parseInt(fnGetContHeight());
	var pWidth = 8;
	var pHeight = 20;
	var pointx = lOffset + parseInt(data.x) - pWidth;
	var pointy = tOffset + parseInt(data.y) - pHeight;
	var clickedx = parseInt(data.x);
	var clickedy = parseInt(data.y);
	var pid = data.id;
	var divid = "pinpoint" + pid;
	var img = data.img;
	var ptitle = data.ptitle;
	var comment = data.comment;
	var ptdesign = data.design;
	var userserial = data.userserial;
	var useraccesslevel = data.useraccesslevel;
	var companyserial = data.companyserial;
	var popupisup = false;
	var designhtml = '';
	var realx = data.realx;
	var realy = data.realy;

	// Global Functions Getters / Setters
	this.vPoint = {
		getX : function() { return pointx; },
		setX : function(newX) {	pointx = newX; }
	}

	this.addPoint = addPoint;
	this.movePoint = movePoint;
	
	// Global Functions
	this.create = function() {
		res =	"<div id='" + divid + "' class='pinpoint' name='"+pid+"'>" +
							"<a href='#' class='pinpointlink'>" +
							"<img src='"+img+"' />" +
						"</a>" +
					"</div>";
		$jq("body").append(res);

		//designhtml = getHtmlFromDesign(ptdesign);

		// Get top & left for point
		var mtop = parseInt(tOffset);
		var mleft = parseInt(lOffset);
		var mbottom = mtop + parseInt(mapContH);
		var mright = mleft + parseInt(mapContW);

	//alert("ptop: " + pointy + " mtop: " + mtop + " mbottom: " + mbottom + " &&&&& pleft: " + pointx + " mleft: " + mleft + " mright: " + mright);
		if( (pointy >= mtop && pointy <= mbottom) &&
				(pointx >= mleft && pointx <= mright)) {
			
			$jq("#" + divid)
				.css("top", pointy + "px")
				.css("left", pointx + "px")
				.fadeIn("fast");
		
			//alert("id: " + this.id + " Title: " + this.ptitle);
			$jq("#" + divid).hover(function(e){
				showTooltip(e.pageX, e.pageY);
			},
			function(){
				hideTooltip();
			});

			$jq("#" + divid).click(function(e){
				showPopup();
			});

			$jq("#" + divid).contextMenu('pointMenu', {

				bindings: {
					'pointEdit': function(t) {
						showPopup();
						bContextShown = false;
					},
					'pointDelete': function(t) {
						deletePoint();
						bContextShown = false;
					},
					'pointMove': function(t) {
						hideTooltip();
						hidePopup();
						bMovingPoint = true;
						movingPointid = pid;
						movingPointImg = img;
						$jq("#" + divid).hide();
						bContextShown = false;
					}
				},
				onContextMenu: function(e) {
					rClickX = e.pageX;
					rClickY = e.pageY;

					if( imgAreaSelectIsEnabled )
						$jq(mapCont).imgAreaSelect({ enable: false });

					bContextShown = true;

					return true;
				},
				onShowMenu: function(e, menu) {
					//$jq('#pointMove', menu).remove();
					return menu;
				},
				menuStyle: {
					border: '1px solid #000',
					width: '100px'
				},
				itemStyle: {
					fontFamily : 'tahoma',
					fontSize: '11px',
					color: '#fff',
					backgroundColor : '#717171',
					border: 'none',
					padding: '5px'
				},
				itemHoverStyle: {
					backgroundColor: '#9C9892',
					border: 'none'
				}
			});

			$jq("#" + divid).bind('mousewheel', function(event, delta) {

				$jq(mapxCont).val(clickedx);
				$jq(mapyCont).val(clickedy);
				if(delta > 0) { // ZOOM IN
					//if( bPointAdding ) return;
					var tmp = $jq(mapcommandCont).val();
					$jq(mapcommandCont).val('ZOOMIN');
					fnGetMap(false);
					$jq(mapcommandCont).val(tmp);
				}
				else { // ZOOM OUT
					//if( bPointAdding ) return;
					var tmp = $jq(mapcommandCont).val();
					$jq(mapcommandCont).val('ZOOMOUT');
					fnGetMap(false);
					$jq(mapcommandCont).val(tmp);
				}
				
				return false;
			});
		}
	}

	// Private Functions
	function showTooltip(hoverx, hovery) {
		//if(bPointAdding || bAddPoint) return false;

		$jq("body").append("<div id='pinpointtooltip"+pid+"' class='pinpointtooltip'><p>"+ptitle+"</p></div>");

		var ppwidth = parseInt($jq("#pinpointtooltip" + pid).width());
		var ppheight = parseInt($jq("#pinpointtooltip" + pid).height());
		var ttop = parseInt(hovery) - pHeight;
		var tleft = parseInt(hoverx) + pWidth + 5;

		if((ttop - tOffset + ppheight) > mapContH)
			ttop = ttop + pHeight - ppheight;
		if((tleft - lOffset + ppwidth) > mapContW)
			tleft = hoverx - pWidth*3 - ppwidth;

		$jq("#pinpointtooltip" + pid)
			.css("top",(ttop) + "px")
			.css("left",(tleft) + "px")
			.fadeIn("fast");
	}

	function hideTooltip() {
		$jq("#pinpointtooltip" + pid).fadeOut("fast");
		$jq("#pinpointtooltip" + pid).remove();
	}

	function showPopup() {
		if(popupisup) return;
		
		var design = getHtmlFromDesign(ptdesign);
		$jq("body").append(design);

		var ldivid =  $jq("#pointpopup").attr("id");
		$jq("#pointpopup").attr("id",ldivid + pid);
		$jq("#pointpopup"+ pid).find("#popupcomment").html(comment);
		$jq("#pointpopup"+ pid).find("#popuptitle").val(ptitle);
		$jq("#pointpopup"+ pid).find("#popupid").val(pid);
		$jq("#pointpopup"+ pid).find("#hduserserial").val(userserial);
		$jq("#pointpopup"+ pid).find("#hdcompanyserial").val(companyserial);
		$jq("#pointpopup"+ pid).find("#hduseraccesslevel").val(useraccesslevel);
		
	
		/*if( fnGetSession('wssusraccesslevel') >= $jq("#pointpopup"+ pid).find("#hduseraccesslevel").val()
			&& parseInt(fnGetSession('wssuser')) != parseInt($jq("#pointpopup"+ pid).find("#hduserserial").val())) {
			$jq("#pointpopup"+ pid).find("#popupsave").hide("fast");
			$jq("#pointpopup"+ pid).find("#popupdelete").hide("fast");
			$jq("#pointpopup"+ pid).find("#pipe").hide("fast");
			$jq("#pointpopup"+ pid).find("#popuptitle").attr("readonly", "true");
			$jq("#pointpopup"+ pid).find("#popuptitle").css("background", "#CCC");
			$jq("#pointpopup"+ pid).find("#popupcomment").attr("readonly", "true");
			$jq("#pointpopup"+ pid).find("#popupcomment").css("background", "#CCC");
		}*/
		//else {
			$jq("#pointpopup"+ pid).find("#popupsave").show("fast");
			$jq("#pointpopup"+ pid).find("#popupdelete").show("fast");
			$jq("#pointpopup"+ pid).find("#pipe").show("fast");
			$jq("#pointpopup"+ pid).find("#popuptitle").attr("readonly", "");
			$jq("#pointpopup"+ pid).find("#popuptitle").css("background", "#FFF");
			$jq("#pointpopup"+ pid).find("#popupcomment").attr("readonly", "");
			$jq("#pointpopup"+ pid).find("#popupcomment").css("background", "#FFF");
		//}

		$jq("#pinpointtooltip" + pid).fadeOut("fast");
		// Move popup to the right position
		var puwidth = $jq("#pointpopup" + pid).width();
		var puheight = $jq("#pointpopup" + pid).height();
		var ttop = pointy;
		var tleft = pointx + popupOffsetLeft;
		if(ttop - tOffset + puheight > mapContH) {
			ttop = ttop + popupOffsetTop - puheight;
		}
		
		if(tleft - lOffset + puwidth > mapContW) {
			tleft = pointx - popupOffsetLeft - puwidth;
		}

		$jq("#pointpopup" + pid)
			.css("top",(ttop) + "px")
			.css("left",(tleft) + "px")
			.fadeIn("fast");

		popupisup = true;
		bPointAdding = true;

		var lat = realy;
		var lon = realx;
		$jq("#pointpopup" + pid).find("#popupwikimapia").attr("href", "http://wikimapia.org/#lat=" + lat + "&lon=" + lon + "&z=18" );
		
		$jq("#pointpopup"+ pid).find("#popupcancel").click(function(){
			hidePopup();
			$jq(stPointClicked).html('');
		});

		$jq("#pointpopup"+ pid).find("#popupcancel").hover(function() {
			$jq("#pointpopup"+ pid).find("#popupbuttons_close").css("margin", "0");
			$jq("#pointpopup"+ pid).find("#popupbuttons_close").css("border", "1px solid #999999");
		},
		function() {
			$jq("#pointpopup"+ pid).find("#popupbuttons_close").css("border", "0");
			$jq("#pointpopup"+ pid).find("#popupbuttons_close").css("margin", "1px");
		});

		$jq("#pointpopup"+ pid).find("#popupsave").click(function(){
			var putitle = $jq("#pointpopup"+ pid).find("#popuptitle").val();
			var pucomment = $jq("#pointpopup"+ pid).find("#popupcomment").val();
			if( putitle == '' ) {
				alert("Please specify point's title");
				return false;
			}
			else {
				if( pucomment == '' ) {
					alert("Please specify point's comment");
					return false;
				}
			}
		
			fnSavePoint("UPDATE", $jq("#pointpopup"+ pid).find("#popupid").val(), 0, 0, 0, putitle, pucomment);
			hidePopup();
		});

		$jq("#pointpopup"+ pid).find("#popupdelete").click(function() {
			deletePoint();
			bPointAdding = false;
		});

		$jq("a[href*='#placemarkNavFrom']").click(function() {
			navigateFrom();
		});


		$jq("a[href*='#placemarkNavTo']").click(function() {
			navigateTo();
		});
	}

	function hidePopup() {
		$jq("#pointpopup"+pid).fadeOut("fast");
		$jq("#pointpopup"+pid).remove();
		bPointAdding = false;
		$jq("#mapCurrentAction").css("display", "none");
		popupisup = false;
	}

	function addPoint() {
	//alert("Adding");
		// Add temp point
		$jq("body").append("<div id='tmpaddpinpoint' class='tmppinpoint'><img src='" + $jq("#pinpoint_image img").attr("src") + "' /></div>");
		$jq("#tmpaddpinpoint")
			.css("top",(pointy) + "px")
			.css("left",(pointx) + "px");

		// Add point popup
		//var design = fnGetBubbleDesign();
		$jq("body").append(pinpointDesign);

		// Hide save button
		$jq("#pointpopup").find("#popupsave").hide("fast");
		// Get Lat/Long of clicked point
		// this will enable save button
		//fnGetPoint();
		var lat = getLatFromY(clickedy-tOffset);
		var lon = getLonFromX(clickedx-lOffset);
		$jq(mapPointX).val(lon);
		$jq(mapPointY).val(lat);

		$jq("#pointpopup").find("#popupsave").show("fast");
		$jq("#pointpopup").find("#popupwikimapia").attr("href", "http://wikimapia.org/#lat=" + lat + "&lon=" + lon + "&z=18" );

		// Hide delete
		$jq("#pointpopup").find("#popupdelete").css("display", "none");
		$jq("#pointpopup").find("#pipe").css("display", "none");
		
		// Move popup to the right position
		var puwidth = $jq("#pointpopup").width();
		var puheight = $jq("#pointpopup").height();
		var ttop = pointy - tOffset;
		var tleft = pointx - lOffset + popupOffsetLeft;
		if(ttop - tOffset + puheight > mapContH) {
			ttop = ttop + popupOffsetTop - puheight;
		}
		
		if(tleft - lOffset + puwidth > mapContW) {
			tleft = pointx - popupOffsetLeft - puwidth;
		}

		$jq("#pointpopup")
			.css("top",(ttop) + "px")
			.css("left",(tleft) + "px")
			.fadeIn("fast")
			;
		
		bPointAdding = true;
		bAddPoint = false;

		$jq("#pointpopup").find("#popupcancel").hover(function() {
			$jq("#pointpopup").find("#popupbuttons_close").css("margin", "0");
			$jq("#pointpopup").find("#popupbuttons_close").css("border", "1px solid #999999");
		},
		function() {
			$jq("#pointpopup").find("#popupbuttons_close").css("border", "0");
			$jq("#pointpopup").find("#popupbuttons_close").css("margin", "1px");
		});

		$jq("#pointpopup").find("#popupcancel").click(function(){
			hidePopup();
			$jq("#tmpaddpinpoint").remove();

			$jq(stPointClicked).html('');

			bPointAdding = false;
		});

		$jq("#pointpopup").find("#popupsave").click(function(){
			var putitle = $jq("#pointpopup").find("#popuptitle").val();
			var pucomment = $jq("#pointpopup").find("#popupcomment").val();
			if( putitle == '' ) {
				alert("Please specify point's title");
				return false;
			}
			else {
				if( pucomment == '' ) {
					alert("Please specify point's comment");
					return false;
				}
			}

			// Save Point to db
			fnSavePoint("INSERT", $jq("#pointpopup").find("#popupid").val(), $jq("#pinpoint_image img").attr("name"),
					$jq(mapPointX).val(), $jq(mapPointY).val(), $jq("#pointpopup").find("#popuptitle").val(), $jq("#pointpopup").find("#popupcomment").val());

			bPointAdding = false;
			hidePopup();
		});

		$jq("a[href*='#placemarkNavFrom']").click(function() {
			navigateFrom();
		});


		$jq("a[href*='#placemarkNavTo']").click(function() {
			navigateTo();
		});
	}

	function deletePoint() {
		if( confirm('Are you sure you want to delete this point?') ) {
			fnSavePoint("DELETE", pid, 0, 0, 0, "", "");
		}
	}

	function movePoint() {
		var lat = getLatFromY(clickedy-tOffset);
		var lon = getLonFromX(clickedx-lOffset);
		var ret = fnMovePoint(pid, lon, lat);

		if(!ret) return;
	}

	function navigateFrom() {
		fnSetNavFromToPoint(clickedx, clickedy, mapNavPointFromX, mapNavPointFromY, "#navigationFrom", "from");
	}

	function navigateTo() {
		fnSetNavFromToPoint(clickedx, clickedy, mapNavPointToX, mapNavPointToY, "#navigationTo", "to");
	}
}
