var panorama = null;
var man = null;
var overlayInstance = null;
var map = null;
var client = null;
var lastMarkerLocation = null;;
var mapT = null;
var placeMarker = null;
var panoPreview = null;
var mapOv = null;
var addrCtryGeocoder = null;;

var params = {};
params.wikiLang = null;

var tsv = null;

google.load("language", "1");

// -----------------------------------
// -----------------------------------

function lc_showLink()
{
	var x = $(".path");

	for(var i = 0; i < x.length; i++)
	{
		var el = $(x.get(i));
	
		var url = el.attr("path");
		var html = '<a href="'+url+'">'+el.html()+'</a>';
		el.html("");
		el.html(html);
	}	
}

google.setOnLoadCallback(lc_showLink);

// -----------------------------------
// -----------------------------------
//	site ... 	
// -----------------------------------
// -----------------------------------

function lc_goAdd()
{
	var latlng = man.getLatLng();
	var pov = panorama.getPOV(); 
	
	var params = '?lat='+latlng.lat()+'&lng='+latlng.lng()+'&city_id='+cityID;
	params += '&yaw='+pov.yaw+'&pitch='+pov.pitch+'&zoom='+pov.zoom;
	
	var url = '/'+langID+'/new/'+params;
	window.open(url);
}

// -----------------------------------
// -----------------------------------

/**
 *	
 */
function lc_loadMainWorldMap(obj) 
{
      var latlng = new GLatLng(obj.lat, obj.lng);
	  map = new GMap2(document.getElementById("country_map"));
      map.setCenter(latlng, obj.zoom);
    
      var overlayInstance = new GStreetviewOverlay();
	  map.addOverlay(overlayInstance);
      
	  map.addControl(new GLargeMapControl());
   	  //map.addControl(new GMapTypeControl());
      map.addControl(new GScaleControl());
      
	  map.disableScrollWheelZoom();
	  map.disableContinuousZoom();
	  
	  if(mapMarkers && mapMarkers.length)
	  {
	  	for(var i = 0; i < mapMarkers.length; i++)
	  	{
	  		var point = new GLatLng(mapMarkers[i][0], mapMarkers[i][1]);
	  		var sm = lc_createWorldMapMarker(point, mapMarkers[i][2], mapMarkers[i][3]);	
			map.addOverlay(sm);	  		
	  	}
	  }
	  
	  addrCtryGeocoder = new GClientGeocoder();
	  client = new GStreetviewClient();
	  
	  GEvent.addListener(map, "click", lcev_onWorldMapClick);
}

// --------------------------------------
// --------------------------------------
// --------------------------------------
// --------------------------------------

var searchCountryMarkers = new Array();

/**
 *
 */
function lc_searchCountryShowAddress(address) 
{
	lc_searchCountryClearMarkers();
	
	var addr = address;
		
	if (addrCtryGeocoder) 
	{
		addrCtryGeocoder.getLatLng(
			addr,
			function(point) 
			{
				if (!point) { alert(addr + " not found"); } 
				else 
				{
					var html = '<div id="tooltipName">'+address+'</div>';
				 	map.setCenter(point, 16);				 	
				 	var url = '/'+glob.langID+'/map/point/'+point.lat()+'/'+point.lng()+'/';
				  	var sm = lc_createWorldMapMarker2(point, address, url);
				  	map.addOverlay(sm);
				  	searchCountryMarkers.push(sm);
				}
			}
		);
	}
}

// --------------------------------------

/**
 *
 */
function lc_searchCountryClearMarkers()
{
	for(var i = 0; i < searchCountryMarkers.length; i++) 
	{	
		map.removeOverlay(searchCountryMarkers[i]);
		delete searchCountryMarkers[i];
	}
	
	searchCountryMarkers = new Array();
}

// --------------------------------------
// --------------------------------------
// --------------------------------------

/**
 *
 */
function lc_createWorldMapMarker(point, html, url)
{
	var options = {};
	
	var icon = new GIcon();
	icon.image = '/images/mm_20_red.png';
	icon.shadow = '/images/mm_20_shadow.png';
	icon.iconSize = new GSize(12, 20);
	icon.shadowSize = new GSize(22, 20);
	icon.iconAnchor = new GPoint(6, 5);
	//icon.infoWindowAnchor = new GPoint(5, 0);
	
	options.icon = icon; 
	
	var sm = new GMarker(point, options);
	
	GEvent.addListener(sm, "mouseover", function() 
	{
  		lc_WorldMapShowMarkerInfo(point, html + "");
	});       	
	
	GEvent.addListener(sm, "mouseout", function() 
	{
		lc_WorldMapHideMarkerInfo();
	});  

	GEvent.addListener(sm, "click", function() 
	{ 
		location.href = url; 
	});
	
	return sm;
}

// ---------------------------------------------

/**
 *
 */
function lcev_onWorldMapClick(ov, latlng)
{
	if(latlng)
	{	
		lc_searchCountryClearMarkers();
		
		var sm = lc_createWorldMapMarker2(latlng);
		map.addOverlay(sm);
		searchCountryMarkers.push(sm);
		map.setCenter(latlng, map.getZoom() + 1);
	}		
}

// ---------------------------------------------

/**
 *
 */
function lc_createWorldMapMarker2(point)
{
	var options = {};
	
	var icon = new GIcon();
	icon.image = '/static/icons/zoom.png';
	//icon.shadow = '/images/mm_20_shadow.png';
	icon.iconSize = new GSize(32, 37);
	//icon.shadowSize = new GSize(22, 20);
	icon.iconAnchor = new GPoint(16, 37);
	icon.title = "Click to show panorama";
	//icon.infoWindowAnchor = new GPoint(5, 0);
	
	options.icon = icon;
	options.draggable = true; 
	
	var sm = new GMarker(point, options);
	
	GEvent.addListener(sm, "click", function(newpoint) 
	{
		client.getNearestPanorama(newpoint, lcev_onWorldMapClickCallback);
	});
	
	return sm;
}

// ---------------------------------------------

function lcev_onWorldMapClickCallback(response) 
{	
	if (response.code != 200) 
	{
		alert('Sorry, Panorama not found');
	} 
	else 
	{
		var url = '/'+glob.langID+'/map/point/'+response.Location.lat+'/'+response.Location.lng+'/';
		location.href = url; 
	}
}

// ---------------------------------------------

/**
 *
 */
function lc_WorldMapShowMarkerInfo(latlng, html)
{
	var mapdiv = $gid("country_map");
	var p = map.fromLatLngToContainerPixel(latlng);
	var x = mapdiv.offsetLeft + p.x;
	var y = mapdiv.offsetTop + p.y;
	
	$("#maptooltip").css("left", x+12);
	$("#maptooltip").css("top", y-3);
	
	$("#maptooltip").html(html);
	$("#maptooltip").show();	
}


// ---------------------------------------------

/**
 *
 */
function lc_WorldMapHideMarkerInfo()
{
	$("#maptooltip").html("");
	$("#maptooltip").hide();
}

// -----------------------------------
// -----------------------------------
//	site ... 	
// -----------------------------------
// -----------------------------------

function lc_workCallback(xml)
{
	/** <Callback type="modal|close|callback|frame" value=""/> **/
	var resArr = xml.getElementsByTagName('Callback');
	if(resArr.length)
	{
		var res = resArr[0];
		var type = res.getAttribute("type");
		var value = res.getAttribute("value");
		
		if(type == "close") { lc_closeModal(); return; }
		else if(type == "reload") { location.href = location.href; return; }
		else if(type == "frm") 
		{ 
			var frm = getFrame();
			frm[value]();
			return;
		}
		else if(type == "mod") 
		{  
			lc_showModalDef(value);
			return;
		}
		else if(type == "cbk")
		{
			window[value]();
			return;
		}
	}
	
	lc_closeModal();
}	

// -----------------------------------

/**
 *
 */
function lc_saveComment(pid, lang, comment, rating)
{
	var f = {};
	f.t = "savecmt";
	f.pid = pid;
	f.lang = lang;
	f.comment = comment;
	f.rating = rating || 0;
	
	var res = ajax_postSContent("/tools/comment.save.php", 1, f);	
	return res;
}

// -----------------------------------

/**
 *
 */
function lc_saveContactCmt(url)
{
	var f = {};
	f.t = "save";
	f.referer = $("#cReferer").val();
	f.name = $("#cName").val();
	f.email = $("#cEmail").val();
	f.comment = $("#cComment").val();
		
	var res = ajax_postSContent(url, 1, f);	
	lc_closeModal();
}

// -----------------------------------

/**
 *
 */
function lc_sendLinkToPlace(f)
{
	var res = ajax_postSContent("/tools/link.send.php", 1, f);	
	if(res == 1) { lc_closeModal(); return; }
	
	alert(locStr.error);
}

// -----------------------------------

/**
 *
 */
function lc_voteComment(cid, rating)
{
	var f = {};
	f.cid = cid;
	f.rating = rating;
		
	var res = ajax_postSContent("/tools/comment.vote.php", 1, f);	
	return res;
}

/**
 *
 */
function lc_initTopStreetView() 
{
	lc_initTopSVBoxs();
	
	if (GBrowserIsCompatible()) 
	{
        tsv = new GStreetviewPanorama(document.getElementById("topstreetbox"));
        GEvent.addListener(tsv, "error", lc_panoramaError);  
		var latlng = new GLatLng(tsvPos.lat, tsvPos.lng);
		tsv.setLocationAndPOV(latlng, tsvPos.pov);
    }
}

// ------------------------------------
// ------------------------------------

function lc_initTopSVBoxs()
{
	var i = tb_getPageSize();
	var w = i[0]; var h = i[1];

	if(w > 1024)
	{
		var width = w - 479 - 43;
		//var width = 800;
		var height = 450;
		
		//topplacebox:width (545)
		//topplacebox_center:heigh (430)
		//topstreetbox:w,h (502, 350)

		$("#topplacebox").css("width", width+43);
		$("#topplacebox_center").css("height", height+80);

		$("#topstreetbox").css("width", width);
		$("#topstreetbox").css("height", height);
	}
}

// -----------------------------------
// -----------------------------------
//	common ... 	
// -----------------------------------
// -----------------------------------


// -----------------------------------
//	translate functions ...
// -----------------------------------

/**
 *	переводим
 */
function lc_translateBlockNow(el, el2, linkEl, fromLang, toLang)
{
	if(el2.html())
	{
		el.html(el2.html());
		el2.html("");
		
    	var def = linkEl.html();
    	linkEl.html(linkEl.attr("def"));
    	linkEl.attr("def", def);
		
		return;
	}
	
	var html = el.html();
	el.html('Please wait ...');
	
	/** translate text **/
	google.language.translate(html, fromLang, toLang, function(result) 
	{
		if (result.translation) 
	    {
	    	el2.html(html);
	    	el.html(result.translation);
	    	var def = linkEl.html();
	    	linkEl.html(linkEl.attr("def"));
	    	linkEl.attr("def", def);
	    }
	    else
	    {
	    	el.text(html);
	    }
	});
}

// ------------------------------------

/**
 *	получаем, переводим, сохраняем, показываем
 */
function lc_translateBlockNowSave(el, fromLang, toLang, opts)
{
	google.language.translate(el.text(), fromLang, toLang, function(result) 
	{
		if (result.translation) 
	    {
	    	el.html(result.translation);

	    	var f = {};
			f.t = opts.put;
			f.o_id = opts.o_id;
			f.text = result.translation;
			f.lang_id = toLang;
			
			/** save translate **/
			$.post("/tools/stext.php", f);
	    }
	});
}

// ------------------------------------

/**
 *	получаем, переводим, сохраняем, показываем
 */
function lc_translateBlockWS(el, fromLang, toLang, incOrig)
{
	var incOrig = incOrig || 0;
	
	google.language.translate(el.text(), fromLang, toLang, function(result) 
	{
		if (result.translation) 
	    {
	    	var text = result.translation;
	    	if(incOrig && el.text() != text) { text += " ("+el.text()+")"; }
	    	el.html(text);
	    }
	});
}

// ------------------------------------

/**
 *	получаем, переводим, сохраняем, показываем
 */
function lc_translateBlockAndSave(el, fromLang, toLang, incOrig, oID, noPano)
{
	var incOrig = incOrig || 0;
	var oID = oID || 0;	
	var noPano = noPano || 2;
	
	google.language.translate(el.text(), fromLang, toLang, function(result) 
	{
		if (result.translation) 
	    {
	    	
	    	var trText = result.translation;
	    	var text = trText;
	    	if(incOrig && el.text() != trText) { text += " ("+el.text()+")"; }
	    	el.html(text);
	    	
			if(oID)
			{
				var f = {};
				f.t = "puttrname";
				f.o_id = oID;
				f.lang_id = toLang;
				f.text = trText;
				f.noPano = noPano;
				
				$.post("/tools/stext.php", f);
			}	  	    	
	    }
	});
}

// ------------------------------------

/**
 *
 */
function lc_loadWikiLang(lang, name, callback)
{
	name = encodeURIComponent(name);
	var url = 'http://'+lang+'.wikipedia.org/w/api.php?action=query&lllimit=500&prop=langlinks&titles='+name+'&format=json&callback=' + callback;
	$.getScript(url);
}

// ------------------------------------

/**
 *
 */
function lc_loadWikiLang2(obj, f)
{
	f.name = obj.text();
	
	$.post('/tools/api.wiki.name.php', f, function(res) 
	{
		alert(res);
		if(res) { obj.html(res); };
	});
}

// ------------------------------------

/**
 *
 */
function lc_translateWikiName(obj)
{
	if(!params.wikiLang) { return; }

	var langLinks = new Array(); 
	for(var pId in obj.query.pages)
	{
		if(obj.query.pages[pId].langlinks) { langLinks = obj.query.pages[pId].langlinks; }
		break;
	}
	
	var isTransl = 0;
	for(var i = 0; i < langLinks.length; i++)
	{
		var l = langLinks[i].lang;
		var t = langLinks[i]["*"];
		
		if(l == params.wikiLang.toLang)
		{
			params.wikiLang.obj.html(t);
			isTransl = 1;

			var f = {};
			f.t = "putname";
			f.o_id = params.wikiLang.placeID;
			f.lang_id = l;
			f.text = t;
			f.noPano = params.wikiLang.isNoPano || 2;
			
			$.post("/tools/stext.php", f);
		}
	}

	if(isTransl == 0)
	{
		lc_translateBlockAndSave(params.wikiLang.obj, params.wikiLang.fromLang, params.wikiLang.toLang, 1, params.wikiLang.placeID, params.wikiLang.isNoPano);
	}
}

// ------------------------------------

/**
 *
 */
function lc_translateWikiName2(obj, p)
{
	var langLinks = new Array(); 
	for(var pId in obj.query.pages)
	{
		if(obj.query.pages[pId].langlinks) { langLinks = obj.query.pages[pId].langlinks; }
		break;
	}
	
	var isTransl = 0;
	for(var i = 0; i < langLinks.length; i++)
	{
		var l = langLinks[i].lang;
		var t = langLinks[i]["*"];
		
		if(l == p.tol)
		{
			p.o.html(t);
			isTransl = 1;

			var f = {};
			f.t = "putname";
			f.o_id = p.oid;
			f.lang_id = l;
			f.text = t;
			
			$.post("/tools/stext.php", f);
		}
	}

	if(isTransl == 0) {	lc_translateBlockWS(p.o, p.fl, p.tol, 1); }
}

// ------------------------------------
//	flash 
// ------------------------------------

/**
 *	показываем страницу thinkbox
 */
function lc_hideFlash()
{
	if(panorama) 
	{ 
		$("#pano").hide();
		//panorama.hide();	
	}
}

// ------------------------------------

/**
 *	показываем страницу thinkbox
 */
function lc_showFlash()
{
	if(panorama) 
	{ 
		$("#pano").show();
		//panorama.show(); 
	}
}

// ------------------------------------
//	окошки 
// ------------------------------------

/**
 *	показываем страницу thinkbox
 */
function lc_showModal(url, opts)
{
	lc_hideFlash();
	
	opts = opts || {};
	var lang = opts.langID || langID;
	lang = lang || "en";
	var w = opts.w || 800;
	var h = opts.h || 490;
	var param = '?height='+h+'&width='+w+'&modal=true&lang='+lang;
	if(opts.add) { param += '&' + opts.add; }
	if(opts._cbtype && opts._cbval)
	{ 
		param += '&_cbtype=' + opts._cbtype; 
		param += '&_cbval=' + encodeURIComponent(opts._cbval); 
	}
	
	tb_show(null, url + param, null);
}

// ------------------------------------

/**
 *	показываем страницу thinkbox
 */
function lc_showModalDef(url)
{
	lc_hideFlash();
	
	if(url.indexOf("?") == -1) { url += "?1"; }
	
	var lang = langID || "en";
	var param = '&height=490&width=800&modal=true&lang='+lang;

	tb_show(null, url + param, null);
}

// ------------------------------------

/**
 *	показываем страницу thinkbox
 */
function lc_showModal2(url, opts)
{
	lc_hideFlash();
	
	opts = opts || {};
	var w = opts.w || 800;
	var h = opts.h || 490;
	var param = '?height='+h+'&width='+w+'&modal=true';
	if(opts.add) { param += '&' + opts.add; }
	if(opts._cbtype && opts._cbval) 
	{ 
		param += '&_cbtype=' + opts._cbtype; 
		param += '&_cbval=' + encodeURIComponent(opts._cbval); 
	}
	tb_show(null, url + param, null);
}

// ------------------------------------

/**
 *	показываем страницу thinkbox
 */
function lc_showModalImg(img)
{
	lc_hideFlash();
	
	
	
	parent.tb_show(null, img, null);
}
	
// ------------------------------------

/**
 *	показываем страницу thinkbox
 */
function lc_closeModal()
{
	$("#map_canvas").css("z-Index", 10);
	lc_showFlash();
	tb_remove();
}

// ------------------------------------
// ------------------------------------

/**
 *	показываем ошибку flash
 */
function lc_panoramaError(errorCode) 
{
	if (errorCode == 603) 
	{
    	alert(locStr.error_flash);
        return;
    }
}

// ------------------------------------
// ------------------------------------

/**
 *	
 */
function lc_addLangs(obj)
{
	var langLinks = new Array(); 
	for(var pId in obj.query.pages)
	{
		if(obj.query.pages[pId].langlinks) { langLinks = obj.query.pages[pId].langlinks; }
		break;
	}
	
	var moreHtml = "";
	var isTransl = 0;

	for(var i = 0; i < langLinks.length; i++)
	{
		var l = langLinks[i].lang;
		if(!glob.langs[l] || glob.wikiLang[l]) { continue; }

		var t = langLinks[i]["*"];		
		var artEnc = encodeURIComponent(t);
		
		var rowHtml = '<a href="/tools/goWiki.php?l='+l+'&id='+artEnc+'" target="_blank">'+descTr.strShow+' (<span style="text-transform: lowercase;">'+glob.langs[l]+'</span>)</a>';
		if(l != glob.langID) { rowHtml += '&#xA0;'+descTr.strTransl+' <a href="/tools/goWiki.php?hl='+langID+'&l='+l+'&id='+artEnc+'" target="_blank"><span style="text-transform: lowercase;">'+glob.langs[l]+' -&gt; '+glob.langs[glob.langID]+'</span></a>'; }
			
		if(l == glob.langID)
		{
			isTransl = 1;
			$(descTr.id_placeName).html(t);			
			$(descTr.id_wikilangs_main).html('<div>'+rowHtml+'</div>');
		}
		else
		{
			moreHtml += '<div>'+rowHtml+'</div>';
		}
		
		if(descTr.placeID)
		{
			var f = {};
			f.t = "putname";
			f.o_id = descTr.placeID;
			f.lang_id = l;
			f.text = t;
			f.noPano = descTr.isNoPano || 2;
			
			$.post("/tools/stext.php", f);
		}
	}

	$(descTr.id_wikilangs).append(moreHtml);
	
	if(isTransl == 0)
	{
		lc_translateBlockAndSave($(descTr.id_placeName), descTr.placeLangID, glob.langID, 1, descTr.placeID, descTr.isNoPano);
	}	
}

// ------------------------------------
// ------------------------------------
// ------------------------------------
// ------------------------------------


function serialize(_obj)
{
   // Let Gecko browsers do this the easy way
   if (typeof _obj.toSource !== 'undefined' && typeof _obj.callee === 'undefined')
   {
      return _obj.toSource();
   }
   // Other browsers must do it the hard way
   switch (typeof _obj)
   {
      // numbers, booleans, and functions are trivial:
      // just return the object itself since its default .toString()
      // gives us exactly what we want
      case 'number':
      case 'boolean':
      case 'function':
         return _obj;
         break;

      // for JSON format, strings need to be wrapped in quotes
      case 'string':
         return '\'' + _obj + '\'';
         break;

      case 'object':
         var str;
         if (_obj.constructor === Array || typeof _obj.callee !== 'undefined')
         {
            str = '[';
            var i, len = _obj.length;
            for (i = 0; i < len-1; i++) { str += serialize(_obj[i]) + ','; }
            str += serialize(_obj[i]) + ']';
         }
         else
         {
            str = '{';
            var key;
            for (key in _obj) { str += key + ':' + serialize(_obj[key]) + ','; }
            str = str.replace(/\,$/, '') + '}';
         }
         return str;
         break;

      default:
         return 'UNKNOWN';
         break;
   }
}

// -----------------------------------
// -----------------------------------
//	login 
// -----------------------------------
// -----------------------------------


/**
 *	
 */
function lc_showLogin()
{
	window.open("/"+glob.langID+"/login/?mode=popup", 'Authorization', 'width=600,height=600,location=1,status=1,scrollbars=0');
}

// -----------------------------------

/**
 *	
 */
function lc_userLogin(ret)
{
	var f = {};
	f.t = "login";
	f.name = $("#rName").val();
	f.pass = $("#rPass").val();
	
	var data = ajax_postSContent("/"+glob.langID+"/login/", 1, f);	
	var obj = eval('('+data+')');
	
	if(obj._withError)
	{
		site_showError({name:"rName", pass:"rPass"}, obj);
		return obj;
	}
	
	if(obj.callback == "url_reload" && !ret)
	{
		if(glob.referer) { location.href = glob.referer; }
		else { location.href = location.href; }
	}
	
	return obj;
}

// -----------------------------------

/**
 *
 */
function lc_userRegister(ret)
{
	var f = {};
	f.t = "register";
	f.email = $("#reEmail").val();
	f.name = $("#reName").val();
	f.pass = $("#rePass").val();
	f.cpass = $("#reCPass").val();
	
	var data = ajax_postSContent("/"+glob.langID+"/login/", 1, f);	
	var obj = eval('('+data+')');	
		
	if(obj._withError)
	{
		site_showError({name:"reName", pass:"rePass", 
						cpass: "reCPass", email:"reEmail"}, obj);
						
		if(obj._errors && obj._errors.name && obj._errors.name.msg == "name.error.exists")
		{
			alert('Error! User exist!');
		}
		
		if(obj._errors && obj._errors.email && obj._errors.email.msg == "email.error.exists")
		{
			alert('Error! User exist!');
		}			
						
		return obj;
	}	
		
	if(obj.callback == "url_reload" && !ret)
	{
		if(glob.referer) { location.href = glob.referer; }
		else { location.href = location.href; }
	}	
	
	return obj;
}

// -----------------------------------
// -----------------------------------

function site_showError(elems, req)
{	
	for(var key in elems)
	{
		$("#" + elems[key]).css("border", "1px #707070 solid");
	}
			
	for(var key in req._errors)
	{
		
		$("#" + elems[key]).css("border", "1px #FF5900 solid");
	}
}

// -----------------------------------
// -----------------------------------


