﻿var skip_unhide_buildings = new Array("Robocup 2010");
var cvn, mygerm;
var t_slideshow;
var slideshow=true;
var is_gliding=false;
var gliding_dir="forward";
//var slideshow_first_step_pause=4000; //4s
var slideshow_pause=1000; //3s
var autostart_slideshow = true;
var htmlBox1, htmlBox2;
var cvn_germ;
var current_page;
var current_caller;
var current_pmk_id=0;
var current_cat_id=0;
var current_path_index=0;
var current_guide_index=0;
var current_path_mode="std";
var selected_path_index=0;
var selected_src_pmk_id=0;
var last_step=false;
var api;
var active_pmk;
var gpmkFloat, gpmkActive, bMouseDown=false;
var cvn_timer;
var updateConvenoGuideDOM=false;
var placemarkIsClicked = false;
var mainmenu_id=0;
var descArr = new Array();
var desccallout, descwrapper;
var reopencallout=true;
var callout_timer;
var hide_callout=false;

//style [style]
var style = (typeof getUrlVars()["style"]!="undefined") ? getUrlVars()["style"] : "blue";
document.write('<link rel="stylesheet" href="theme/modern/styles/'+style+'/style.css" type="text/css" />');

//collapsible [col]
var collapsible = (typeof getUrlVars()["col"]!="undefined") ? true : false;
if(collapsible==true){
	if(getUrlVars()["col"].toLowerCase()=="true") collapsible=true; else collapsible=false;
}

//language
var lang_param = (typeof getUrlVars()["lang"]!="undefined") ? getUrlVars()["lang"] : "";
if(lang_param){
	if(GetString(lang_param, lang_param)!="(undefined)"){
		app_settings.lang = lang_param;
	}
}

$(document).ready(function() {
		setTimeout(Init,10);
});

function Init() {
	desccallout = $("#desc-callout");
	descwrapper = $("#desc-callout").parent();
	
	var germ_height = $(window).height() - 60 + "px";
	$('#germdiv').css('height', germ_height);
	
	window.onerror=function(msg, obj, lineno) { 
		if (lineno==0) return false;
		window.onerror=null;

		var args = Array.prototype.slice.call(arguments); 

		try {
			clearInterval(cvn_timer);
			cvn_germ.Deinitialize();
			$('#germdiv').remove();
		} catch (e) {
		}

		OutputErrorPage(args.join(", ")); 
		return true; 
	};
	
//	try {
		if (!app_settings.lang) app_settings.lang = jsobj.app[ConvenoConst.APP.PRI_LANG];
		if (!app_settings.lang) app_settings.lang = "en";
		UpdateCommonElements(app_settings.lang);
//	} catch (e) {
//		OutputErrorPage("No valid app");
//		return;
//	}
	DisableSelection( document.getElementsByTagName('body')[0] );

	myLayout = $('body').layout({
		closable:					collapsible	// pane can open & close
		,	resizable:				false	// when open, pane can be resized 
		,	slidable:				false
		,  	spacing_open:			10
		,  	spacing_closed:			10
		,  	togglerLength_open: 	50
		,  	togglerLength_closed:  	50
		,	center__onresize: function(){
				onCenterResized();
			}
		,	west__onresize: function(){
				onWestResized();
			}
	});
	
	var win_width = $(window).width();
	if(win_width <= 1024){
		var west_width = "290px";
	} else {
		var west_width = "350px";
	}
	myLayout.panes.west.css({
		"width": west_width,
		"height": "100%",
		"border": "none",
		"overflow": "hidden",
		"padding": 0,
		"margin": 0
	});
    myLayout.panes.center.css({
        //"background": "#ffffff",
        //"color": "#fff",
        //"padding": "8px 8px 8px 8px",
        "width": "100%",
		"height": "100%",
		"border": 0,
		"padding": 0,
        "margin": 0,
		"min-width": "250px",
        "overflow": "hidden"
		//"overflow-x": "auto",
		//"overflow-y": "hidden"
    });
	
	$('.readmore a').click(function() {
		var desc_height = $('#app-info .Conveno_Description').height() + 'px';
		if($('#app-info .Conveno_Description_Wrapper').css('height')=="33px"){
			$('#app-info .Conveno_Description_Wrapper').animate({
				height: desc_height
			  }, 350, function() {
				// Animation complete.
				//getString
				$('.readmore a').html("Hide"); //Read less?
				onWestResized();
			  });
		} else {
			$('#app-info .Conveno_Description_Wrapper').animate({
				height: '33px'
			  }, 350, function() {
				// Animation complete.
				//getString
				$('.readmore a').html("Read more");
				onWestResized();
			  });
		}
	});

	onCenterResized();
	
	// must perform construction after document is ready. else #main wont be available
	document.title = jsobj.app[ConvenoConst.APP.NAME];
	
	var btn = $("a.button");
	btn.bind('mouseover',
		function() {
			$(this).addClass("hover");
		}
	);
	btn.bind('mouseout',
		function() {
			$(this).removeClass("hover");
		}
	);
	btn.bind('click',
		function() {
			$(this).removeClass("hover");
		}
	);
	
	bindCommonButtons();
	
	var postInit = function() {
		$(".btn-email span.text").text( GetString("txtemail") );
		$(".btn-facebook span.text").text( GetString("txtfacebook") );
		$(".btn-twitter span.text").text( GetString("txttwitter") );
		
		var jsobj = cvn.GetData();
		var fb_share_link = "http://www.facebook.com/sharer.php?u="+encodeURIComponent(document.location.href)+"&t="+encodeURIComponent("Conveno - "+jsobj.app[2]);
		var twitter_share_link = "http://twitter.com/share?url="+encodeURIComponent(document.location.href)+"&text="+encodeURIComponent("Conveno - "+jsobj.app[2]); //&via
		var email_share_link = "mailto:<recipient's email address>?subject="+encodeURIComponent("Conveno - "+jsobj.app[2])+"&body=Find out more about "+jsobj.app[2]+" here: "+encodeURIComponent(document.location.href);
		$('.btn-facebook').attr('href', fb_share_link);
		$('.btn-twitter').attr('href', twitter_share_link);
		$('.btn-email').attr('href', email_share_link);
		$('.btn-facebook').attr('target', '_blank');
		$('.btn-twitter').attr('target', '_blank');
		$('.btn-email').attr('target', '_blank');
		
		//Legends
		if (app_settings.is3d){
			$("#Conveno_Legend_Wrapper").removeClass("hidden");
		}
		if(numberOfLegends()==0 && !app_settings.showsurrounding){
			$("#Conveno_Legend_Wrapper .left").addClass("hidden");
			$("#Conveno_Legend_Wrapper .toggler").addClass("hidden");
			$("#Conveno_Legend_Wrapper .right").addClass("hidden");
			$("#Conveno_Legend_Wrapper .center").css("background", "none");
		} else {
			$(".btn-legend").bind('click',
				function(){
					renderLegendHtmlBox();
				}
			);
		}
		
		//Tabs
		var tabs_html = '<li>'+
			'	<a href="#tabs-1" onclick="" class="Conveno_BtnCategory">'+
			'		<div class="left"></div>'+
			'		<div class="center">'+GetString("txtplaces")+'</div>'+
			'		<div class="right"></div>'+
			'	</a>'+
			'</li>';
		var tabs_content = '<div id="tabs-1" class="tab-content">'+
			'	<div class="Conveno_TopMenu hidden">'+
			'		<button class="Conveno_BtnMain1 hidden"><div class="normal"></div></button>'+
			'		<button class="Conveno_BtnBack hidden"><div class="normal"></div></button>'+
			'	</div>'+
			'</div>';
		if(numberOfPmkLevels()>0){
			tabs_html += '<li>'+
				'	<a href="#tabs-2" onclick="" class="Conveno_BtnLevel">'+
				'		<div class="left"></div>'+
				'		<div class="center">'+GetString("txtlevels")+'</div>'+
				'		<div class="right"></div>'+
				'	</a>'+
				'</li>';
			tabs_content += '<div id="tabs-2" class="tab-content">'+
				'	<div class="Conveno_TopMenu hidden">'+
				'		<button class="Conveno_BtnMain2 hidden"><div class="normal"></div></button>'+
				'		<button class="Conveno_BtnBack hidden"><div class="normal"></div></button>'+
				'	</div>'+
				'</div>';
		}
		$("#tabs ul").html( tabs_html );
		$("#tabs-content").html( tabs_content );
		$("#tabs").tabs();
		$("#tabs").bind("tabsselect", function(event, ui){
			if(ui.index==0){
				var clang = ConvenoCore.prototype.GetLanguage();
				if (ConvenoPage.prototype.IsRomanized(clang)) {
					$('.Conveno_ViewMenu').removeClass("hidden");
				}
			} else {
				$('.Conveno_ViewMenu').addClass("hidden");
			}
		});
		$("#tabs .Conveno_BtnCategory").bind("click", function(){
			$("#Conveno_ViewBtn").addClass("Conveno_BtnOrdered").removeClass("Conveno_BtnList");
			cvn.Display("ConvenoCategory", {cat_id:null});
		});
		$("#tabs .Conveno_BtnLevel").bind("click", function(){
			cvn.Display("ConvenoLevelSelect");
			current_caller="";
		});
		
		$("#tabs ul li:first-child a").addClass("first-child");
		$("#tabs ul li:last-child a").addClass("last-child");
	
		$("#tabs").removeClass("hidden");
		
		renderSearchEngine();
		
		$(".Conveno_TopMenu").removeClass("hidden");
		var clang = ConvenoCore.prototype.GetLanguage();
		if (ConvenoPage.prototype.IsRomanized(clang)) {
			$('.Conveno_ViewMenu').removeClass("hidden");
		}
		
		$("#Conveno_ViewBtn").click(function() {
			if($(this).hasClass("Conveno_BtnOrdered")){
				$(this).addClass("Conveno_BtnList").removeClass("Conveno_BtnOrdered");
				cvn.Display("ConvenoNameList");
			} else {
				$(this).addClass("Conveno_BtnOrdered").removeClass("Conveno_BtnList");
				cvn.Display("ConvenoCategory", {cat_id:null});
			}
		});
		
		$(".Conveno_BtnMain1").click(function() {
			if($("#Conveno_ViewBtn").hasClass("Conveno_BtnList")){
				cvn.Display("ConvenoNameList");
			} else {
				cvn.Display("ConvenoCategory", {cat_id:null});
			}
			resetToDefaultView();
		});
		$(".Conveno_BtnMain2").click(function() {
			cvn.Display("ConvenoLevelSelect");
			resetToDefaultView();
		});
		
		if (app_settings.showsurrounding) {
			$("#samePmk").css("display", "inline");
		} else {
			$("#samePmk").parent("li").css("display", "none");
		}
		
		cvn.AddListener("OnLanguageChanged", function(lang, oldlang) {
			app_settings.lang = lang;
			
			$(".Conveno_Legend").removeClass("done");
			var p = $("#samePmk").detach();

			var ul = $('<ul id="uSamePmk"><li></li></ul>');
			ul.find("li").append(p);
			//$(".Conveno_Legend").html(ul);
			
			$(".Conveno_Legend").find("ul").remove();
			$(".Conveno_Legend").append(ul);
			
			if (current_page=="ConvenoByLevel"){
				$("#uSamePmk").addClass("hidden");
				$("#uHideLabels").removeClass("hidden");
			} else {
				$("#uSamePmk").removeClass("hidden");
				$("#uHideLabels").removeClass("hidden");
			}
			
			var clang = ConvenoCore.prototype.GetLanguage();
			if (ConvenoPage.prototype.IsRomanized(clang)) {
				if (current_page=="ConvenoCategory" || current_page=="ConvenoNameList") {
					$('.Conveno_ViewMenu').removeClass("hidden");
					if(current_page=="ConvenoNameList"){
						$("#Conveno_ViewBtn").addClass("Conveno_BtnList").removeClass("Conveno_BtnOrdered");
					} else {
						$("#Conveno_ViewBtn").addClass("Conveno_BtnOrdered").removeClass("Conveno_BtnList");
					}
				}
			} else {
				$('.Conveno_ViewMenu').addClass("hidden");
			}
			
			UpdateCommonElements(lang, oldlang);
			
			//update pmk content with the new language
			var jsobj = cvn.GetData();
			var arrpmk = jsobj.pmk;
			var PMK  = ConvenoConst.PMK;
			for (var pmk_id in arrpmk){
				var desc = cvn.GetString( arrpmk[pmk_id][PMK.CONTENT_SID], arrpmk[pmk_id][PMK.CONTENT] );
				descArr[pmk_id] = desc;
			}
			
			if(mygerm.IsCalloutOpen()){
				var desc = cvn.GetString( arrpmk[current_pmk_id][PMK.CONTENT_SID], arrpmk[current_pmk_id][PMK.CONTENT] );
				if($('.Conveno_Description').length){
					$('.Conveno_Description').html(desc);
					
					if(mygerm.IsCalloutOpen() && typeof cvn_germ.map_id_gpmk[current_pmk_id]!=undefined){
						if(mygerm.GetActivePlacemark().GetHandle()!=gpmkFloat.GetHandle()){
							mygerm.UnsetActivePlacemark();
							reopencallout=true;
							cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[current_pmk_id]);
						}
					}
				}
			}
		});

		// populate language options
		var jsobj = cvn.GetData();
		var pri_lang = jsobj.app[ConvenoConst.APP.PRI_LANG] ? jsobj.app[ConvenoConst.APP.PRI_LANG] : "en";
		var langcol = [];
		langcol[pri_lang] = true;

		// search for list of languages in string table
		for (var i in jsobj.str) {
			var hash = jsobj.str[i];
			for (var j in hash) {
				langcol[j] = true;
			}
		}

		var opt = [];
		for (var i in langcol) {
			opt.push( i );
		}
		var selected_lang = (app_settings.lang) ? app_settings.lang : 'en';
		$("body").addClass(selected_lang);
		$("#Conveno_Lang_Wrapper").removeClass("hidden");
		$("#lang-selected").html( GetString(selected_lang, selected_lang) );
		
		if(!mygerm){
			$('body').addClass('is2d');
			$('#lang-bar').append('<ul id="lang-options" class="hidden"></ul>');
		} else {
			var html = '<div id="germLangDiv" style="position: absolute; left: 67px; top: -1px; width: 102px; height: 0px; z-index: 2003; overflow: hidden; display: block;"><ul id="lang-options" class="hidden"></ul></div>' +
						'<iframe scrolling="no" id="germLangIframe" style="z-index: 2002; margin: 0px; padding: 0px; overflow: auto; position: absolute; border: 0pt none; background-color: rgb(255, 255, 255); width: 102px; height: 0px; top: -1px; left: 67px; display: block;"></iframe>';
			$('#germdiv').children('div').append( html );
		}
		var langopt = $("#lang-options");
		for (var i in opt) {
			var lang = opt[i];
			if(lang!=selected_lang){
				var elem = $("<li><a href=\"javascript:void(0);\">" + GetString(lang, lang) + "</a></li>");
				elem.children("a").addClass(lang);
				elem.click( (function(lang) {
					return function() {
						if(current_page=="ConvenoGuide"){ updateConvenoGuideDOM=true; }
						cvn.SetLanguage(lang);
						cvn.Refresh();
						if(mygerm){
							$('#germLangDiv').css('height', '0px');
							$('#germLangIframe').css('height', '0px');
							$('#lang-bar').removeClass('selected');
							$('#lang-selected-wrapper').removeClass('selected');
							$('#lang-options').addClass('hidden');
						} else {
							if(BrowserDetect.browser.toLowerCase()=="explorer"){
								$('#lang-bar').removeClass('selected');
								$('#lang-selected-wrapper').removeClass('selected');
								$('#lang-options').addClass('hidden');
							}
						}
						updateCalloutContent();
						renderSearchEngine();
					};
				})(lang) );
				langopt.append(elem);
			}
		}
		
		if($('#lang-options').html()!="" && !app_settings.singlelanguage){
			$('#lang-bar').bind('click', function(){
				if($(this).hasClass("selected")){
					$(this).removeClass('selected');
					$('#lang-selected-wrapper').removeClass('selected');
					if(mygerm){
						$('#germLangDiv').css('height', '0px');
						$('#germLangIframe').css('height', '0px');
					}					
					$('#lang-options').addClass('hidden');
				} else {
					$(this).addClass('selected');
					$('#lang-selected-wrapper').addClass('selected');
					$('#lang-options').removeClass('hidden');
					
					if(mygerm){
						$('#germLangDiv').css('left', $('#lang-selected').position().left-1+'px');
						$('#germLangIframe').css('left', $('#lang-selected').position().left-1+'px');
						$('#germLangDiv').css('height', $('#lang-options').height()+2+'px');
						$('#germLangIframe').css('height', $('#lang-options').height()+2+'px');
					}
				}
			});
			$('#lang-selected-wrapper').bind('mouseover', function(){ $(this).addClass('hover'); });
			$('#lang-selected-wrapper').bind('mouseout', function(){ $(this).removeClass('hover'); });
			$('#lang-options li').bind('mouseover', function(){ $(this).addClass('hover'); });
			$('#lang-options li').bind('mouseout', function(){ $(this).removeClass('hover'); });
		} else {
			$('#lang-bar').addClass('disabled');
			$('.btn-language').addClass("hidden");
		}
	}
	
	myLayout.resizeAll();
	
	if (!app_settings.is3d) {
		cvn = CreateConvenoInstance("#main");
		postInit();
		cvn.Display();
	} else {
		Germanium.CreateInstance("germdiv", function(webcontrol) {
			// hack to make sure germanium resolves to base href set
			var baseTag = document.getElementsByTagName("base");
			if (baseTag) {
				webcontrol.SetDocumentBase(baseTag[0].href);
			}
			
			mygerm = webcontrol;
			germ = webcontrol;
			cvn = CreateConvenoInstance("#main");

			cgerm = new ConvenoGerm(cvn, webcontrol);
			cgerm.Initialize(app_settings, 
				//success
				function() {
					//Show surroundings
					var cb = $("#cbSamePmk");
					cb.click(function() {
						cgerm.SetSameLevelVisibility( cb.attr("checked") );
						cgerm.UpdatePlacemarksVisibility();
					});
					$("#aSamePmk").click(function() {
						cb.attr( "checked", !cb.attr("checked") ); // toggle checkbox
						cgerm.SetSameLevelVisibility( cb.attr("checked") );
						cgerm.UpdatePlacemarksVisibility();
					});
					
					//Hide labels
					var cb2 = $("#cbHideLabels");
					cb2.click(function() {
						hidePmkLabels( cb2.attr("checked") );
					});
					$("#aHideLabels").click(function() {
						cb2.attr( "checked", !cb2.attr("checked") ); // toggle checkbox
						hidePmkLabels( cb2.attr("checked") );
					});
					
					postInit();
					cvn.Display();
					
					if(typeof pngfix!="undefined") { pngfix(); }
					
				},
				//failed
				function(errmsg) {
							try {
								if(cvn_timer) clearInterval(cvn_timer);
								if(cvn_germ) cvn_germ.Deinitialize();
								$('#germdiv').remove();
							} catch (e) {
							}
							
							var html = 
							'<div style="padding: 1em 0 0 0;">'+
							'<div id="germdiv" style="width: 200px; height: 150px; float: right;"></div>'+
							'<div style="height: 150px;">Alternatively you may wish to check your GermaniumWeb proxy settings'+
							'<ol style="font-size: smaller">'+
							'<li>Right-click on the blue box on the right and select Settings</li>'+
							'<li>Click on the third tab <img src="theme/3band/germ-err-btn3.png" style="border:solid 1px gray; vertical-align: bottom;"></li>'+
							'<li>Check and modify your proxy settings</li>'+
							'<li>Apply to save changes</li>'+
							'<li>Reload this page</li>'+
							'</ol>'+
							'</div>' + 
							'</div>';
							
							OutputErrorPage(errmsg);
							$("#err-content").append( html );
							
							Germanium.CreateInstance("germdiv",function(germ) {
								var opt = germ.GetOptions();
								opt.SetEyeControlsVisible(false);
								opt.SetGridVisibility(false);
								opt.SetBackgroundColor("#3288EA");
								germ.SetNavigationMode(Germanium.Navigation.Disabled);
							});
							
//							var msg = "Error\n-------\n\n"+errmsg+"\n\n"+
//								"Please email the above message to support@conveno.com for assistance";
//							alert(msg);
			});
			cvn_germ = cgerm;
		}, function(errmsg, errcode) { OutputGermErrorPage(errmsg, errcode); });
	}
}

//Create CONVENO
	if (typeof window.CreateConvenoInstance != 'function') {

		function CreateConvenoInstance(contentdiv)
		{
			//jsobj.dataset["_"] = "dataset/30/CGH-w-human1.xlcl"; //dataset/30/CGH-w-human.xlcl
			cvn = new ConvenoCore(jsobj, { 
				"contentdiv" : contentdiv
			}, app_settings );
			cvn.AddPage( new ConvenoApp(cvn) );
			cvn.AddPage( new ConvenoCategory(cvn) );
			cvn.AddPage( new ConvenoPlacemark(cvn) );
			cvn.AddPage( new ConvenoPath(cvn) );
			cvn.AddPage( new ConvenoGuide(cvn) );
			cvn.AddPage( new ConvenoLevelSelect(cvn) );
			cvn.AddPage( new ConvenoByLevel(cvn) );
			cvn.AddPage( new ConvenoNameList(cvn, {
				"A": ["a", "a"],
				"B": ["b", "b"],
				"C": ["c", "c"],
				"D": ["d", "d"],
				"E": ["e", "e"],
				"F": ["f", "f"],
				"G": ["g", "g"],
				"H": ["h", "h"],
				"I": ["i", "i"],
				"J": ["j", "j"],
				"K": ["k", "k"],
				"L": ["l", "l"],
				"M": ["m", "m"],
				"N": ["n", "n"],
				"O": ["o", "o"],
				"P": ["p", "p"],
				"Q": ["q", "q"],
				"R": ["r", "r"],
				"S": ["s", "s"],
				"T": ["t", "t"],
				"U": ["u", "u"],
				"V": ["v", "v"],
				"W": ["w", "w"],
				"X": ["x", "x"],
				"Y": ["y", "y"],
				"Z": ["z", "z"]
			}) );
			
//elog is now created in cvn3.js			
//            elog = EventLog.CreateConvenoHelper(cvn, "ksk");
            
			cvn.AddListener("OnPageReady", function(pageName, param) {
				if(mygerm){
					if (mygerm.GetEye().IsRotating()) {
						mygerm.GetEye().DisableRotation();
					}
				}
				
				bindCommonButtons();
				
				current_page = pageName;
				last_step=false;
				
				if(typeof param!="undefined"){
					if(param.pmk_id) current_pmk_id = param.pmk_id;
					if(param.cat_id) current_cat_id = param.cat_id;
				}
				
				//render mainmenu desc
				if (pageName!="ConvenoCategory"){
					renderMainmenuDesc();
				}
				
				//disable legend if page = ConvenoByLevel
				if (pageName=="ConvenoByLevel"){
					$("#aHideLabels").text( GetString("txthidelabels") );
					$("#uSamePmk").addClass("hidden");
					$("#uHideLabels").removeClass("hidden");
				} else {
					$("#uSamePmk").removeClass("hidden");
					$("#uHideLabels").removeClass("hidden");
				}
				
				//reset to default view
				if ((pageName=="ConvenoCategory" && param.cat_id==mainmenu_id) || pageName=="ConvenoNameList" || pageName=="ConvenoLevelSelect"){
					resetToDefaultView();
				}
				
				/*
				//enable/disable placemark click
				if(cvn_germ){
					var jsobj = cvn.GetData();
					var arrpmk = jsobj.pmk;
					if(current_page!="ConvenoPath" && current_page!="ConvenoGuide"){
						for (var pmk_id in arrpmk){
							cvn_germ.map_id_gpmk[pmk_id].SetInteractivity(true);
						}
					} else {
						for (var pmk_id in arrpmk){
							cvn_germ.map_id_gpmk[pmk_id].SetInteractivity(false);
						}
					}
				}*/
		
				if (pageName=="ConvenoCategory" || pageName=="ConvenoByLevel"){
					current_path_mode="std";
				}
				
				if(mygerm){
					if (pageName!="ConvenoGuide" && pageName!="ConvenoPath"){
//						mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
						$('#htmlBoxPositioner1').remove();
						$('#htmlBoxContentIframe1').remove();
					}
					if (pageName!="ConvenoGuide" && pageName!="ConvenoPath" && pageName!="ConvenoPlacemark"){
						mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
					}
				}
		
				if (pageName=="ConvenoGuide" || pageName=="ConvenoPath" || pageName=="ConvenoPlacemark"){
					$(".Conveno_BtnMain1").removeClass("hidden");
					$(".Conveno_BtnMain2").removeClass("hidden");
					bindPathButtons();
				}
				if (pageName=="ConvenoNameList"){ $(".Conveno_BtnMain1").addClass("hidden"); }
				if (pageName=="ConvenoLevelSelect"){ $(".Conveno_BtnMain2").addClass("hidden"); }
				if (pageName=="ConvenoByLevel"){
					$(".Conveno_BtnMain2").removeClass("hidden");
				}
				
				if (pageName=="ConvenoCategory" || pageName=="ConvenoLevelSelect" || pageName=="ConvenoByLevel"){
					$('#main ul li:first-child').addClass('first-child');
					$('#main ul li:last-child').addClass('last-child');
				}
				
				myLayout.resizeAll();
			});
			
			cvn.AddListener("OnContentUpdated", function(pageName, param){
				if(mygerm){
					if(pageName=="ConvenoPlacemark"){
						if(placemarkIsClicked===true){
							placemarkIsClicked=false;
						} else {
							showPlacemarksLabel();
						}
						reopencallout=true;
					}
					
					if(pageName=="ConvenoByLevel"){
						updateBuildingView(param);
					}
				}
				
				//if (pageName=="ConvenoPlacemark" || pageName=="ConvenoPath" || pageName=="ConvenoGuide") {
/*					
					if(!(BrowserDetect.browser.toLowerCase()=="explorer" && parseInt(BrowserDetect.version)<=7)){
						if($('.scroll-pane').length){
							$('.scroll-pane').jScrollPane({
								showArrows:true
								//,verticalDragMinHeight: 76
								//,verticalDragMaxHeight: 76
								//,horizontalDragMinWidth: 76
								//,horizontalDragMaxWidth: 76
							});
						}
					}
*/					
					
					/*if($('.scroll-pane').length){
						if(api){
							//alert('2');
							api.reinitialise();
						} else {
							//alert('1st');
							var settings = {
								showArrows: true
							};
							var pane = $('.scroll-pane');
							pane.jScrollPane(settings);
							api = pane.data('jsp');
						}
					}*/
					
					if(mygerm){
						if (pageName=="ConvenoPlacemark") {
							active_pmk=null;
							
							//make the selected placemark bounce
							bouncing_pmk_holder = cgerm.map_id_gpmk[param.pmk_id];
							bouncing_pmk = new Bouncer(16);
							bouncing_pmk.Start(bouncing_pmk_holder);
							
							mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
							mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, (function(pmk_id) {
								return function() {
									cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[pmk_id]);
								}
							})(param.pmk_id));
						} else {
							if(typeof bouncing_pmk!="undefined"){
								bouncing_pmk.Stop();
								if(mygerm.IsCalloutOpen()) mygerm.CloseCallout();
							}
						}
					}
					
				//}
				
				if(typeof pngfix!="undefined") { pngfix(); }
				
				//slideshow
				if (pageName=="ConvenoPath"){
					current_path_index = param.path_index;
					current_guide_index = 0;
				} else if (pageName=="ConvenoGuide"){
					current_guide_index = param.guide_index;
				}
				
				if(mygerm){
					if (pageName=="ConvenoGuide"){
						var path = jsobj.path[param.path_index];
						var path_length = path.guide.length;
						
						$('.btn-prev').addClass("disabled");
						$('.btn-next').addClass("disabled");
			
						if(param.guide_index < path_length){
							mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, (function(page, p_idx, g_idx, path_length) {
								return function() {
									is_gliding=false;
									if(slideshow==true){
										$('.btn-prev').addClass("disabled");
										$('.btn-next').addClass("disabled");
											
										$('.btn-pause').removeClass("hidden");
										$('.btn-first').removeClass("disabled");
										$('.btn-last').removeClass("disabled");
										$('.btn-play').addClass("hidden");
										$('.btn-replay').addClass("hidden");
									} else {
										if(g_idx==0){
											$('.btn-prev').addClass("disabled");
											$('.btn-next').removeClass("disabled");
										} else if(g_idx<path_length){
											$('.btn-prev').removeClass("disabled");
											$('.btn-next').removeClass("disabled");
										}
										$('.btn-pause').addClass("hidden");
										$('.btn-first').removeClass("disabled");
										$('.btn-last').removeClass("disabled");
										$('.btn-play').removeClass("hidden");
										$('.btn-replay').addClass("hidden");
									}
									
									clearTimeout(t_slideshow);
									t_slideshow = setTimeout( (function(page, p_idx, g_idx, path_length){
										return function() {
											if(slideshow==true){
												param.pmk_id = current_pmk_id;
												param.cat_id = current_cat_id;
												param.path_index = p_idx;
												param.guide_index = g_idx+1;
												//__log("Guide index="+param.guide_index);
												cvn.Display(page, param, current_caller);
											}
										}
									})(page, p_idx, g_idx, path_length), slideshow_pause );
								}
							})("ConvenoGuide", param.path_index, param.guide_index, path_length) );
						}
					}
				}
			});
				
			var core;
			core = cvn;
			core.AddListener("ConvenoGerm.Ready", function(_cgerm) {
				cgerm = _cgerm;
				
				mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, openCalloutMenu);
				mygerm.AddEventHandler(Germanium.Event.OnGlideCancelled, openCalloutMenu);
				//mygerm.AddEventHandler(Germanium.Event.OnCalloutOpened, attachContent);
				//mygerm.AddEventHandler(Germanium.Event.OnPlacemarkDeactivate, detachContent);
				mygerm.AddEventHandler(Germanium.Event.OnMouseDown, function() { bMouseDown=true; });
				mygerm.AddEventHandler(Germanium.Event.OnMouseUp, function() { bMouseDown=false; });
				//mygerm.AddEventHandler(Germanium.Event.OnCalloutOpened, function(){ alert('attachContent'); });
				//mygerm.AddEventHandler(Germanium.Event.OnPlacemarkActivated, function(){ alert('attachContent'); });
				
			if (Germanium.GetAPIVersion()>mygerm.CreateVersion(1,5,0,0)) {
				mygerm.AddEventHandler(Germanium.Event.OnCalloutOpened, function(){
					//Return if callout is guide text
					if(mygerm.GetActivePlacemark().GetHandle()==gpmkFloat.GetHandle()){
						return;
					}
					
					//Close callout if pmk desc is empty
					if(descArr[current_pmk_id]==""){
						mygerm.CloseCallout();
					} else {
						if(current_page=="ConvenoGuide"){
							setTimeout(function(){
								//stop bouncing when callout opened
								if(typeof bouncing_pmk!="undefined") bouncing_pmk.Stop();
								$('.Conveno_BtnViewInfo').children('div').text(GetString("txthideinfo"));
								attachContent();
							}, 100);
						} else {
							//stop bouncing when callout opened
							if(typeof bouncing_pmk!="undefined") bouncing_pmk.Stop();
							$('.Conveno_BtnViewInfo').children('div').text(GetString("txthideinfo"));
							
							if(hide_callout==true){
								mygerm.CloseCallout();
							} else {
								attachContent();
							}
						}
						
						/*console.log(desccallout.outerHeight()+" - "+$('.ConvenoGerm_Wrapper').height());
						if(reopencallout==true){
							if(desccallout.outerHeight()!=$('.ConvenoGerm_Wrapper').height() && desccallout.outerHeight()!=0){
								var wrapper = $(".ConvenoGerm_Wrapper");
							console.log(wrapper);
								wrapper.css({"width":desccallout.outerWidth()+"px","height":desccallout.outerHeight()+"px"});
								
								//__log('diff size');
								mygerm.CloseCallout();
								setTimeout(function(){
									mygerm.OpenActivePlacemarkCallout();
									//mygerm.UnsetActivePlacemark();
									//cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[current_pmk_id]);
								}, 250);
								return;
							} else {
								//__log('same size: '+desccallout.outerHeight()+' - '+$('.ConvenoGerm_Wrapper').height());
								reopencallout=false;
							}
						}
						attachContent();*/
					}
				});
			} else {			
				mygerm.AddEventHandler(Germanium.Event.OnPlacemarkActivated, function(){
					//Return if callout is guide text
					if(mygerm.GetActivePlacemark().GetHandle()==gpmkFloat.GetHandle()){
						return;
					}
					
					//Close callout if pmk desc is empty
					if(descArr[current_pmk_id]==""){
						mygerm.CloseCallout();
					} else {
						//stop bouncing when callout opened
						if(typeof bouncing_pmk!="undefined") bouncing_pmk.Stop();
						$('.Conveno_BtnViewInfo').children('div').text(GetString("txthideinfo"));
						
						if(reopencallout==true){
							if(desccallout.outerHeight()!=$('.ConvenoGerm_Wrapper').height()){
								//__log('diff size');
								mygerm.CloseCallout();
								setTimeout(function(){
									mygerm.UnsetActivePlacemark();
									cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[current_pmk_id]);
								}, 250);
								return;
							} else {
								//__log('same size: '+desccallout.outerHeight()+' - '+$('.ConvenoGerm_Wrapper').height());
								reopencallout=false;
							}
						}
						attachContent();
					}
				});
			}
			/*mygerm.AddEventHandler(Germanium.Event.OnGlideStarted, function(){
//				mygerm.UnsetActivePlacemark();
				//if(mygerm.IsCalloutOpen()) mygerm.CloseCallout();
			});*/
			mygerm.AddEventHandler(Germanium.Event.OnEyeMoved, function(){
				mygerm.UnsetActivePlacemark();
				//if(mygerm.IsCalloutOpen()) mygerm.CloseCallout();
				//if(typeof bouncing_pmk!="undefined" && cvn_germ.map_id_gpmk[current_pmk_id]) bouncing_pmk.Start(cvn_germ.map_id_gpmk[current_pmk_id]);
			});
			mygerm.AddEventHandler(Germanium.Event.OnCalloutCloseButtonClicked, function(){
				if(typeof bouncing_pmk!="undefined" && cvn_germ.map_id_gpmk[current_pmk_id]) bouncing_pmk.Start(cvn_germ.map_id_gpmk[current_pmk_id]);
				$('.Conveno_BtnViewInfo').children('div').text(GetString("txtviewinfo"));
			});
			//mygerm.AddEventHandler(Germanium.Event.OnCalloutOpened, function(){ __log("2 - OnCalloutOpened"); });
		/*	mygerm.AddEventHandler(Germanium.Event.OnPlacemarkDeactivate, function(){
				if(typeof bouncing_pmk!="undefined") bouncing_pmk.Stop();
			});*/
			//mygerm.AddEventHandler(Germanium.Event.OnCalloutClose, function(){ __log("*B* - onCalloutClose"); });
			//mygerm.AddEventHandler(Germanium.Event.OnCalloutClosed, function(){ __log("*C* - onCalloutClosed"); });
			//mygerm.AddEventHandler(Germanium.Event.OnPlacemarkDeactivated, function(){ __log("*D* - onPlacemarkDeactivated"); });
				
				// start polling
				cvn_timer = setInterval(function() { pollStateChanges(); }, ConvenoConst.EYE_STABLE_PERIOD/2);
				
				// add placemark for CalloutMenu
				var dstyle = mygerm.CreateDiamondStyle(null,0.0001,0.0001,0.0001);
				
				// create floating placemark
				dstyle = mygerm.CreateDiamondStyle(null,0.0001,0.0001,0.0001);
				gpmkFloat = mygerm.CreatePlacemark("");
				gpmkFloat.SetContent( "<div class='ConvenoGerm_Wrapper'></div>" );
				gpmkFloat.GetStyleSet().SetGeometryStyle(dstyle);
				mygerm.AddPlacemark(gpmkFloat);
				gpmkFloat.Hide();

				// set balloon style
				if (mygerm.CreateBalloonStyle) {
					var balloonStyle = mygerm.CreateBalloonStyle();
					balloonStyle.SetCloseButtonVisibility(false);
					balloonStyle.SetOutlineColor("cccccc");
					gpmkFloat.GetStyleSet().SetBalloonStyle(balloonStyle);
				}
				
				//enable placemark click
				var jsobj = cvn.GetData();
				var arrpmk = jsobj.pmk;
				//__dump(cgerm);
				for (var pmk_id in arrpmk){
					cgerm.map_id_gpmk[pmk_id].SetInteractivity(true);
					
					// set balloon style
					if (mygerm.CreateBalloonStyle) {
						var balloonStyle = mygerm.CreateBalloonStyle();
						balloonStyle.SetCloseButtonVisibility(true);
						balloonStyle.SetOutlineColor("cccccc");
						cgerm.map_id_gpmk[pmk_id].GetStyleSet().SetBalloonStyle(balloonStyle);
					}
					
					var PMK  = ConvenoConst.PMK;
					var desc = cvn.GetString( arrpmk[pmk_id][PMK.CONTENT_SID], arrpmk[pmk_id][PMK.CONTENT] );
					descArr[pmk_id] = desc;
					
					//cgerm.map_id_gpmk[pmk_id].GetStyleSet().GetGeometryStyle().SetHotspotY("0%");
				}
			});
			
			return cvn;
		}
	}
	
	function $PrependMenuHeader(content) {
		var pageName = content.attr('class').split(" ")[0];
		if (pageName!="ConvenoPlacemark" && pageName!="ConvenoPath" && pageName!="ConvenoGuide") {
			if(pageName=="ConvenoLevelSelect"){
				$(".Conveno_GroupList").addClass("scroll-pane");
			} else if(pageName=="ConvenoByLevel"){
				$(".Conveno_PlacemarkList").addClass("scroll-pane");
			} else if(pageName=="ConvenoCategory"){
				$(".Conveno_Category_Wrapper").addClass("scroll-pane");
			} else if(pageName=="ConvenoNameList"){
				$(".Conveno_NameGroupList").addClass("scroll-pane");	
			} else {
				content.html( '<div class="scroll-pane">' + content.html() + '</div>' );
			}
		}
		
		if (pageName!="ConvenoCategory" && pageName!="ConvenoNameList") {
			$('.Conveno_ViewMenu').addClass("hidden");
			/*$('#main').css('margin-top', '-4px');*/
		} else {
			var clang = ConvenoCore.prototype.GetLanguage();
			if (ConvenoPage.prototype.IsRomanized(clang)) {
				$('.Conveno_ViewMenu').removeClass("hidden");
			}
			$('#main').css('margin-top', '0');
		}
	}

	function $MakeListItemClickable(selector) {
		$(selector + " li").each(function() {
			var e = $(this);
			var anchor = e.find("a");

			//var txt = e.text();
			//var txt = e.find("span.Conveno_Name").text();
			//if (txt.length>40) e.find("span.Conveno_Name").css("font-size", "15px"); //for cgh

			e.addClass("normal");

			if (!e.hasClass("disabled")) {

				e.hover(
					function() {
						$(this).removeClass("normal");
						$(this).addClass("hover");
					},
					function() {
						$(this).addClass("normal");
						$(this).removeClass("hover");
					}
				);


				e.click(function() {
					anchor.click();
				});

			}

		});
	}
	
	ConvenoCategory.prototype.UpdateDom = function(param, caller) {
		__log("ConvenoCategory.UpdateDom.override");
		
		var core = ConvenoCore.prototype;
		var s =
			'<div class="Conveno_Title">' +
			'	<span class="Conveno_Icon"></span>' +
			'	<span class="Conveno_Name"></span>' +
			'</div>' +
			//'<div class="Conveno_Description"></div>' +
			'<div class="Conveno_Category_Wrapper">' +
			'	<div class="Conveno_CategoryList"></div>' +
			'	<div class="Conveno_PlacemarkList"></div>' +
			'</div>';
		
		core.SetContentHtml(s);

		// hack to make it possible to do per-category customization
		core.GetContentObject().addClass("cat_id-" + param.cat_id);
		
		$PrependMenuHeader( $(".ConvenoCategory") );
	};
	
	ConvenoCategory.prototype.UpdateContent = function(param, caller) {
		__log("ConvenoCategory.UpdateContent.override");
		
		var core = ConvenoCore.prototype;
		var jsobj = core.GetData();
		var contentdiv = core.GetContentObject();
		var rows = jsobj.cat;
		var cat_id = param.cat_id;
		var that = ConvenoPage.prototype;
		var CAT  = ConvenoConst.CAT;
		var PMK  = ConvenoConst.PMK;
		
		// create "command" object for the current method (as caller to other pages)
		var fnCurrent = (function(param, caller) {
				return function() { 
					core.Display(that.name, param, caller); 
				};
		})(param, caller);

		that.SetHtmlIf( rows[cat_id][CAT.ICON_PATH], $(".Conveno_Icon").get(0), '<img src="'+rows[cat_id][CAT.ICON_PATH]+'" border=0>');
		
		var name = core.GetString( rows[cat_id][CAT.NAME_SID], rows[cat_id][CAT.NAME] );
		that.SetHtmlIf( name, contentdiv.find(".Conveno_Name"), name);

		var desc = core.GetString( rows[cat_id][CAT.CONTENT_SID], rows[cat_id][CAT.CONTENT] );
		//that.SetHtmlIf( desc, contentdiv.find(".Conveno_Description"), desc);

		// populate categories
		var output = core.GetSubcategories(param.cat_id);
		if (!output || output.length==0) {
			$(".Conveno_CategoryList").addClass("hidden");
		} else {
//		$(".Conveno_CategoryList").removeClass("hidden");
			var ul = $("<ul></ul>");

			for (var i in output) {
				var str = '<li><a href="javascript:void(0);">';
				if (output[i][CAT.ICON_PATH]) {
					str += '<span class="Conveno_Icon">';
					str += '<img src="' + output[i][CAT.ICON_PATH] + '" border=0>';
					str += '</span>';
				}
				str += '<span class="Conveno_Name">';
				str += core.GetString( output[i][CAT.NAME_SID], output[i][CAT.NAME] ); // str += output[i][CAT.NAME];
				str += '</span>';
				str += "</a></li>";

				var elem = $(str);
				elem.find("a").click( (function(cat_id) {
					return function() { core.Display("ConvenoCategory", { "cat_id" : cat_id }, fnCurrent); }
				})(output[i][CAT.CAT_ID]) );
				elem.appendTo(ul);
			}

			var catlist = contentdiv.find(".Conveno_CategoryList");
			catlist.append(ul);
		}

		// populate placemarks
		output = core.GetPlacemarks(param.cat_id);
		if (!output || output.length==0) {
			$(".Conveno_PlacemarkList").addClass("hidden");
		} else {
//		$(".Conveno_PlacemarkList").removeClass("hidden");
			var ul = $("<ul></ul>");

			for (var i in output) {
				var str = '<li><a href="javascript:void(0);">';
				if (output[i][PMK.ICON_PATH]) {
					str += '<span class="Conveno_Icon">';
					str += '<img src="' + output[i][PMK.ICON_PATH] + '" border=0>';
					str += '</span>';
				}
				str += '<span class="Conveno_Name">';
				str += core.GetString( output[i][PMK.NAME_SID], output[i][PMK.NAME] ); // str += output[i][PMK.NAME];
				str += '</span>';
				str += '</a></li>';

				var elem = $(str);
				elem.find("a").click( (function(pmk_id) {
					return function() { core.Display("ConvenoPlacemark", { "pmk_id" : pmk_id, "cat_id" : cat_id }, fnCurrent); }
				})(output[i][PMK.PMK_ID]) );
				elem.appendTo(ul);
			}

			var pmklist = contentdiv.find(".Conveno_PlacemarkList");
			pmklist.empty().append(ul);
		}	

		//2009-12-10: assign [back] to parent's category if no caller
		if (!caller && rows[cat_id][CAT.PARENT_CAT_ID]!=null) {
			that.BindClick(".Conveno_BtnBack", function() {
				core.Display("ConvenoCategory", { "cat_id" : rows[cat_id][CAT.PARENT_CAT_ID] });
			});
			$(".Conveno_BtnBack").removeClass("hidden");
		}
		
		
		/* new additions */
		// turn li into clickable links
		$MakeListItemClickable(".Conveno_CategoryList");
		$MakeListItemClickable(".Conveno_PlacemarkList");
		
		if(BrowserDetect.browser.toLowerCase()=="explorer" && parseInt(BrowserDetect.version)<=6){
			$('.Conveno_CategoryList li a').each(function() {
				var e = $(this);
				var ico = e.children(".Conveno_Icon");
				if(!ico.length){
					e.prepend('<span class="Conveno_Icon" style="padding-right:0px;"></span>'); /* has to be added to fix a bug in IE6 */
				}
			});
		}
		
		if(mainmenu_id==0){
			mainmenu_id = cat_id;
			
			if(desc==""){
				$('#app-info .Conveno_Description_Wrapper').addClass('hidden');
				$('#app-info .readmore').addClass('hidden');
			}
			$("#app-info").removeClass("hidden");
		}
		
		if(desc){
			//resetting the state
			$('#app-info .Conveno_Description_Wrapper').css('height', '33px');
			$('.readmore a').html("Read more");
			
			$('#app-info .Conveno_Description_Wrapper').removeClass('hidden');
			$('#app-info .Conveno_Description').html(desc);
			setTimeout(function(){
				if($('#app-info .Conveno_Description').height() > 33){ //33px => .Conveno_Description_Wrapper height
					$('#app-info .readmore').removeClass('hidden');
				}
				onWestResized();
			}, 10);
		} else {
			renderMainmenuDesc();
		}
		
/*		
		if(!(BrowserDetect.browser.toLowerCase()=="explorer" && parseInt(BrowserDetect.version)<=7)){
			if($('.scroll-pane').length){
				$('.scroll-pane').jScrollPane({
					showArrows:true
					//,verticalDragMinHeight: 76
					//,verticalDragMaxHeight: 76
					//,horizontalDragMinWidth: 76
					//,horizontalDragMaxWidth: 76
				});
			}
		}
*/		
		
		if (typeof caller=="function") {
			$(".Conveno_BtnMain1").removeClass("hidden");
		} else {
			$(".Conveno_BtnMain1").addClass("hidden");
		}
		
		if(typeof caller!="undefined"){
			// create "command" object for the current method (as caller to other pages)
			var fnCurrent = (function(param, caller) {
					return function() { 
						cvn.Display("ConvenoCategory", param, caller); 
					};
			})(param, caller);
			current_caller = fnCurrent;
		}
	};
	
	ConvenoPath.prototype.UpdateDom = function(param, caller) {
		__log("ConvenoPath.UpdateDom.override");
		
		var core = ConvenoCore.prototype;
		var s =
		'<div class="Conveno_Title">' +
		'	<span class="Conveno_Icon"></span>' +
		'	<span class="Conveno_Name"></span>' +
		'</div>' +
		'<div class="Conveno_BBL">' +
		'	<span class="Conveno_You_Are_Here"></span>' + 
		'	<span class="Conveno_Building"></span>' + 
		'	<span class="Conveno_Block"></span>' + 
		'	<span class="Conveno_Level"></span>' + 
		'</div>' +
		'<div id="Conveno_ContentWrapper" class="scroll-pane">' + 
		'	<div class="Conveno_Description hidden"></div>' +
		'	<div id="viewinfo_wrapper" class="hidden"></div>' + 
		'	<div id="lookaround_wrapper" class="hidden"></div>' + 
		'	<div id="gettinghere_wrapper" class=""></div>' + 
		//'	<hr class="Conveno_Content_Separator Conveno_Separator hidden"></hr>' +	
		'	<div class="Conveno_GettingHere">' +
		'		<div id="PathMode"><button class="std"><div class="normal"></div></button><button class="wch hidden"><div class="normal"></div></button></div>' +
		'		<div class="Conveno_Text">How do I get here from:</div>'+
		'	</div>' + 
		'	<div id="Conveno_Guide">' +
		'		<div class="Conveno_GuideTitle"></div>' +
		'		<div class="Conveno_GuideInst"></div>' +
		'	</div>' +
		'</div>';
		core.SetContentHtml(s);

		// hack to make it possible to do per-path customization
		core.GetContentObject().addClass("path_index-" + param.path_index);
		
		$PrependMenuHeader( $(".ConvenoPath") );
	};
	
	ConvenoPath.prototype.UpdateContent = function(param, caller) {
		__log("ConvenoPath.UpdateContent.override");
		
		ConvenoPlacemark.prototype.UpdateContent(param, caller);
		renderConvenoGuidedSteps('ConvenoPath', param, caller);
		$('.Conveno_BtnViewInfo').children('div').text(GetString("txtviewinfo"));
		$('.Conveno_BtnGettingHere').children('div').text(GetString("txthidegettinghere"));
		
		if(typeof caller!="undefined") current_caller = caller;
	};
	
	
	
	ConvenoGuide.prototype.UpdateDom = function(param, caller) {
		__log("ConvenoGuide.UpdateDom.override");
		
		var core = ConvenoCore.prototype;
		var s =
		'<div class="Conveno_Title">' +
		'	<span class="Conveno_Icon"></span>' +
		'	<span class="Conveno_Name"></span>' +
		'</div>' +
		'<div class="Conveno_BBL">' +
		'	<span class="Conveno_You_Are_Here"></span>' + 
		'	<span class="Conveno_Building"></span>' + 
		'	<span class="Conveno_Block"></span>' + 
		'	<span class="Conveno_Level"></span>' + 
		'</div>' +
		'<div id="Conveno_ContentWrapper" class="scroll-pane">' + 
		'	<div class="Conveno_Description hidden"></div>' +
		'	<div id="viewinfo_wrapper" class="hidden"></div>' + 
		'	<div id="lookaround_wrapper" class="hidden"></div>' + 
		'	<div id="gettinghere_wrapper" class=""></div>' + 
		//'	<hr class="Conveno_Content_Separator Conveno_Separator hidden"></hr>' +	
		'	<div class="Conveno_GettingHere">' +
		'		<div id="PathMode"><button class="std"><div class="normal"></div></button><button class="wch hidden"><div class="normal"></div></button></div>' +
		'		<div class="Conveno_Text">How do I get here from:</div>'+
		'	</div>' + 
		'	<div id="Conveno_Guide">' +
		'		<div class="Conveno_GuideTitle"></div>' +
		'		<div class="Conveno_GuideInst"></div>' +
		'		<div class="Conveno_GuideAction">' +
		'			<span class="Conveno_GuideCount"></span>' +
		'		</div>' +
		'	</div>' +
		'</div>';
		core.SetContentHtml( s );

		// hack to make it possible to do per-path customization
		core.GetContentObject().addClass("path_index-" + param.path_index);
		
		$PrependMenuHeader( $(".ConvenoGuide") );

		/*$(".Conveno_BtnGuidePrev").html('<div class="normal"></div>');
		$(".Conveno_BtnGuideNext").html('<div class="normal"></div>');
		$(".Conveno_BtnGuideEnd").html('<div class="normal"></div>');*/
	};
				
	ConvenoGuide.prototype.UpdateContent = function(param, caller) {
		__log("ConvenoGuide.UpdateContent.override");
		
		ConvenoPlacemark.prototype.UpdateContent(param, caller);
		renderConvenoGuidedSteps('ConvenoGuide', param, caller);
		$('.Conveno_BtnGettingHere').children('div').text(GetString("txthidegettinghere"));
		
		if(typeof caller!="undefined") current_caller = caller;
	};

	ConvenoGuide.prototype.Execute = function(param, caller, bNoUpdatedNotify) {
		__log("ConvenoGuide.Execute.override");
		
		var thisPage = this;
		var core = ConvenoCore.prototype;
		var that = ConvenoPage.prototype;
		
		thisPage.lastparam = param;
		thisPage.lastcaller = caller;

		// OnPageBegin
		__log("OnPageBegin("+thisPage.name+")");
		if (param) __dump(param);

		core.Emit("OnPageBegin", thisPage.name, param);

		var contentdiv = core.GetContentObject();
		var className = thisPage.name;
		if (className == "/") className = "ConvenoApp";

//		if (!contentdiv.hasClass(className)) { //need to comment out for per-category hack to work
			var cur_class = contentdiv.attr("class");
			contentdiv.removeClass(cur_class);
			contentdiv.addClass(className);
//		}

		if(updateConvenoGuideDOM){
			thisPage.UpdateDom(param, caller);
			thisPage.SetCommonElements(param, caller);
			thisPage.UpdateContent(param, caller);
			updateConvenoGuideDOM=false;
		} else {
			renderConvenoCallout(className, param, caller);
			$(".Conveno_GuideInst").children("div").removeClass("selected");
			$(".Conveno_GuideInst").children("div").eq(param.guide_index).addClass("selected");
			
			//When auto-playing, scroll specific instruction into view w/ animation
			if(slideshow==true){
				if($('.Conveno_GuideInst div.selected').offset().top+$('.Conveno_GuideInst div.selected').height() > $(window).height()){
					$(".scroll-pane").scrollTo( ".Conveno_GuideInst div.selected", 1000, {} );
				}
			}
		}
		
		var jsobj = core.GetData();
		var path_index = param.path_index;
		var path = jsobj.path[path_index];
		var guide_index = param.guide_index;
		
		if(guide_index==path.guide.length){
			param.guide_index = path.guide.length;
			param.pmk_id = path.dst_pmk_id;
			
			/** Causing browser to crash **/
			//param.hide_path = 1;
			//core.Display("ConvenoPlacemark", param, caller);
				
			//$('.Conveno_GuideCount').css('display', 'none');
			
			//Update Prev/Next button
			/*var prev = contentdiv.find(".Conveno_BtnGuidePrev");
			var next = contentdiv.find(".Conveno_BtnGuideNext");
			var guide_index = param.guide_index;
			var path_index = param.path_index;
			
			//Prev button
			that.BindClick(prev, function() {
				param.path_index = path_index;
				param.guide_index = guide_index-1;
				core.Display("ConvenoGuide", param, caller);
			});
			
			//Next button
			next.addClass('Conveno_BtnGuideNext_disabled');
			next.attr('disabled', 'disabled');
			
			//Update selected class
			$('.Conveno_GuideInst div').removeClass('selected');
			$('.guide-end').addClass('selected');*/
			
			if(mygerm) ConvenoGerm.prototype.UpdatePlacemark({ pmk_id : param.pmk_id });
			//core.Emit("OnContentUpdated", thisPage.name, param);
			
			//mygerm.RemoveAllEventHandlers(Germanium.Event.OnPlacemarkActivated);
			//last step
			
			if(mygerm){
				clearTimeout(t_slideshow);
				mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
				mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, (function(pmk_id) {
					return function() {
						slideshow=false;
						is_gliding=false;
						
						$('.btn-prev').removeClass("disabled");
						$('.btn-next').addClass("disabled");
						
						$('.btn-pause').addClass("hidden");
						$('.btn-first').removeClass("disabled");
						$('.btn-last').addClass("disabled");
						$('.btn-play').addClass("hidden");
						$('.btn-replay').removeClass("hidden");
					}
				})(param.pmk_id) );
				
				//$('#htmlBoxPositioner1').remove();
				//$('#htmlBoxContentIframe1').remove();
				current_guide_index = param.guide_index;
				
				//make placemark bounce
				bouncing_pmk_holder = cgerm.map_id_gpmk[param.pmk_id];
				bouncing_pmk = new Bouncer(16);
				bouncing_pmk.Start(bouncing_pmk_holder);
				
				mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, (function(pmk_id){
					return function(){
						cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[pmk_id]);
						mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
					}
				})(param.pmk_id));
			}
		} else if (!bNoUpdatedNotify) {
			$('.Conveno_BtnViewInfo').children('div').text(GetString("txtviewinfo"));
			core.Emit("OnContentUpdated", thisPage.name, param);
		}

		// OnPageReady
		core.Emit("OnPageReady", thisPage.name, param);
		
		if(guide_index==path.guide.length){ last_step=true; }
	};

	ConvenoLevelSelect.prototype.UpdateDom = (function(fnOld) {
		return function(param, caller) {
			fnOld(param, caller);
			$PrependMenuHeader( $(".ConvenoLevelSelect") );
		};
	})(ConvenoLevelSelect.prototype.UpdateDom);
	
	ConvenoLevelSelect.prototype.UpdateContent = (function(fnOld) {
		return function(param, caller) {
			fnOld(param, caller);
			
			$(".ConvenoLevelSelect>.Conveno_Title>.Conveno_Name").text( GetString("txtlvlsel") );
			
			// turn li into clickable links
			$MakeListItemClickable(".Conveno_GroupList");
		};
	})(ConvenoLevelSelect.prototype.UpdateContent);
	
	/*
	 *	ConvenoNameList
	 */
	ConvenoNameList = (function() {

		var $that;
		var $core;
		var $hashgroup;
		var $groupdef;

		// create shortcuts
		var APP  = ConvenoConst.APP;
		var CAT  = ConvenoConst.CAT;
		var PMK  = ConvenoConst.PMK;
		var BLDG = ConvenoConst.BLDG;
		var BLOCK = ConvenoConst.BLOCK;
		var LEVEL = ConvenoConst.LEVEL;
		var VIEW = ConvenoConst.VIEW;
		var NODE = ConvenoConst.NODE;
		var EDGE = ConvenoConst.EDGE;
		var SEG  = ConvenoConst.SEG;
		var GUIDE= ConvenoConst.GUIDE;
		var STR  = ConvenoConst.STR;
		var TRANSITION = ConvenoConst.TRANSITION;
		var MAP_PMK_CAT  = ConvenoConst.MAP_PMK_CAT;

		// constructor
		function ConvenoNameList(core, groupdef) {
			ConvenoPage.call(this, core, "ConvenoNameList");
			$that = this;
			$core = core;

			$groupdef = groupdef;
			if (!$groupdef) { // assign default grouping if not defined
				$groupdef = {
					"A to F": [ "a", "f" ],
					"G to L": [ "g", "l" ],
					"M to S": [ "m", "s" ],
					"T to Z": [ "t", "z" ]
				};
			}
		}

		// inherit prototypes from parent
		ConvenoNameList.prototype = new ConvenoPage;

		ConvenoNameList.prototype.PreparePage = function(param) {
			__log("ConvenoNameList.PreparePage");

			var lang = $that.core.GetLanguage();
			if (!$that.IsRomanized(lang)) {
				return false;
			}

			//if ($hashgroup==undefined) {

				var jsobj = $core.GetData();

				//pmk to cat mapping
				var pmk_to_cat = {};
				for (var i in jsobj.map_pmk_cat) {
					var entry = jsobj.map_pmk_cat[i];
					var pmk_id = entry[MAP_PMK_CAT.PMK_ID];
					var cat_id = entry[MAP_PMK_CAT.CAT_ID];
					
					var hashcat = pmk_to_cat[ pmk_id ];
					if (!hashcat) {
						hashcat = {};
						pmk_to_cat[pmk_id] = hashcat;
					}

					var cat = jsobj.cat[ cat_id ];
					if (cat) {
						var bIsLegend = cat[CAT.IS_LEGEND];
						pmk_to_cat[pmk_id][cat_id] = bIsLegend;
					}
				}

				// create buckets and sort placemark into buckets
				$hashgroup = {};
				for (var g in $groupdef) {
					$hashgroup[g] = [];
				}
				//$hashgroup["Others"] = [];
				$hashgroup["0 - 9"] = [];
				
				for (var i in jsobj.pmk) {
					var pmk = jsobj.pmk[i];
					
					var name = $core.GetString( pmk[PMK.NAME_SID], pmk[PMK.NAME] );
					
					// omit placemarks that only belong to legend categories
					var pmk_id = pmk[PMK.PMK_ID];
					var isLegend = true;
					for (var cat_id in pmk_to_cat[pmk_id]) {
						if (pmk_to_cat[pmk_id][cat_id]==0) {
							isLegend = false;
							break;
						}
					}
					if (isLegend) {
						__log("(Is legend) Skipping "+pmk[PMK.NAME]);
						continue;
					}

					var firstChar = name.toLowerCase().charAt(0);

					// determine which bucket to put the placemark
					var bSlotted = false;
					for (var g in $groupdef) {
						var first = $groupdef[g][0];
						var last  = $groupdef[g][1];
						__log("first: " + first + "last: " + last);
						if (firstChar>=first && firstChar<=last) {
							$hashgroup[g].push(pmk);
							bSlotted = true;
							break;
						}
					}

					if (!bSlotted) {
						//$hashgroup["Others"].push(pmk);
						$hashgroup["0 - 9"].push(pmk);
					}
				}
			//}

			return true;
		}

		ConvenoNameList.prototype.UpdateDom = function(param, caller) {
			__log("ConvenoNameList.UpdateDom");

			var s = '<div class="Conveno_Title">' +
					'	<span class="Conveno_Icon"></span>' +
					'	<span class="Conveno_Name"></span>' +
					'</div>' +
					'<div class="Conveno_NameGroupList"></div>';
			$core.SetContentHtml(s);
			
			//New Addition
			$PrependMenuHeader( $(".ConvenoNameList") );
		}

		ConvenoNameList.prototype.UpdateContent = function(param, caller) {
			__log("ConvenoNameList.UpdateContent");

			var that = this;
			var fnCurrent = (function(param, caller) {
				return function() { 
					$core.Display($that.name, param, caller); 
				};
			})(param, caller);

			var jsobj = $core.GetData();
			var contentdiv = $core.GetContentObject();
			
			var rows = jsobj.cat;
			var cat_id = mainmenu_id;
			that.SetHtmlIf( rows[cat_id][CAT.ICON_PATH], $(".Conveno_Icon").get(0), '<img src="'+rows[cat_id][CAT.ICON_PATH]+'" border=0>');
			var name = $core.GetString( rows[cat_id][CAT.NAME_SID], rows[cat_id][CAT.NAME] );
			that.SetHtmlIf( name, contentdiv.find(".Conveno_Name"), name);
			
			// add groups
			var ul = $("<ul class='GroupName'></ul>");
			for (var i in $hashgroup) {
				if ($hashgroup[i].length>0) {
					var str = '<li><span>' + i + '</span></li>';
					var elem = $(str);
					elem.appendTo(ul);
					
					var ul2 = $("<ul class='PlacemarkName'></ul>");
					ul2.appendTo(elem);
					
					// sort placemarks
					var display_order = [];
					var j = 0;
					for (var k in $hashgroup[i]) {
						display_order[j++] = k;
					}
					$core.SortByIndex($hashgroup[i], display_order, PMK.NAME);
					// output
					var sorted_rows = [];
					for (var l in display_order) {
						sorted_rows.push( $hashgroup[i][ display_order[l] ] );
					}
					$hashgroup[i]=sorted_rows;
					for(var j in $hashgroup[i]){
						//var str2 = '<li><a href="javascript:void(0);">' + $hashgroup[i][j][1] + '</a></li>';
						var str2 = '<li><a href="javascript:void(0);">' + $core.GetString( $hashgroup[i][j][PMK.NAME_SID], $hashgroup[i][j][PMK.NAME] ) + '</a></li>';
						var elem2 = $(str2);
						elem2.find("a").click( (function(pmk_id) {
							return function() {
								$core.Display("ConvenoPlacemark", { 
									pmk_id : pmk_id
								}, fnCurrent);
							}
						})($hashgroup[i][j][0]) );
						elem2.appendTo(ul2);
					}
				}
			}

			contentdiv.find(".Conveno_NameGroupList").append(ul);
			
			// turn li into clickable links
			$MakeListItemClickable(".Conveno_NameGroupList .PlacemarkName");
			
			/*var e = $('.Conveno_NameGroupList .PlacemarkName li');
			e.hover(
				function() {
					$(this).removeClass("normal");
					$(this).addClass("hover");
				},
				function() {
					$(this).addClass("normal");
					$(this).removeClass("hover");
				}
			);*/
			
			/*
			//New Addition
			$(".ConvenoNameList>.Conveno_Title>.Conveno_Name").text( GetString("txtsel1") );
			
			$('.Conveno_GroupList').addClass('Conveno_NameGroupList').removeClass('Conveno_GroupList');
			$('.Conveno_NameGroupList li').find(":contains('Others')").parent("li").addClass('others');
			$('.Conveno_NameGroupList li').find(":contains('Others')").html('0 - 9');
			$('.Conveno_NameGroupList li').find(":contains('Y')").parent("li").css('margin-left', '175px');
			
			/*
			var core = ConvenoCore.prototype;
			var that = ConvenoPage.prototype;
			
			//Add back button
			that.BindClick(".Conveno_BtnBack", function() {
				core.Display("ConvenoFindAPlace");
			});
			$(".Conveno_BtnBack").removeClass("hidden");
			*/
			
			current_caller = fnCurrent;
		}

		return ConvenoNameList; // return constructor
	})();

	ConvenoByLevel.prototype.UpdateDom = (function(fnOld) {
		return function(param, caller) {
			fnOld(param, caller);
			$PrependMenuHeader( $(".ConvenoByLevel") );
			
			//$('.navbar_right').html('<div class="pagination"></div>');
		};
	})(ConvenoByLevel.prototype.UpdateDom);
	
	ConvenoByLevel.prototype.UpdateContent = (function(fnOld) {
		return function(param, caller) {
			fnOld(param, caller);

			// turn li into clickable links
			$MakeListItemClickable(".Conveno_PlacemarkList");
			
			if(typeof caller!="undefined"){
				// create "command" object for the current method (as caller to other pages)
				var fnCurrent = (function(param, caller) {
						return function() { 
							cvn.Display("ConvenoByLevel", param, caller); 
						};
				})(param, caller);
				current_caller = fnCurrent;
			}
		};
	})(ConvenoByLevel.prototype.UpdateContent);

	function UpdateCommonElements(lang, oldlang)
	{
		var name     = jsobj.app[ConvenoConst.APP.NAME];
		var name_sid = jsobj.app[ConvenoConst.APP.NAME_SID];
		if (name_sid) {
			var row = jsobj.str[ name_sid ];
			if (!lang) {
				lang = app_settings.lang;
			}
			if (row && row[lang])
				name = row[lang];
		}

		document.title = name;

		$(".txtlang").text( GetString("txtlang") + " :" );
		$(".txtPoweredBy").text( GetString("txtpow") );
		if (app_settings.showsurrounding) {
			$("#aSamePmk").text( GetString("txtsur") );
		}
		
		$("#aHideLabels").text( GetString("txthidelabels") );
		/*$("#bottom-bar-wrapper .title").text( GetString("txtlgd") );*/

		if(!oldlang) oldlang = 'en';
		$("body").removeClass(oldlang);
		$("body").addClass(lang);
		
		//recall cvn.Display() if page=Page/Guide
		/*if(current_page=="ConvenoPath" || current_page=="ConvenoGuide"){
			cvn.Display(current_page, current_param);
		}*/
		
		//Update lang-bar
		// populate language options
		var pri_lang = jsobj.app[ConvenoConst.APP.PRI_LANG] ? jsobj.app[ConvenoConst.APP.PRI_LANG] : "en";
		var langcol = [];
		langcol[pri_lang] = true;

		// search for list of languages in string table
		for (var i in jsobj.str) {
			var hash = jsobj.str[i];
			for (var j in hash) {
				langcol[j] = true;
			}
		}

		var opt = [];
		for (var i in langcol) {
			opt.push( i );
		}
		var selected_lang = (app_settings.lang) ? app_settings.lang : 'en';
		$("#lang-selected").html( GetString(selected_lang, selected_lang) );
		$("#lang-options").empty();
		var langopt = $("#lang-options");
		for (var i in opt) {
			var lang = opt[i];
			if(lang!=selected_lang){
				var elem = $("<li><a href=\"javascript:void(0);\">" + GetString(lang, lang) + "</a></li>");
				elem.children("a").addClass(lang);
				elem.click( (function(lang) {
					return function() {
						if(current_page=="ConvenoGuide"){ updateConvenoGuideDOM=true; }
						cvn.SetLanguage(lang);
						cvn.Refresh();
						if(mygerm){
							$('#germLangDiv').css('height', '0px');
							$('#germLangIframe').css('height', '0px');
							$('#lang-bar').removeClass('selected');
							$('#lang-selected-wrapper').removeClass('selected');
							$('#lang-options').addClass('hidden');
						} else {
							if(BrowserDetect.browser.toLowerCase()=="explorer"){
								$('#lang-bar').removeClass('selected');
								$('#lang-selected-wrapper').removeClass('selected');
								$('#lang-options').addClass('hidden');
							}
						}
						updateCalloutContent();
						renderSearchEngine();
					}; 
				})(lang) );
				langopt.append(elem);
			}
		}
		$('#lang-options li').bind('mouseover', function(){ $(this).addClass('hover'); });
		$('#lang-options li').bind('mouseout', function(){ $(this).removeClass('hover'); });
		
		$('#tabs .Conveno_BtnCategory .center').text(GetString("txtplaces"));
		$('#tabs .Conveno_BtnLevel .center').text(GetString("txtlevels"));
		
		$(".btn-email span.text").text( GetString("txtemail") );
		$(".btn-facebook span.text").text( GetString("txtfacebook") );
		$(".btn-twitter span.text").text( GetString("txttwitter") );
	}

	function DisableSelection(target) {
		if (typeof target.onselectstart!="undefined") //IE
			target.onselectstart=function(){return false}
		else if (typeof target.style.MozUserSelect!="undefined") //Firefox
			target.style.MozUserSelect="none"
		else //All other route (ie: Opera)
			target.onmousedown=function(){return false}
		target.style.cursor = "default"
	}

	ConvenoGerm.prototype.Zoom = function(event){
		return;
	}
	
	ConvenoGerm.prototype.OnPlacemarkClicked = function(event){
	//	if(current_page!="ConvenoPath" && current_page!="ConvenoGuide" && !mygerm.GetEye().IsGliding()){
		if(!mygerm.GetEye().IsGliding()){
			var pmk_handle = mygerm.GetActivePlacemark().GetHandle();
			if(cvn_germ.map_handle_pmk[ pmk_handle ]){
				var pmk_id = cvn_germ.map_handle_pmk[ pmk_handle ][0];
				//console.log(cvn_pmk);
				placemarkIsClicked = true;
				clearTimeout(callout_timer);
				
				var core = ConvenoCore.prototype;
				var jsobj = core.GetData();
				var pmk = jsobj.pmk[pmk_id];
				var PMK  = ConvenoConst.PMK;
				var desc = core.GetString( pmk[PMK.CONTENT_SID], pmk[PMK.CONTENT] ).toLowerCase();
				if(desc.indexOf("<img")!=-1){
					hide_callout=true;
				} else {
					hide_callout=false;
				}	
				cvn.Display("ConvenoPlacemark", { pmk_id:pmk_id, glide:false, setVisibility:false }, current_caller);
			}
		}
		return;
	}
	
	ConvenoGerm.prototype.UpdateGuide = function(param) {
		var $that = ConvenoGerm.prototype;
		var $jsobj = cvn.GetData();
		var $germ = mygerm;
		var $core = cvn;

		var path = $jsobj.path[ param.path_index ];
		var guide_index = param.guide_index ? param.guide_index : 0;
		var guide = path.guide[ param.guide_index ];
		
		if(!guide) return;
		
		// get segment
		var seg_id = guide[ConvenoConst.GUIDE.SEG_ID];
		var seg;
		for (var i in path.segment) {
			if (path.segment[i][ConvenoConst.SEG.SEG_ID]==seg_id) {
				seg = path.segment[i];
				break;
			}
		}

		// glide to view associated with guide
		var view_id = guide[ConvenoConst.GUIDE.VIEW_ID];
		if (view_id) {
			var view = $jsobj.view[ view_id ];
			if (view) {
//				var eyeparam = $ViewToEyeParam(view);
				var eyeparam = $germ.CreateEyeParams(view[0],view[1],view[2],view[3],view[4],view[5],view[6]);
				
				var eye = $germ.GetEye();
				$that.UponGlideCompleted(false);
//				eye.GlideEyeToEyeParams(eyeparam);
				
				var kSpeed = $core.GetParam("speed");
				var curparam = eye.GetParams();
				var node1 = new Vec3( curparam.GetPosition() );
				var node2 = new Vec3( eyeparam.GetPosition() );

				//opt 1: compute dist from eye to next eyeparam position
				// moderate speed with distance
				// kSpeed = 0.3 + 0.7 / (k * d + 1) 
				// when d=0, kSpeed = 1, d -> \inf, kSpeed -> 0.3

				var dist = node2.Minus(node1).Length();
				var k1 = 1.0 / (0.1 * dist + 1);

				//opt 2: moderate speed with viewing angle
				// ortx = -PI/2, speed = 1
				// ortx = 0, speed = 0.3
				var yaxis = new Vec3(0,1,0);
				var snode = $jsobj.node[ seg[ConvenoConst.SEG.START_NODE_ID] ];
				node2 = new Vec3( snode[0], snode[1], snode[2] );
				var temp = node2.Minus(node1).Normalize();
				var theta = Math.abs( temp.Dot(yaxis) );
				kSpeed = 0.5 + 0.3 * ( theta*2 / Math.PI ) + 0.2 * k1;
				__log("theta: " + theta*180/Math.PI + ", k1: " +k1 +", kSpeed: "+kSpeed);

				eye.GlideEyeTo({
					eyeParams : eyeparam,
					speedMultiplier : kSpeed
				});
			}
		}

		// set visibility to that of the segment
		if (seg && seg[ConvenoConst.SEG.VISIBILITY_BITS]) {
			$that.SetVisibilityFromString( seg[ConvenoConst.SEG.VISIBILITY_BITS] );
		}

		// try to infer placemarks that should be shown, based on those
		// highlighted by the <em></em> tags
		var inferparam = {};		
		if ($core.GetParam("expt-inferplacemark")) {
			var re = new RegExp("<em>(.*?)<\/em>", "g");
			var match;
			var keywords = [];
			while (match = re.exec(guide[ConvenoConst.GUIDE.CONTENT])) {
				keywords.push( match[1] );
			}

			var snode = $jsobj.node[ seg[ConvenoConst.SEG.START_NODE_ID] ];
			var levelhash =
				snode[ConvenoConst.NODE.BLDG_BBL_ID]+"/"+snode[ConvenoConst.NODE.BLOCK_BBL_ID]+"/"+snode[ConvenoConst.NODE.LEVEL_BBL_ID];

			inferparam.keywords = keywords;
			inferparam.levelhash = levelhash;
		}

		// update placemarks visibility
		$that.UpdatePlacemarksVisibility(inferparam);

		$that.ShowVisualPath(param.path_index);
	}
	
	
	
	
	
	
	
	
	
function bindCommonButtons(){
	// hook rollover handler for _all_ buttons
	var btn = $("button");
	btn.bind('mouseover',
		function() {
			$(this).children("div").addClass("hover");
		}
	);
	btn.bind('mouseout',
		function() {
			$(this).children("div").removeClass("hover").removeClass("pressed");
		}
	);
	btn.bind('click',
		function() {
			$(this).children("div").removeClass("hover").removeClass("pressed");
		}
	);
	btn.bind('mousedown',
		function() {
			$(this).children("div").removeClass("hover").addClass("pressed");
		}
	);
	btn.bind('mouseup',
		function() {
			$(this).children("div").removeClass("pressed");
		}
	);
}

function renderGermInfo(){
	if(!mygerm) return;
	
	var content = 	'<div id="controller-wrapper">'+
					' 	<div class="header">'+
					'		<div class="h2">'+GetString("txtwalk")+'</div>'+
					'		<div class="h3">'+GetString("txttime")+'</div>'+
					'	</div>'+
					//'	<div style="float:left; width:10px;"></div>'+
					'</div>';
	if(!$('#htmlBoxPositioner1').length){
		var germTopElement = document.getElementById("germdiv").firstChild;
		htmlBox1 = new HTMLBox(germTopElement);
		if(ConvenoCore.prototype.GetLanguage()=='ms' || ConvenoCore.prototype.GetLanguage()=='ta'){
			htmlBox1.SetSize("280px", "64px");
		} else {
			htmlBox1.SetSize("230px", "64px");
		}
		htmlBox1.SetTop((mygerm.GetHeight()-64)+"px");
		htmlBox1.SetLeft("0px");
		htmlBox1.SetPadding("0px");
		htmlBox1.SetZIndex(2002);
		htmlBox1.SetIsDraggable(false);
		htmlBox1.SetUseCloseButton(true);
		htmlBox1.SetContent( content );
		htmlBox1.Show();
	}
}

function renderGermController(){
	if(!mygerm) return;
	
	var content = 	'<div id="controller-wrapper">'+
					//'	<span class="path-mode '+current_path_mode+'"></span>'+
					' 	<div class="header">'+
					'		<div class="h1">'+GetString("txtplaythepath")+'</div>'+
					'		<div class="h2">'+GetString("txtwalk")+'</div>'+
					'		<div class="h3">'+GetString("txttime")+'</div>'+
					'	</div>'+
					' 	<div class="body">'+
					'		<button class="btn-first disabled"><div class="normal"></div></button>'+
					'		<button class="btn-prev disabled"><div class="normal"></div></button>'+
					'		<button class="btn-play"><div class="normal"></div></button>'+
					'		<button class="btn-pause hidden"><div class="normal"></div></button>'+
					'		<button class="btn-replay hidden"><div class="normal"></div></button>'+
					//'		<button class="btn-stop disabled"><div class="normal"></div></button>'+
					'		<button class="btn-next"><div class="normal"></div></button>'+
					'		<button class="btn-last"><div class="normal"></div></button>'+
					' 	</div>'+
					'</div>';
	//var leftPadding = Math.round((mygerm.GetWidth()-253)/2) + "px";
	if(!$('#htmlBoxPositioner1').length){
		var germTopElement = document.getElementById("germdiv").firstChild;
		htmlBox1 = new HTMLBox(germTopElement);
		if(ConvenoCore.prototype.GetLanguage()=='ms' || ConvenoCore.prototype.GetLanguage()=='ta'){
			htmlBox1.SetSize("468px", "64px");
		} else {
			htmlBox1.SetSize("388px", "64px");
		}
		htmlBox1.SetTop((mygerm.GetHeight()-64)+"px");
		htmlBox1.SetLeft("0px");
		htmlBox1.SetPadding("0px");
		//htmlBox1.SetBackgroundColor("#EFEFEF");
		//htmlBox1.SetBorder("4px solid #999999");
		htmlBox1.SetZIndex(2002);
		htmlBox1.SetIsDraggable(false);
		htmlBox1.SetUseCloseButton(true);
		htmlBox1.SetContent( content );
		htmlBox1.Show();
	}/* else {
		htmlBox1.SetSize("253px", "66px");
		htmlBox1.SetTop((mygerm.GetHeight()-66)+"px");
		htmlBox1.SetLeft(leftPadding);
		htmlBox1.SetContent( content );
		htmlBox1.Show();
	}*/
	
	bindGermButtons();
}

var legend_content;
function renderLegendHtmlBox(){
	if(!mygerm) return;
	
	if(!$('#htmlBoxPositioner2').length){
		$('#Conveno_Legend_Wrapper').css('display', 'none');
		
		legend_content = $(".Conveno_Legend").detach();
		
		var topPadding = Math.round(mygerm.GetHeight()-145) + "px";
		var leftPadding = "10px";
		var germTopElement = document.getElementById("germdiv").firstChild;
		htmlBox2 = new HTMLBox(germTopElement, 2);
		htmlBox2.SetSize("300px", "145px");
		htmlBox2.SetTop(topPadding);
		htmlBox2.SetLeft(leftPadding);
		htmlBox2.SetPadding("0px");
		htmlBox2.SetZIndex(2005);
		htmlBox2.SetIsDraggable(false);
		htmlBox2.SetUseCloseButton(true);
		htmlBox2.SetType("legend_popup");
		htmlBox2.SetContent("");
		htmlBox2.Show();
		legend_content.appendTo("#htmlBoxContentHolder2");
	}
}

function bindGermButtons(){
	//germ controller
	/*$('.btn-start').bind('click', function() {
		$(this).removeClass("hover").removeClass("pressed");
		
		var param = {};
		param.path_index = current_path_index;
		param.guide_index = 0;
		cvn.Display("ConvenoGuide", param);
		
		$(this).addClass("hidden");
		if(autostart_slideshow) slideshow = true;
	});*/
	
	$('.btn-prev').unbind('click');
	$('.btn-prev').bind('click', function() {
		if($(this).hasClass("disabled")) return;
		$(this).removeClass("hover").removeClass("pressed");
		
		slideshow=false;
		
		var param = {};
		param.pmk_id = current_pmk_id;
		param.cat_id = current_cat_id;
		param.path_index = current_path_index;
		if(gliding_dir=="backward"){
			param.guide_index = (is_gliding) ? current_guide_index : current_guide_index-1;
		} else {
			param.guide_index = current_guide_index-1;
			//mygerm.GetEye().CancelGlide();
		}
		if(param.guide_index<0) param.guide_index=0;
		gliding_dir="backward";
		cvn.Display("ConvenoGuide", param, current_caller);
		
		$('.btn-pause').removeClass("hidden");
		$('.btn-first').removeClass("disabled");
		$('.btn-last').removeClass("disabled");
		$('.btn-play').addClass("hidden");
		$('.btn-replay').addClass("hidden");
	});
	
	$('.btn-next').unbind('click');
	$('.btn-next').bind('click', function() {
		if($(this).hasClass("disabled")) return;
		$(this).removeClass("hover").removeClass("pressed");
		
		slideshow=false;
					
		var param = {};
		param.pmk_id = current_pmk_id;
		param.cat_id = current_cat_id;
		param.path_index = current_path_index;
		if(gliding_dir=="forward"){
			param.guide_index = (is_gliding) ? current_guide_index : current_guide_index+1;
		} else {
			param.guide_index = current_guide_index+1;
			//mygerm.GetEye().CancelGlide();
		}
		gliding_dir="forward";
		cvn.Display("ConvenoGuide", param, current_caller);
		
		$('.btn-pause').removeClass("hidden");
		$('.btn-first').removeClass("disabled");
		$('.btn-last').removeClass("disabled");
		$('.btn-play').addClass("hidden");
		$('.btn-replay').addClass("hidden");
	});
	
	$('.btn-pause').unbind('click');
	$('.btn-pause').bind('click', function() {
		$(this).removeClass("hover").removeClass("pressed");
		
		slideshow=false;
		is_gliding=mygerm.GetEye().IsGliding();
		mygerm.GetEye().CancelGlide();
		
		if(current_guide_index==0 && is_gliding==false){
			$('.btn-prev').addClass("disabled");
		} else {
			$('.btn-prev').removeClass("disabled");
		}
		$('.btn-next').removeClass("disabled");
		
		$('.btn-pause').addClass("hidden");
		$('.btn-first').removeClass("disabled");
		$('.btn-last').removeClass("disabled");
		$('.btn-play').removeClass("hidden");
		$('.btn-replay').addClass("hidden");
		
		updateCalloutContent();
	});
	
	$('.btn-play').unbind('click');
	$('.btn-play').bind('click', function() {
		$('.textboxlist-bit-editable-input').focus();
		
		$(this).removeClass("hover").removeClass("pressed");
		
		var param = {};
		param.pmk_id = current_pmk_id;
		param.cat_id = current_cat_id;
		param.path_index = current_path_index;
		
		if(current_page=="ConvenoPath"){
			param.guide_index = 0;
			if(autostart_slideshow) slideshow=true; else slideshow=false;
		} else {
			slideshow=true;
			if(gliding_dir=="forward"){
				param.guide_index = (is_gliding) ? current_guide_index : current_guide_index+1;
			} else {
				param.guide_index = current_guide_index+1;
				//mygerm.GetEye().CancelGlide();
			}
			gliding_dir="forward";
		}
		cvn.Display("ConvenoGuide", param, current_caller);
		
		$('.btn-pause').removeClass("hidden");
		$('.btn-first').removeClass("disabled");
		$('.btn-last').removeClass("disabled");
		$('.btn-play').addClass("hidden");
		$('.btn-replay').addClass("hidden");
		
		$('.btn-prev').addClass("disabled");
		$('.btn-next').addClass("disabled");
	});
	
	$('.btn-replay').unbind('click');
	$('.btn-replay').bind('click', function() {
		$(this).removeClass("hover").removeClass("pressed");
		
		var param = {};
		param.pmk_id = current_pmk_id;
		param.cat_id = current_cat_id;
		param.path_index = current_path_index;
		param.guide_index = 0;
		cvn.Display("ConvenoPath", param, current_caller);
		
		slideshow=false;
		mygerm.GetEye().FinishGlide();
		
		$('.btn-pause').addClass("hidden");
		$('.btn-first').addClass("disabled");
		$('.btn-last').addClass("disabled");
		$('.btn-play').removeClass("hidden");
		$('.btn-replay').addClass("hidden");
		
		$('.btn-prev').addClass("disabled");
		$('.btn-next').addClass("disabled");
		
		setTimeout(function(){ $('.btn-play').click(); }, 1000);
	});
	
	$('.btn-first').unbind('click');
	$('.btn-first').bind('click', function() {
		if($(this).hasClass("disabled")) return;
		
		$(this).removeClass("hover").removeClass("pressed");
		
		var param = {};
		param.pmk_id = current_pmk_id;
		param.cat_id = current_cat_id;
		param.path_index = current_path_index;
		param.guide_index = 0;
		cvn.Display("ConvenoPath", param, current_caller);
		
		slideshow=false;
		mygerm.GetEye().FinishGlide();
		
		$('.btn-pause').addClass("hidden");
		$('.btn-first').addClass("disabled");
		$('.btn-last').removeClass("disabled");
		$('.btn-play').removeClass("hidden");
		$('.btn-replay').addClass("hidden");
		
		$('.btn-prev').addClass("disabled");
		$('.btn-next').removeClass("disabled");
	});
	
	$('.btn-last').unbind('click');
	$('.btn-last').bind('click', function() {
		if($(this).hasClass("disabled")) return;
		
		$(this).removeClass("hover").removeClass("pressed");
		
		$('.guide-end').click();
		mygerm.GetEye().FinishGlide();
		
		$('.btn-pause').addClass("hidden");
		$('.btn-first').removeClass("disabled");
		$('.btn-last').addClass("disabled");
		$('.btn-play').addClass("hidden");
		$('.btn-replay').removeClass("hidden");
		
		$('.btn-prev').removeClass("disabled");
		$('.btn-next').addClass("disabled");
	});
}

function bindPathButtons(){
	$('#PathMode .wch').unbind('click');
	$('#PathMode .wch').bind('click', function() {
		if($(this).hasClass("disabled")) return;
		
		$(this).addClass("disabled");
		$('#PathMode .std').removeClass("disabled");
		current_path_mode = "wch";
		
		togglePathMode();
		
		//$(".Conveno_GettingHere select").val(selected_path_index);
	});
	
	$('#PathMode .std').unbind('click');
	$('#PathMode .std').bind('click', function() {
		if($(this).hasClass("disabled")) return;
		
		$(this).addClass("disabled");
		$('#PathMode .wch').removeClass("disabled");
		current_path_mode = "std";
		
		togglePathMode();
	});
}

function togglePathMode(){
	slideshow=false;
	if(mygerm) mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
	
	var selected_path_index = $(".Conveno_GettingHere select").attr("selectedIndex");
	var core = ConvenoCore.prototype;
	var SEG  = ConvenoConst.SEG;
	var jsobj = core.GetData();
	
	// get all paths that leads to $that placemark
	rows = jsobj.path;
	var arrpath = [];
	for (var i in rows) {
		if (rows[i].dst_pmk_id == current_pmk_id) {
			if (rows[i].segment)
				arrpath.push( { "index": i, "row" : rows[i] } );
		}
	}
	if (arrpath.length>0) {
		var tags, found=false, ctr=0;
		for (var i in arrpath) {
			var path = arrpath[i].row;
			var first_seg = path.segment[0];
			var pmk1 = core.GetPlacemarkByNodeId( first_seg[SEG.START_NODE_ID] );
			if (pmk1 && typeof path.tag!="undefined"){
				tags = path.tag.split(",");
				for(var j in tags){
					if(current_path_mode.trim()==tags[j].trim()){
						ctr++;
						if(pmk1[0]==selected_src_pmk_id && selected_path_index!=0){
							found=true;
							current_guide_index=0;
							
							param = {};
							param.pmk_id = current_pmk_id;
							param.cat_id = current_cat_id;
							param.path_index = arrpath[i].index;
							param.guide_index = 0;
							cvn.Display("ConvenoPath", param, current_caller);
							setTimeout(function(){
								$(".scroll-pane").scrollTo( ".Conveno_GettingHere", 500, {} );
							}, 50);
						}
					}
				}
			}
		}
		
		//if(!found && selected_src_pmk_id!=0){
		if(!found){
			current_path_index=0;
			current_guide_index=0;
			
			param = {};
			param.pmk_id = current_pmk_id;
			param.cat_id = current_cat_id;
			
			//if(current_page!="ConvenoPlacemark"){
				cvn.Display("ConvenoPlacemark", param, current_caller);
				$('.Conveno_BtnGettingHere').click();
			//}
			
			//Back Button
			if (typeof current_caller=="function") {
				var that = ConvenoPage.prototype;
				that.BindClick(".Conveno_BtnBack", current_caller);
				$(".Conveno_BtnBack").removeClass("hidden");
			} else {
				$(".Conveno_BtnBack").addClass("hidden");
			}
			
			if($("#Conveno_Guide").length){
				$("#Conveno_Guide").empty();
			} else {
				$(".Conveno_GettingHere").append( '<div id="Conveno_Guide"></div>' );
			}
			if(ctr==0){
				//if no path found
				$("#Conveno_Guide").html( '<span style="padding-left:6px !important; color:#FF0000; font-weight:bold; font-size:12px;">' + GetString("txtnopathfound1") + '</span>' );
			} else if(selected_path_index==0){
				//If no starting location is selected
				$("#Conveno_Guide").html( '<span style="padding-left:6px !important; color:#FF0000; font-weight:bold; font-size:12px;">' + GetString("txtchoosestartinglocation") + '</span>' );
			} else {
				//if no path found from the selected starting point
				$("#Conveno_Guide").html( '<span style="padding-left:6px !important; color:#FF0000; font-weight:bold; font-size:12px;">' + GetString("txtnopathfound2") + '</span>' );
			}
		}
	}
}

function GetStringTable()
{
	var str = 
	{
		"txtcat" : {
			"en" : "Category",
			"zh" : "类别",
			"ms" : "Kategori",
			"ta" : "வகை"
		},
		"txtlvl" : {
			"en" : "Level",
			"zh" : "楼层",
			"ms" : "Tingkat",
			"ta" : "தளம்"
		},
		"txtname" : {
			"en" : "Name",
			"zh" : "名称",
			"ms" : "Nama",
			"ta" : "பெயர்"
		},
		"txthere" : {
			"en" : "You are at ",
			"zh" : "所在位置 ",
			"ms" : "Anda berada di ",
			"ta" : "நீங்கள் இங்கு இருக்கிறீர்கள்"
		},
		"txtgethere" : {
			"en" : "How do I get here from ",
			"zh" : "从这里开始步行: ",
			"ms" : "Bagaimana aku sampai di sini dari ",
			"ta" : "யிலிருந்து நான் எவ்வாறு இங்கு வந்தடைவது "
		},
		"txtfrom" : {
			"en" : "From",
			"zh" : "起点",
			"ms" : "Dari",
			"ta" : "இங்கிருந்து"
		},
		"txtto" : {
			"en" : "To",
			"zh" : "终点",
			"ms" : "Ke",
			"ta" : "இதுவரை"
		},
		"txtwalk" : {
			"en" : "Est. distance",
			"zh" : "估计距离",
			"ms" : "Anggaran jarak",
			"ta" : "உத்தேசமான தூரம்"
		},
		"txttime" : {
			"en" : "Est. time",
			"zh" : "估计时间",
			"ms" : "Anggaran masa",
			"ta" : "உத்தேசமான நேரம்"
		},
		"txtmetres" : {
			"en" : "meters",
			"zh" : "米",
			"ms" : "meter",
			"ta" : "மீட்டர்கள்"
		},
		"txtmins" : {
			"en" : "mins",
			"zh" : "分钟",
			"ms" : "minit",
			"ta" : "நிமிடங்கள்"
		},
		"txtsur" : {
			"en" : "Surrounding Places",
			"zh" : "其他地标",
			"ms" : "Kawasan Sekeliling",
			"ta" : "சுற்றியுள்ள இடங்கள்"
		},
		"txtlvlsel" : {
			"en" : "Please select a level below to visit",
			"zh" : "请从下面列表选择要去的楼层",
			"ms" : "Sila pilih tingkat daripada yang di bawah untuk dilawati",
			"ta" : "பார்வையிடுவதற்கு கீழேயுள்ள அளவு ஒன்றை தேர்ந்தெடுக்கவும்"
		},
		"txtsel1" : {
			"en" : "Please select the starting letter of your location",
			"zh" : "请选择您所在位置的开始字母",
			"ms" : "Sila pilih abjad awal lokasi anda",
			"ta" : "நீங்கள் இருக்கும் இடத்தின் தொடக்க எழுத்தை தேர்ந்தெடுக்கவும்"
		},
		"txtsel2" : {
			"en" : "Please select a location starting from",
			"zh" : "请选择一个起点位置",
			"ms" : "Sila pilih lokasi yang bermula daripada",
			"ta" : "இதிலிருந்து தொடங்கும் இருப்பிடம் ஒன்றை தேர்ந்தெடுக்கவும்"
		},
		"txtpow" : {
			"en" : "powered by",
			"zh" : "采用",
			"ms" : "dikuasakan oleh",
			"ta" : "போவேறேத் பி "
		},
		"txtlgd" : {
			"en" : "Legend",
			"zh" : "图例",
			"ms" : "Petunjuk",
			"ta" : "வரைபடச் சின்னம்"
		},
		"txterr2" : {
			//"en" : "You will need the <a target=\"_blank\" href=\"http://www.germanium3d.com/download/plugin\">GermaniumWeb</a> plugin to experience the <span>Conveno</span> Visitor Guide<p><a href=\"http://www.germanium3d.com/getfile.php?t=5&c=en-US\"><button></button></a>",
			//"zh" : "您需要<a target=\"_blank\" href=\"http://www.germanium3d.com/download/plugin/zh-hans\">GermaniumWeb</a>插件来参观三维指南.请点击以下按键下载并安装再刷新此页.<p><a href=\"http://www.germanium3d.com/getfile.php?t=5&c=zh-CN\"><button></button></a>",
			"en" : "You will need the <a target=\"_blank\" href=\"http://www.germanium3d.com/download/plugin\">GermaniumWeb</a> plugin to experience the <span>Conveno</span> Visitor Guide<br /><br /><a href=\"http://www.germanium3d.com/getfile.php?t=5&c=en-US\">Get the latest version here</a>",
			"zh" : "您需要<a target=\"_blank\" href=\"http://www.germanium3d.com/download/plugin/zh-hans\">GermaniumWeb</a>插件来参观三维指南。请在此<a href=\"http://www.germanium3d.com/getfile.php?t=5&c=zh-CN\">下载最新版本</a>，并安装再刷新此页。",
			"ms" : "Anda memerlukan pemalam GermaniumWeb untuk menggunakan Panduan Pelawat Conveno",
			"ta" : "கன்வெனோ வருகையாளர் கையேட்டை அனுபவிப்பதற்கு உங்களுக்கு ஜெர்மானியம்வெப் ப்ளஃகின் தேவைப்படும்"
		},
		
		"en" : {
			"en" : "English"
		},
		"zh" : {
			"zh" : "中文"
		},
		"ms" : {
			"ms" : "Melayu"
		},
		"ta" : {
			"ta" : "தமிழ்"
		},
		
		"txtreached": {
			"en" : "You have reached ABC.",
			"zh" : "您已到达 ABC。",
			"ms" : "Anda sudah tiba di ABC.",
			"ta" : "நீங்கள் ABC ஐ அடைந்துவிட்டீர்கள்."
		},
		
		"txtplaces" : {
			"en" : "Places",
			"zh" : "地点",
			"ms" : "Tempat"
		},
		
		"txtlevels" : {
			"en" : "Levels",
			"zh" : "楼层",
			"ms" : "Tingkat"
		},
		
		"txtwalkingdir" : {
			"en" : "Directions",
			"zh" : "方向指南",
			"ms" : "Arah"
		},
		
		"txtchoosestartinglocation": {
			"en" : "Please choose a starting location first.",
			"zh" : "请先选择起点。",
			"ms" : "Sila memilih lokasi awal terlebih dahulu."
		},
		
		"txtselectstartinglocation": {
			"en" : "Please select a starting location",
			"zh" : "请选择起点",
			"ms" : "Sila memilih lokasi awal"
		},
		
		"txtnopathfound1": {
			"en" : "No path is found for this mode.",
			"zh" : "没有找到与这模式相关的道路。",
			"ms" : "Tidak ada jalan dijumpai untuk mod ini."
		},
		
		"txtnopathfound2": {
			"en" : "No path is found from this starting point.",
			"zh" : "没有找到与这起点相关的道路。",
			"ms" : "Tidak ada jalan yang ditemui di titik permulaan."
		},
		
		"txtlang": {
			"en" : "Language",
			"zh" : "语言",
			"ms" : "Bahasa"
		},
		
		"txthidelabels": {
			"en" : "Hide Labels",
			"zh" : "隐藏名称",
			"ms" : "Sembunyikan Label"
		},
		
		"txtsearch": {
			"en" : "Search",
			"zh" : "搜",
			"ms" : "Carian"
		},
		
		"txtnoresults": {
			"en" : "No matching results.",
			"zh" : "没有相关内容。",
			"ms" : "Tidak dijumpai hasil."
		},
		
		"txtlookaround": {
			"en" : "Look Around in 3D",
			"zh" : "参观",
			"ms" : "Melihat Sekeliling"
		},
		
		"txtstoplookaround": {
			"en" : "Stop Look Around",
			"zh" : "停止参观",
			"ms" : "Berhenti Melihat Sekeliling"
		},
		
		"txtshowallresults": {
			"en" : "Show All Results",
			"zh" : "显示所有搜索结果",
			"ms" : "Tampilkan Semua Hasil"
		},
		
		"txtviewinfo": {
			"en" : "View Information",
			"zh" : "显示资讯",
			"ms" : "Tampilkan Informasi"
		},
		
		"txthideinfo": {
			"en" : "Hide Information",
			"zh" : "隐藏资讯",
			"ms" : "Sembunyikan Informasi"
		},
		
		"txtgettinghere": {
			"en" : "Find out how to get here",
			"zh" : "路线信息",
			"ms" : "Tampilkan Panduan"
		},
		
		"txthidegettinghere": {
			"en" : "Hide Directions",
			"zh" : "隐藏方向指南",
			"ms" : "Sembunyikan Panduan"
		},
		
		"txtplaythepath": {
			"en" : "Play the Path",
			"zh" : "播放路线",
			"ms" : "Mulai panduan"
		},
		
		"txtemail": {
			"en" : "Email",
			"zh" : "电邮"
		},
		
		"txtfacebook": {
			"en" : "Facebook",
			"zh" : "脸书"
		},
		
		"txttwitter": {
			"en" : "Twitter",
			"zh" : "推特"
		},
		
		"_" : null
	};

	return str;
}

function GetString(sid, lang)
{
	if (!lang) lang = app_settings.lang;

	var str = GetStringTable();

	var value;
	if (str[sid]) {
		value = str[sid]["en"];
		if (str[sid][lang]) value = str[sid][lang];
	}

	if (!value) value = "(undefined)";
	return value;
}

function OutputErrorPage(msg)
{
	// replace css
	$("link").remove();
	var css =
		'html body {'+
		'overflow: auto;'+
		'}'+
		'body {'+
		'font-family: calibri, arial;'+
		'font-size: 100%;'+
		'padding: 1em !important;'+
		'margin: 0;'+
		'border: 0;'+
		'}'+
		'a {'+
		'color: blue;'+
		'}';

	var sheet = document.createElement( 'style' );
	sheet.type = 'text/css';
	$("head").get(0).appendChild(  sheet );
	if( sheet.styleSheet )
		sheet.styleSheet.cssText = css;
	else
		sheet.appendChild( document.createTextNode(css) );

	var show = function() {
		document.getElementById('details').style.display = 'block';
		var d = new Date();
		var l = window.location;
		var ua = navigator.userAgent;
		var details = document.getElementById("details");

		msg += "<p><ul style=\"font-size:smaller\"><li>" + l + "</li><li>" + ua + "</li><li>" + d + "</li></ul>";
		msg += "<span style=\"font-size:smaller\">For assistance, please email the above technical information to <a href=\"mailto:support@conveno.com\">support@conveno.com</a></span>";
		details.innerHTML = msg;

		return false;
	}

	var body = 
		'<h1 style="margin-top:0px;">Oops</h1>'+
		'<div id="err-content">'+
		'There is an error while processing your request.'+
		'<div id="details" style="padding: 1em; border: dashed 1px orange; margin: 1em; background-color: #ffd; display: none;">' + msg + '</div>'+
		'You may like to <a href="'+window.location+'">reload</a>, or '+
		'visit our <a href="http://www.conveno.com">Conveno homepage</a> to continue your browsing experience'+
		'</div>'+
		'<div style="position: relative; width: 100%;">'+
		'	<div style="text-align: right; border-top: solid 1px #C1E6F5; padding: 0.5em; margin-top: 1em;">'+
		'	<img src="/res/image/conveno_logo_notext.png" border=0>'+
		'	</div>'+
		'</div>';

	$("body").html(body);
	show();
}

function OutputGermErrorPage(errmsg, errcode){
	if(errcode==Germanium.InitErrorCodes.PluginNotInstalled){ //Plugin Not Installed (3)
		errmsg = GetString("txterr2");
	}
	
	// use app_setings.UserLang
	if (app_settings.userlang) {
		var oldlang = app_settings.lang;
		app_settings.lang = app_settings.userlang;
		UpdateCommonElements(app_settings.lang, oldlang);
	}
	
	var html = '<div class="germerr-wrapper"><div class="germerr-msg">'+errmsg+'</div></div>';
	$("#germdiv").css({ "background-color" : "#D9D9D9", "border" : "1px solid #D9D9D9" });
	$("#germdiv").html(html);
	/*$(".germerr-msg button").click(function() {
		var url = $(".germerr-msg a:last").attr("href");
		window.location = url;
	});*/
	$(".germerr-msg span").text(document.title);
	
	$(".preloader-img").css("display", "none");
}

/** cvn3 overriding part **/
ConvenoCategory.prototype.UpdateDom = (function(fnOld) {
	return function(param, caller) {
		fnOld(param, caller);
		$PrependMenuHeader( $(".ConvenoCategory") );
	};
})(ConvenoCategory.prototype.UpdateDom);

ConvenoPlacemark.prototype.UpdateDom = function(param, caller) {
	__log("ConvenoPlacemark.UpdateDom.override");
	
	var core = ConvenoCore.prototype;
	var s =
		'<div class="Conveno_Title">' +
		'	<span class="Conveno_Icon"></span>' +
		'	<span class="Conveno_Name"></span>' +
		'</div>' +
		'<div class="Conveno_BBL">' +
		'	<span class="Conveno_You_Are_Here"></span>' + 
		'	<span class="Conveno_Building"></span>' + 
		'	<span class="Conveno_Block"></span>' + 
		'	<span class="Conveno_Level"></span>' + 
		'</div>' +
		'<div id="Conveno_ContentWrapper" class="scroll-pane">' + 
		'	<div class="Conveno_Description hidden"></div>' +
		'	<div id="viewinfo_wrapper" class="hidden"></div>' + 
		'	<div id="lookaround_wrapper" class="hidden"></div>' + 
		'	<div id="gettinghere_wrapper" class="hidden"></div>' + 
		//'	<hr class="Conveno_Content_Separator Conveno_Separator hidden"></hr>' +	
		'	<div class="Conveno_GettingHere hidden">' +
		'		<div id="PathMode"><button class="std"><div class="normal"></div></button><button class="wch hidden"><div class="normal"></div></button></div>' +
	//	'		<div id="PathMode"><button id="Conveno_PathModeBtn" class="std"><div class="normal"></div></button></div>' +
		'		<div class="Conveno_Text">How do I get here from:</div>'+
		'	</div>' + 
		'</div>';
	core.SetContentHtml(s);

	// hack to make it possible to do per-placemark customization
	core.GetContentObject().addClass("pmk_id-" + param.pmk_id);
		
	$PrependMenuHeader( $(".ConvenoPlacemark") );
	
	selected_path_index=0;
	selected_src_pmk_id=0;
};

ConvenoPlacemark.prototype.UpdateContent = function(param, caller) {
	if(!param.pmk_id) param.pmk_id=current_pmk_id;
	
	__log("ConvenoPlacemark.UpdateContent.override");
	
	var core = ConvenoCore.prototype;
	var that = ConvenoPage.prototype;
	var PMK  = ConvenoConst.PMK;
	var BLDG  = ConvenoConst.BLDG;
	var BLOCK  = ConvenoConst.BLOCK;
	var LEVEL  = ConvenoConst.LEVEL;
	var SEG  = ConvenoConst.SEG;
	var jsobj = core.GetData();
	var contentdiv = core.GetContentObject();
	var pmk = jsobj.pmk[param.pmk_id];
	
	//lookarnd btn
	if (mygerm){
		$("#viewinfo_wrapper").removeClass("hidden");
		$("#lookaround_wrapper").removeClass("hidden");
		//start btn
		var btn1 = $('<button class="Conveno_BtnLookaroundStart Conveno_BtnFunction"><div class="normal"></div></button>');
		btn1.bind('click', function() {
			$(this).children("div").removeClass("hover").removeClass("pressed");
			mygerm.UnsetActivePlacemark();
			$(".Conveno_BtnViewInfo").attr("disabled", "disabled");
			$(".Conveno_BtnViewInfo").addClass("disabled");
			$(".Conveno_BtnViewInfo").children("div").text(GetString("txtviewinfo"));
		});
		btn1.children('div').html(GetString("txtlookaround")+'<span class="lookarndstart_img"></span>');
		contentdiv.find("#lookaround_wrapper").append(btn1);
		
		//stop btn
		var btn2 = $('<button class="Conveno_BtnLookaroundStop Conveno_BtnFunction hidden"><div class="normal"></div></button>');
		btn2.bind('click', function() {
			$(this).children("div").removeClass("hover").removeClass("pressed");
		});
		btn2.children('div').html(GetString("txtstoplookaround")+'<span class="lookarndstop_img"></span>');
		contentdiv.find("#lookaround_wrapper").append(btn2);
	}
	
	
	// create "command" object for the current method (as caller to other pages)
	var fnCurrent = (function(param, caller) {
			return function() { 
				core.Display(that.name, param, caller); 
			};
	})(param, caller);

	that.SetHtmlIf( pmk[PMK.ICON_PATH], $(".Conveno_Icon").get(0), "<img src=\""+pmk[PMK.ICON_PATH]+"\" border=0>" );
	
	var name = core.GetString( pmk[PMK.NAME_SID], pmk[PMK.NAME] );
	that.SetHtmlIf( name, contentdiv.find(".Conveno_Name"), name);

	var desc = core.GetString( pmk[PMK.CONTENT_SID], pmk[PMK.CONTENT] );
	if(typeof mygerm=="undefined"){ that.SetHtmlIf( desc, contentdiv.find(".Conveno_Description"), desc); }
	
	// bbl
	var bldg  = core.GetBuilding( pmk[PMK.BLDG_BBL_ID] );
	var block = core.GetBlock   ( pmk[PMK.BLDG_BBL_ID], pmk[PMK.BLOCK_BBL_ID] );
	var level = core.GetLevel   ( pmk[PMK.BLDG_BBL_ID], pmk[PMK.BLOCK_BBL_ID], pmk[PMK.LEVEL_BBL_ID] );

	if (bldg)  that.SetHtmlIf( true, contentdiv.find(".Conveno_Building"), core.GetBBLString(  bldg[BLDG.NAME_SID],   bldg[BLDG.NAME] ) );
	else contentdiv.find(".Conveno_Building").addClass("hidden");

	if (block) that.SetHtmlIf( true, contentdiv.find(".Conveno_Block"),    core.GetBBLString( block[BLOCK.NAME_SID], block[BLOCK.NAME] ) );
	else contentdiv.find(".Conveno_Block").addClass("hidden");

	if (level) that.SetHtmlIf( true, contentdiv.find(".Conveno_Level"),    core.GetBBLString( level[LEVEL.NAME_SID], level[LEVEL.NAME] ) );
	else contentdiv.find(".Conveno_Level").addClass("hidden");

	if (!bldg && !block && !level) {
		$(".Conveno_BBL").addClass("hidden");
	}

	// get all paths that leads to that placemark
	rows = jsobj.path;
	var arrpath = [];
	for (var i in rows) {
		if (rows[i].dst_pmk_id == param.pmk_id) {
			if (rows[i].segment)
				arrpath.push( { "index": i, "row" : rows[i] } );
		}
	}

	if (arrpath.length==0) {
		contentdiv.find(".Conveno_GettingHere").addClass("hidden");
	} else {
		var ul = $("<ul></ul>");
		for (var i in arrpath) {
			var path = arrpath[i].row;
			var first_seg = path.segment[0];
			var pmk1 = core.GetPlacemarkByNodeId( first_seg[SEG.START_NODE_ID] );
			if (pmk1) {
				var str = '<li><a href="javascript:void(0);">';
				str += '<span class="Conveno_StartLocation">';
				str += core.GetString(pmk1[PMK.NAME_SID], pmk1[PMK.NAME]); // pmk1[ PMK.NAME ];
				str += '</span>';
				str += '</a></li>';

				var elem = $(str);
				elem.find("a").click( (function(path_index) {
					return function() { core.Display("ConvenoPath", { "path_index" : path_index, "cat_id" : param.cat_id }, fnCurrent); }
				})(arrpath[i].index) );
				elem.appendTo(ul);
			}
		}

		var div = contentdiv.find(".Conveno_GettingHere");
		div.append(ul);
	}

	//2009-12-21: lookaround handling
	var bCanLookaround = 
		((pmk[PMK.CAN_LOOKAROUND]==null) || (pmk[PMK.CAN_LOOKAROUND]==true)) &&
		(pmk[PMK.LEVEL_BBL_ID]!=null);

	if (bCanLookaround) {
		var btn = $(".Conveno_BtnLookaroundStart");
		btn.click(function() {
			core.BeginLookaround(param.pmk_id);
		});

		btn = $(".Conveno_BtnLookaroundStop");
		btn.click(function() {
			core.EndLookaround();
		});

	} else {
		$(".Conveno_BtnLookaroundStart").addClass("hidden");
	}

	//2009-12-10: assign [back] to parent's category if no caller
	if (!caller && param.cat_id) {
		that.BindClick(".Conveno_BtnBack", function() {
			core.Display("ConvenoCategory", { "cat_id" : param.cat_id });
		});
		$(".Conveno_BtnBack").removeClass("hidden");
	}
		
		
		
	/* new addition */
	if(cvn_germ){
		//cvn_germ.map_id_gpmk[param.pmk_id].SetContent('<div class="Conveno_Description Conveno_Callout">'+desc+'</div>');
		if(desc==""){
			$('#viewinfo_wrapper').addClass('hidden');
		} else {
			detachContent();
			desccallout.html(desc);
			
			if($("#desc-callout").find("img").length>0 || $("#desc-callout").find("object").length>0){
				var open_delay=1500;
			} else {
				var open_delay=500;
			}
			
			hide_callout=true;
			clearTimeout(callout_timer);
			callout_timer = setTimeout( (function(pmk_id){
				return function(){
					hide_callout=false;
					var calloutwidth = desccallout.outerWidth();
					var calloutheight = desccallout.outerHeight();
					var content = '<div class="ConvenoGerm_Wrapper Conveno_Description" style="width:'+calloutwidth+'px; height:'+calloutheight+'px;"></div>';
					cvn_germ.map_id_gpmk[pmk_id].SetContent(content);
					
					if (Germanium.GetAPIVersion()>mygerm.CreateVersion(1,5,0,0)) {
						if(mygerm.IsCalloutOpen) mygerm.CloseCallout();
						mygerm.OpenActivePlacemarkCallout();
						attachContent();
					}
				}
			})(param.pmk_id), open_delay);
		}
		
		//viewinfo btn
		var viewinfo_btn = $('<button class="Conveno_BtnViewInfo Conveno_BtnFunction"><div class="normal"></div></button>');
		viewinfo_btn.bind('click', function() {
			$(this).children("div").removeClass("hover").removeClass("pressed");
			
			if($(this).children("div").text()==GetString("txtviewinfo")){
				cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[param.pmk_id]);
				$(".Conveno_BtnViewInfo").children("div").text(GetString("txthideinfo"));
			} else {
				mygerm.UnsetActivePlacemark();
				$(".Conveno_BtnViewInfo").children("div").text(GetString("txtviewinfo"));
			}
		});
		viewinfo_btn.children('div').text(GetString("txthideinfo"));
		contentdiv.find("#viewinfo_wrapper").append(viewinfo_btn);
	}
	
	//gettinghere btn
	var gettinghere_btn = $('<button class="Conveno_BtnGettingHere Conveno_BtnFunction"><div class="normal"></div></button>');
	gettinghere_btn.bind('click', function() {
		$(this).children("div").removeClass("hover").removeClass("pressed");
		
		if($(".Conveno_GettingHere").hasClass("hidden")){
			$(".Conveno_GettingHere").removeClass("hidden");
			$(".Conveno_BtnGettingHere").children("div").text(GetString("txthidegettinghere"));
		} else {
			cvn.Display("ConvenoPlacemark", { pmk_id:current_pmk_id, glide:false, setVisibility:false }, current_caller);
			if(cvn_germ) cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[current_pmk_id]);
		}
	});
	gettinghere_btn.children('div').text(GetString("txtgettinghere"));
	contentdiv.find("#gettinghere_wrapper").append(gettinghere_btn);
	
	
	var function_btn = contentdiv.find('.Conveno_BtnFunction');
	function_btn.bind('mouseover', function() { $(this).children("div").addClass("hover"); });
	function_btn.bind('mouseout', function() { $(this).children("div").removeClass("hover").removeClass("pressed"); });
	function_btn.bind('mousedown', function() { $(this).children("div").removeClass("hover").addClass("pressed"); });
	function_btn.bind('mouseup', function() { $(this).children("div").removeClass("pressed"); });
	
	
	renderConvenoPlacemarkInfo(param, caller);
	
	/*if(typeof caller!="undefined"){
		// create "command" object for the current method (as caller to other pages)
		var fnCurrent = (function(param, caller) {
				return function() { 
					cvn.Display("ConvenoPlacemark", param, caller); 
				};
		})(param, caller);
		current_caller = fnCurrent;
	}*/
	if(typeof caller!="undefined") current_caller = caller;
};

function renderConvenoPlacemarkInfo(param, caller){
	var core = ConvenoCore.prototype;
	var jsobj = core.GetData();
	
	// get all paths that leads to $that placemark
	rows = jsobj.path;
	var arrpath = [];
	for (var i in rows) {
		if (rows[i].dst_pmk_id == param.pmk_id) {
			if (rows[i].segment)
				arrpath.push( { "index": i, "row" : rows[i] } );
		}
	}
	if (arrpath.length==0) {
		$('#PathMode').addClass("hidden");
		//$('.Conveno_Content_Separator').addClass('hidden');
	} else {
		$('#PathMode').removeClass("hidden");
		if($('#gettinghere_wrapper').hasClass("hidden")) $('#gettinghere_wrapper').removeClass("hidden");
		//$('.Conveno_Content_Separator').removeClass('hidden');
	}
	
	$(".Conveno_GettingHere .Conveno_Text").text( GetString("txtgethere") );

	if ( !$(".Conveno_Building").hasClass("hidden") ) {
		$(".Conveno_You_Are_Here").text( GetString("txthere") );
	}
		
	var core = ConvenoCore.prototype;
	var jsobj = core.GetData();
	var SEG  = ConvenoConst.SEG;
	var optIdxArr = new Array();
	var hasWhellchair=false;
	var hasWalking=false;
	
	if (arrpath.length>0) {
		var tags, idx=0;
		for (var i in arrpath) {
			var path = arrpath[i].row;
			var first_seg = path.segment[0];
			var pmk1 = core.GetPlacemarkByNodeId( first_seg[SEG.START_NODE_ID] );
			if (pmk1 && path.tag){
				tags = path.tag.split(",");
				if(in_array(current_path_mode, tags)){
					optIdxArr.push( idx );
				}
				if(in_array('wch', tags)){
					hasWhellchair=true;
				}
				if(in_array('std', tags)){
					hasWalking=true;
				}
			} else if (pmk1 && !path.tag){
				hasWalking=true;
			}
			idx++;
		}
	}
	if(hasWhellchair==true) $("#PathMode .wch").removeClass("hidden");
	if(hasWalking==false){
		$("#PathMode .std").addClass("hidden");
		if(current_path_mode=="std"){
			current_path_mode="wch";
			renderConvenoPlacemarkInfo(param, caller);
			return;
		}
	}
	
	if(current_path_mode=="std"){
		$("#PathMode .std").addClass("disabled");
	} else {
		$("#PathMode .wch").addClass("disabled");
	}
	
	// create dropdown list from li 
	var dl = $('<select class="noselection"></select>');
	dl.append('<option value="-1">--&gt; '+GetString("txtselectstartinglocation")+'</option>');
	$(".Conveno_GettingHere li").each(function(i) {
		if(in_array(i, optIdxArr) || hasWhellchair==false){
			var e = $(this);
			var anchor = e.find("a");
			var value = anchor.text();
			dl.append('<option value="'+i+'">' + value + '</option>');
		}
	});
	$(".Conveno_GettingHere").append(dl);
	
	dl.bind('change', function() {
		//var index = dl.attr("selectedIndex");
		//if(index>0){
		//	index--;
		var index = dl.attr("value");
		if(index>-1) {
			var e = $(".Conveno_GettingHere li").eq(index);
			var anchor = e.find("a");
			//if (anchor) anchor.click();
			if (anchor){
				// get all paths that leads to $that placemark
				rows = jsobj.path;
				var arrpath = [];
				for (var i in rows) {
					if (rows[i].dst_pmk_id == param.pmk_id) {
						if (rows[i].segment)
							arrpath.push( { "index": i, "row" : rows[i] } );
					}
				}
				for (var i in arrpath) {
					var PMK  = ConvenoConst.PMK;
					var path = arrpath[i].row;
					var first_seg = path.segment[0];
					var pmk1 = core.GetPlacemarkByNodeId( first_seg[SEG.START_NODE_ID] );
					if (pmk1) {
						if(i==index){
							selected_src_pmk_id = pmk1[PMK.PMK_ID];
							selected_path_index = dl.attr("selectedIndex");
							param.pmk_id = current_pmk_id;
							param.cat_id = current_cat_id;
							param.path_index = arrpath[i].index;
							param.guide_index = 0;
							//core.Display("ConvenoPath", param, caller);
							cvn.Display("ConvenoPath", param, current_caller);
							slideshow = false;
							
							/*setTimeout(function(){
								var pane = $('.scroll-pane');
								var api = pane.data('jsp');
								//if(api) api.scrollToElement( $(".Conveno_GuideTitle"), true, true);
								if(api) api.scrollToElement( $(".Conveno_GettingHere"), true, true);
							}, 50);*/
							
							setTimeout(function(){
								$(".scroll-pane").scrollTo( ".Conveno_GettingHere", 500, {} );
							}, 50);
						}
					}
				}
			}
		}
	});
	//$(".Conveno_GettingHere").append("<span>?</span>");
	$(".Conveno_GettingHere ul").css("display", "none");
	//$(".Conveno_GettingHere select").css("visibility" , "hidden"); // required for IE6
	
	$('.Conveno_GettingHere select').attr("selectedIndex", selected_path_index);
	
	if(selected_path_index==0){
		$('.Conveno_GettingHere select').addClass("noselection");
	} else {
		$('.Conveno_GettingHere select').removeClass("noselection");
	}
}

function renderConvenoGuidedSteps(page, param, caller){
	var core = ConvenoCore.prototype;
	var that = ConvenoPage.prototype;
	var PMK  = ConvenoConst.PMK;
	var GUIDE = ConvenoConst.GUIDE;
	var LEVEL = ConvenoConst.LEVEL;
	var jsobj = core.GetData();
	var contentdiv = core.GetContentObject();
	var path_index = param.path_index;
	var guide_index = param.guide_index ? param.guide_index : 0;
	var SEG  = ConvenoConst.SEG;
	var NODE = ConvenoConst.NODE;
	
	var path = jsobj.path[path_index];
	if (!path) {
		__log("<ERR> Path not found. path_index: " + path_index);
		return false;
	}
	
	if(!path.guide){
		$('#Conveno_Guide').css('display', 'none');
		
		if(mygerm) mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
		if(autostart_slideshow) slideshow=true; else slideshow=false;
		
		$('#htmlBoxPositioner1').remove();
		$('#htmlBoxContentIframe1').remove();
		
		renderGermInfo();
		renderConvenoCallout(page, param, caller);
		
		return false;
	} else {
		$('#Conveno_Guide').css('display', 'block');
	}
	
	var pmk = core.GetPlacemarkById(path.dst_pmk_id);
	if (!pmk) {
		__log("<ERR> No placemark found: " + path.dst_pmk_id);
		core.Display();
		return false;
	}
	
	var name = core.GetString( pmk[PMK.NAME_SID], pmk[PMK.NAME] );
	var guide, content='', i;
	var guide_selected="";
	
	if(page=="ConvenoPath"){
		//if(autostart_slideshow) slideshow=true; else slideshow=false;
		//guide_selected=" selected";
		$('#htmlBoxPositioner1').remove();
		$('#htmlBoxContentIframe1').remove();
	}
	
	//Start - Source pmk name
	var first_seg = path.segment[0];
	var pmk_start = core.GetPlacemarkByNodeId( first_seg[SEG.START_NODE_ID] );
//	content += '<div class="guide-start'+guide_selected+'"><div><span class="img"></span><span class="text">' + pmk_start[PMK.NAME] + '</span></div></div>';
	
	that.SetHtmlIf( true, contentdiv.find(".Conveno_GuideTitle"), GetString("txtwalkingdir") );
	for(i=0; i<=path.guide.length; i++){
		guide = path.guide[i];
		if(i==guide_index && page=="ConvenoGuide") guide_selected=" selected"; else guide_selected="";
		
		if(guide){
			var style='';
			var guide_content = guide[GUIDE.CONTENT];
			/*if (guide_content.length>150){
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:12px;"';
				}
			} else if (guide_content.length>120){
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:13px;"';
				}
			} else if (guide_content.length>90){
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:14px;"';
				}
			} else {
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:15px;"';
				}
			}*/
			content += '<div class="guide-'+i+guide_selected+'"'+ style + '><div>'+
						'	<span class="no">' + (parseInt(i)+1)+'.' + '</span>'+
						'	<span class="text">' + core.GetString( guide[GUIDE.CONTENT_SID], guide_content ) + '</span>'+
						'</div></div>';
		}
		
		if(i==path.guide.length){
			//End - Destination Name
			if(guide_index==path.guide.length){
				guide_selected=" selected";
			} else {
				guide_selected="";
			}
			var style='';
			/*if (name.length>150){
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:12px;"';
				}
			} else if (name.length>120){
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:13px;"';
				}
			} else if (name.length>90){
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:14px;"';
				}
			} else {
				if(core.GetLanguage()=='ta'){
					style=' style="font-size:15px;"';
				}
			}*/
			//content += '<div class="guide-end'+guide_selected+'"'+ style + '><div><span class="img"></span><span class="text">' + name + '</span></div></div>';
			
			var txtreached = GetString( 'txtreached', core.GetLanguage() );
			content += '<div class="guide-end'+guide_selected+'"'+ style + '><div style="border-bottom: 0;">'+
						'	<span class="no">' + (parseInt(i)+1)+'.' + '</span>'+
						'	<span class="text">' + txtreached.replace('ABC', name) + '</span>'+
						'</div></div>';
		}
	}
	
	that.SetHtmlIf( content, contentdiv.find(".Conveno_GuideInst"), content );
	
	for(i=0; i<path.guide.length; i++){
		//Bind click event to the guide text
		$('.guide-'+i).click( (function(i) {
			return function() {
				param.guide_index = i;
				core.Display("ConvenoGuide", param, caller);
				
				slideshow=false;
				
				$('.btn-prev').addClass("disabled");
				$('.btn-next').addClass("disabled");
				
				$('.btn-pause').removeClass("hidden");
				$('.btn-first').removeClass("disabled");
				$('.btn-last').removeClass("disabled");
				$('.btn-play').addClass("hidden");
				$('.btn-replay').addClass("hidden");
			}
		})(i) );
	}
	
/*	//Bind click for Start text
	$('.guide-start').click( (function(param, caller) {
		return function() {
			current_guide_index=0;
			param.guide_index=0;
			core.Display("ConvenoPath", param, caller);
			
			slideshow = false;
			
			$('.btn-prev').addClass("disabled");
			$('.btn-next').addClass("disabled");
			
			$('.btn-pause').addClass("hidden");
			$('.btn-first').addClass("disabled");
			$('.btn-last').addClass("disabled");
			$('.btn-play').removeClass("hidden");
			$('.btn-replay').addClass("hidden");
		}
	})(param, caller) );*/
	
	//Bind click for end text
	$('.guide-end').click( (function(i) {
		return function() {
			last_step=true;
			current_guide_index=i;
			param.guide_index = i;
			param.pmk_id = path.dst_pmk_id;
			
			/** Causing browser to crash **/
			//param.hide_path = 1;
			//core.Display("ConvenoPlacemark", param, caller);
			
			//$('.Conveno_GuideCount').css('display', 'none');
			
			//Update selected class
			$('.Conveno_GuideInst div').removeClass('selected');
			$('.guide-end').addClass('selected');
			
			if(mygerm) ConvenoGerm.prototype.UpdatePlacemark({ pmk_id : param.pmk_id });
			//core.Emit("OnContentUpdated2", "ConvenoPlacemark", param);
			renderConvenoGuidedSteps('ConvenoGuide', param);
			
			if(mygerm){
				mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
				slideshow=false;
				
				$('.btn-prev').removeClass("disabled");
				$('.btn-next').addClass("disabled");
				
				$('.btn-pause').addClass("hidden");
				$('.btn-first').removeClass("disabled");
				$('.btn-last').addClass("disabled");
				$('.btn-play').addClass("hidden");
				$('.btn-replay').removeClass("hidden");
				
				//make placemark bounce
				bouncing_pmk_holder = cgerm.map_id_gpmk[param.pmk_id];
				bouncing_pmk = new Bouncer(16);
				bouncing_pmk.Start(bouncing_pmk_holder);
			}
		}
	})(path.guide.length) );
	
	
	//var count = guide_index+1 + "/" + path.guide.length + 1; //Extra 1 guide for "You have reached.."
	//contentdiv.find(".Conveno_GuideCount").text(count);
	
	//Back Button
	var fnCurrent = (function(param, caller) {
		return function() {
			//core.Display('ConvenoPlacemark', param, caller);
			param.pmk_id = current_pmk_id;
			param.cat_id = current_cat_id;
			cvn.Display('ConvenoPlacemark', param, current_caller);
		};
	})(param, caller);
	
	if (typeof fnCurrent=="function") {
		that.BindClick(".Conveno_BtnBack", fnCurrent);
		$(".Conveno_BtnBack").removeClass("hidden");
	} else {
		$(".Conveno_BtnBack").addClass("hidden");
	}
	
	renderGermController();
	
	renderConvenoCallout(page, param, caller);
	
	$('.Conveno_GuideInst').children('div').hover(
		function () {
			$(this).addClass("hover");
		}, 
		function () {
			$(this).removeClass("hover");
		}
	);
}

function renderConvenoCallout(page, param, caller){
	if(!mygerm) return;
	
	var core = ConvenoCore.prototype;
	var PMK  = ConvenoConst.PMK;
	var GUIDE = ConvenoConst.GUIDE;
	var jsobj = core.GetData();
	var path_index = param.path_index;
	var guide_index = param.guide_index ? param.guide_index : 0;
	var SEG  = ConvenoConst.SEG;
	var NODE = ConvenoConst.NODE;
	
	var path = jsobj.path[path_index];
	if (!path) {
		__log("<ERR> Path not found. path_index: " + path_index);
		return false;
	}
	
	if(!path.guide){
		$('#Conveno_Guide').css('display', 'none');
		
		mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
		//$('#htmlBoxPositioner1').remove();
		//$('#htmlBoxContentIframe1').remove();
		if(autostart_slideshow) slideshow=true; else slideshow=false;
		
		//return false;
	} else {
		$('#Conveno_Guide').css('display', 'block');
	}
	
	var pmk = core.GetPlacemarkById(path.dst_pmk_id);
	if (!pmk) {
		__log("<ERR> No placemark found: " + path.dst_pmk_id);
		core.Display();
		return false;
	}
	var name = core.GetString( pmk[PMK.NAME_SID], pmk[PMK.NAME] );
	
	//var dest = core.GetString( pmk[PMK.NAME_SID], pmk[PMK.NAME] );
	var overlay_content;
	if(page=="ConvenoGuide"){
		//var guide = (guide_index==0) ? path.guide[0] : path.guide[guide_index-1];
		var guide = (guide_index==0) ? path.guide[0] : path.guide[guide_index];
		if(guide){
			var guide_content = guide[GUIDE.CONTENT];
			overlay_content = core.GetString( guide[GUIDE.CONTENT_SID], guide_content );
		}
		if(guide_index==path.guide.length){
			//var txtreached = GetString( 'txtreached', core.GetLanguage() );
			//overlay_content = txtreached.replace('ABC', dest);
			overlay_content = name;
		}
		
		/*
		//Overlay the Guide Text on top of Germanium
		var leftPadding = Math.round((mygerm.GetWidth()-543)/2) + "px";
		if(!$('#htmlBoxPositioner1').length){
			//AddHTMLOverlay('germOverlay_ConvenoGuide', 'overlay_wrapper', 'germdiv', 490, 50, 940, 45, overlay_content);
			//html_box = renderHTMLBox(overlay_content);
			// Retrieve the user defined <div> for Germanium. This will be done automatically when fully integrated
			var germTopElement = document.getElementById("germdiv").firstChild;
			htmlBox = new HTMLBox(germTopElement);
			htmlBox.SetSize("543px", "80px"); 		// prop. size
			htmlBox.SetTop("40px");
			htmlBox.SetLeft(leftPadding);
			htmlBox.SetPadding("10px");
			htmlBox.SetBackgroundColor("#EFEFEF");
			htmlBox.SetBorder("4px solid #999999");
			htmlBox.SetZIndex(2002);
			htmlBox.SetIsDraggable(false);
			htmlBox.SetUseCloseButton(false);
			htmlBox.SetContent('<div class="guideContentDiv">'+overlay_content+'</div>');
			htmlBox.Show();
		} else {
			htmlBox.SetSize("543px", "80px");
			htmlBox.SetTop("40px");
			htmlBox.SetLeft(leftPadding);
			//htmlBox.Hide();
			//htmlBox.Show();
			htmlBox.SetContent('<div class="guideContentDiv">'+overlay_content+'</div>');
			htmlBox.Show();
			//if($("#htmlBoxContentHolder1").length) $("#htmlBoxContentHolder1").html(overlay_content);
		}
		//$("#htmlBoxPositioner1").removeClass("path-overview");
		*/
		
		//Slideshow
		if(slideshow==true){
			$('.btn-pause').removeClass("hidden");
			$('.btn-first').removeClass("disabled");
			$('.btn-last').removeClass("disabled");
			$('.btn-play').addClass("hidden");
			$('.btn-replay').addClass("hidden");
		} else {
			$('.btn-pause').addClass("hidden");
			$('.btn-first').removeClass("disabled");
			$('.btn-last').removeClass("disabled");
			$('.btn-play').removeClass("hidden");
			$('.btn-replay').addClass("hidden");
		}
		
		//Prev btn
		if (guide_index==0 && is_gliding==false) {
			$('.btn-prev').addClass("disabled");
		} else {
			$('.btn-prev').removeClass("disabled");
		}
		
		//Next Btn
		if (guide_index<path.guide.length) { //Extra 1 guide for "You have reached.."
			$('.btn-next').removeClass("disabled");
		} else {
			$('.btn-next').addClass("disabled");
		}
		param.guide_index = guide_index;
		
		if (guide_index<path.guide.length){
			mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
			mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, (function(param, overlay_content) {
				return function(){
					var pos = cvn_germ.GetGuidePosition(param.path_index, param.guide_index);
					if (pos) {
						var geom = gpmkFloat.GetGeometry();
						geom.SetPosition(pos[0], pos[1], pos[2]);
						gpmkFloat.SetContent('<div class="Conveno_GuideText Conveno_Callout">'+overlay_content+'</div>');
						active_pmk = gpmkFloat;
						cvn_germ.SetActivePlacemark(gpmkFloat);
					}
				}
			})(param, overlay_content));
		}/* else {
			current_page = "ConvenoPlacemark";
		}*/
	} else {
		/*var segments = path.segment;
		var node = jsobj.node;
		var walking_dist = 0;
		var start_node;
		for (var i in segments) {
			var p = segments[i][SEG.START_NODE_ID];
			var q = segments[i][SEG.END_NODE_ID];
			if (i==0) start_node = p; // record starting node

			if (node[p] && node[q]) { // && (segments[i][SEG.TYPE] == TYPE.FLOOR)) {
				var node1 = new Vec3( node[p][NODE.X],node[p][NODE.Y],node[p][NODE.Z] );
				var node2 = new Vec3( node[q][NODE.X],node[q][NODE.Y],node[q][NODE.Z] );
				
				var dist = node1.Minus(node2).Length();
				walking_dist += dist;
			}
		}
		var walking_time = walking_dist / ConvenoConst.AVG_WALKING_SPEED;
		walking_dist += 0.5;
		walking_time += 0.5;*/
		
		var segments = path.segment;
		var start_node = segments[0][SEG.START_NODE_ID];
		var walking_dist = path.estdist;
		var walking_time = path.esttime;
		walking_dist += 0.5;
		walking_time += 0.5;
		
		var overlay_content = 
			'<div class="Conveno_PathInfo">'+
			'	<div class="p1"><span class="Conveno_WalkingDist">'+walking_dist.toFixed(0)+'</span><span class="Conveno_Unit">'+GetString("txtmetres")+'</span></div>'+
			'	<div class="p2"><span class="Conveno_WalkingTime">'+walking_time.toFixed(0)+'</span><span class="Conveno_Unit">'+GetString("txtmins")+'</span></div>'+
			'</div>';
		
		$('.Conveno_PathInfo').remove();
		$('#controller-wrapper').append( overlay_content );
		mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, function() { mygerm.UnsetActivePlacemark(); });
		
		//active_pmk = cvn_germ.map_id_gpmk[param.pmk_id];
		//cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[param.pmk_id]);
	}
	
	//if(mygerm.GetEye().IsGliding()) mygerm.GetEye().CancelGlide();
}

function repositionGermController(){
	if(typeof mygerm=="undefined") return;
	//if($('#htmlBoxTogglerBtn .maximize').length) return;
	
	//var leftPadding = Math.round((mygerm.GetWidth()-253)/2) + "px";
	var leftPadding = "0px";
	var topPadding = Math.round(mygerm.GetHeight()-64) + "px";
	if($('#htmlBoxContentIframe1').length) $('#htmlBoxContentIframe1').css("left", leftPadding).css("top", topPadding);
	if($('#htmlBoxPositioner1').length) $('#htmlBoxPositioner1').css("left", leftPadding).css("top", topPadding);
}
function repositionLegendHtmlBox(){
	if(typeof mygerm=="undefined") return;
	if(!$('#htmlBoxPositioner2').length) return;
	
	//var topPadding = Math.round((mygerm.GetHeight()-200)/2) + "px";
	//var leftPadding = Math.round((mygerm.GetWidth()-300)/2) + "px";
	var topPadding = Math.round(mygerm.GetHeight()-145) + "px";
	var leftPadding = "10px";
	if($('#htmlBoxContentIframe2').length) $('#htmlBoxContentIframe2').css("left", leftPadding).css("top", topPadding);
	if($('#htmlBoxPositioner2').length) $('#htmlBoxPositioner2').css("left", leftPadding).css("top", topPadding);
}
function onCenterResized(){
	var germ_height = $(window).height() - 60 + "px";
	$('#germdiv').css('height', germ_height);
	$('#germdiv').addClass('forceReflow').removeClass('forceReflow'); /* to fix resizing bug in Chrome & IE6 */
	
	var bottom_width = $('#bottom').width();
	var bottom_nav_width = $('#bottom-nav').width();
	$('#Conveno_Legend_Wrapper .center').css('width', bottom_width - bottom_nav_width - 12 - 20 - 18 + "px" );
	
	//alert('resize center');
	repositionGermController();
	repositionLegendHtmlBox();
	
	/*if(!app_settings.banner){
		$('.banner').addClass('hidden');
		
		var content_wrapper_height = $('.germ-content-wrapper').height() + 83 + 8;
		var main_height = $('#main').height() + 83 + 8;
		var pane_height = $('.scroll-pane').height() + 83 + 8;
		$('.germ-content-wrapper').css('height', content_wrapper_height+'px');
		$('#main').css('height', main_height+'px');
		$('.scroll-pane').css('height', pane_height+'px');
		
		if(!(BrowserDetect.browser.toLowerCase()=="explorer" && parseInt(BrowserDetect.version)<=6)){
			if($('.scroll-pane').length){
				$('.scroll-pane').jScrollPane({
					showArrows:true
					//,verticalDragMinHeight: 76
					//,verticalDragMaxHeight: 76
					//,horizontalDragMinWidth: 76
					//,horizontalDragMaxWidth: 76
				});
			}
		}
	} else {
		$('.banner').removeClass('hidden');
		//put banner image in div.banner
	}	
	*/
	
	/* IE6 Hack */
	/*var isWestOpen = !myLayout.state.west.isClosed;
	if(isWestOpen){
		$('.ui-layout-resizer-west').css('left', '357px');
	} else {
		$('.ui-layout-resizer-west').css('left', '0px');
	}*/
}
	
function onWestResized(){
	var win_width = $(window).width();
	var win_height = $(window).height();
	
	if(win_width <= 1024){
		$('body').addClass('narrow-win');
	} else {
		$('body').removeClass('narrow-win');
	}
	
	var main_height = win_height - $('#main').offset().top - 21;
	$('#main').css('height', main_height+'px');
	
	if($('#Conveno_ContentWrapper.scroll-pane').length){
		var header_height = Math.round($('#Conveno_ContentWrapper.scroll-pane').offset().top) - Math.round($('#main').offset().top);
		$('#Conveno_ContentWrapper.scroll-pane').css('height', (main_height-header_height)+'px');
	}
	if($('.ConvenoCategory .scroll-pane').length){
		var header_height = Math.round($('.ConvenoCategory .scroll-pane').offset().top) - Math.round($('#main').offset().top);
		$('.ConvenoCategory .scroll-pane').css('height', (main_height-header_height)+'px');
	}
	if($('.ConvenoNameList .scroll-pane').length){
		var header_height = Math.round($('.ConvenoNameList .scroll-pane').offset().top) - Math.round($('#main').offset().top);
		$('.ConvenoNameList .scroll-pane').css('height', (main_height-header_height)+'px');
	}
	if($('.ConvenoLevelSelect .scroll-pane').length){
		var header_height = Math.round($('.ConvenoLevelSelect .scroll-pane').offset().top) - Math.round($('#main').offset().top);
		$('.ConvenoLevelSelect .scroll-pane').css('height', (main_height-header_height)+'px');
	}
	if($('.ConvenoByLevel .scroll-pane').length){
		var header_height = Math.round($('.ConvenoByLevel .scroll-pane').offset().top) - Math.round($('#main').offset().top);
		$('.ConvenoByLevel .scroll-pane').css('height', (main_height-header_height)+'px');
	}
	
/*	
	if(!(BrowserDetect.browser.toLowerCase()=="explorer" && parseInt(BrowserDetect.version)<=7)){
		if($('.scroll-pane').length){
			$('.scroll-pane').jScrollPane({
				showArrows:true
				//,verticalDragMinHeight: 76
				//,verticalDragMaxHeight: 76
				//,horizontalDragMinWidth: 76
				//,horizontalDragMaxWidth: 76
			});
		}
	}
*/
}
	
function SetBlockVisibility(blockId, visibility){
	var block = mygerm.GetBlockByHandle(blockId) ;
	block.SetVisibility(visibility) ;
	SetLevelsVisibility(block.GetTopLevel().GetHandle(), visibility) ;
}
function SetLevelsVisibility(levelId, visibility){
	var level = mygerm.GetLevelByHandle(levelId) ;
	while (level)
	{
		level.SetVisibility(visibility) ;
		level = level.GetLevelBelow() ;
	}
	level = mygerm.GetLevelByHandle(levelId).GetLevelAbove() ;
	while (level)
	{
		level.SetVisibility(!visibility) ;
		level = level.GetLevelAbove() ;
	}		
}
function SetBBLVisibility(param, visibility){
	var building = mygerm.GetBuildingByBBLId( param.building_id, false );
	if(building){
		var i;
		for (i=0; i<building.GetNumberOfBlocks(); i++)
		{
			if(building.GetBlockByIndex(i).GetBBLId()!=param.block_id){
				SetBlockVisibility(building.GetBlockByIndex(i).GetHandle(), false) ;
			} else {
				SetBlockVisibility(building.GetBlockByIndex(i).GetHandle(), true) ;
			}
		}
		
		var level = mygerm.GetLevelByBBLId(param.building_id, param.block_id, param.level_id) ;
		while (level)
		{
			level.SetVisibility(visibility) ;
			level = level.GetLevelBelow() ;
		}
		level = mygerm.GetLevelByBBLId(param.building_id, param.block_id, param.level_id).GetLevelAbove() ;
		while (level)
		{
			level.SetVisibility(!visibility) ;
			level = level.GetLevelAbove() ;
		}
	}
}

function updateBuildingView(param){
	//console.log(param);
	var level = mygerm.GetLevelByBBLId(param.building_id, param.block_id, param.level_id);
//	mygerm.GetEye().GlideEyeToLevel(level);
	//ShowLevelsBelow($(this).prev().attr("id"));
	SetBBLVisibility(param, true );
	//hide levels in other blocks?
	
	if(typeof bouncing_pmk!="undefined") bouncing_pmk.Stop();
	cvn_germ.visualpath.Hide();
	
	//show all placemark in this level
	var jsobj = cvn.GetData();
	var arrpmk = jsobj.pmk;
	var PMK = ConvenoConst.PMK;
	var hideLabel = $("#cbHideLabels").attr("checked");
	for (var pmk_id in arrpmk){
		if(param.building_id==arrpmk[pmk_id][PMK.BLDG_BBL_ID] && param.block_id==arrpmk[pmk_id][PMK.BLOCK_BBL_ID] && param.level_id==arrpmk[pmk_id][PMK.LEVEL_BBL_ID]){
			cvn_germ.map_id_gpmk[pmk_id].Show();
			if(hideLabel==false){
				cvn_germ.map_id_gpmk[pmk_id].ShowLabel();
			} else {
				cvn_germ.map_id_gpmk[pmk_id].HideLabel();
			}
		} else {
			cvn_germ.map_id_gpmk[pmk_id].Hide();
		}
		//console.log(arrpmk[pmk_id]);
	}
	
	//$('#cbSamePmk').attr('checked', 'true');
	
	//mygerm.GetEye().GlideEyeToLevelOrt(level, -1.66, -0.36, 0);
	//mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideStarted);
	//mygerm.AddEventHandler( Germanium.Event.OnGlideStarted, function() { mygerm.GetEye().SetTargetDistance(100, true); } );
	mygerm.GetEye().GlideEyeToLevelOrt(level, -Math.PI/2, 0, 0);
	
	//-1.6649988889694214, y=-0.364999920129776, z=0}
	//targetdist 100
	//GlideEyeToLevelOrt(level, EulerAngle);
	//http://www.germanium3d.com/static/code/api/files/Values-js.html#EulerAngle
	//http://www.germanium3d.com/static/code/api/files/WebControl-js.html#WebControl.CreateEulerAngle
}
	
function resetToDefaultView(){
	if(!mygerm) return;
	
	mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
	mygerm.GetEye().FinishGlide();
	
	if(typeof bouncing_pmk!="undefined") bouncing_pmk.Stop();
	
	mygerm.UnsetActivePlacemark();
	cvn_germ.SetCurrentPlacemark();
	
	//hide all placemarks
	//__log(new Date().getTime()+" - hide all pmks");
	var jsobj = cvn.GetData();
	var arrpmk = jsobj.pmk;
	for (var pmk_id in arrpmk){
		cvn_germ.map_id_gpmk[pmk_id].Hide();
	}
	//__log(new Date().getTime()+" - hide vis path");
	cvn_germ.visualpath.Hide();
	
	//__log(new Date().getTime()+" - hide buildings");
	// unhide buildings, blocks, levels
	if(!in_array(jsobj.app[ConvenoConst.APP.NAME], skip_unhide_buildings)){
		var bShow=true;
		var iNbldg = mygerm.GetNumberOfBuildings();
		var idx = 0;
		
		while (idx<iNbldg)
		{
			var bldg = mygerm.GetBuildingByIndex(idx);
			bldg.SetVisibility(bShow);
			var iNblk = bldg.GetNumberOfBlocks();
			var idy = 0;
			while (idy<iNblk)
			{
				var block = bldg.GetBlockByIndex(idy);
				block.SetVisibility(bShow);
				for (var level = block.GetBottomLevel(); level; level = level.GetLevelAbove()) {
					level.SetVisibility(bShow);
				}
				idy++;
			}
			idx++;
		}
	}
	
	//__log(new Date().getTime()+" - set view");
	// set view
	var APP = ConvenoConst.APP;
	var jsobj = cvn.GetData();
	var view_id = jsobj.app[APP.VIEW_ID];
	if (view_id && jsobj.view && jsobj.view[view_id]) {
		var param = jsobj.view[view_id];
		var eyeparam = mygerm.CreateEyeParams(param[0],param[1],param[2],param[3],param[4],param[5],param[6]);
		mygerm.GetEye().SetParams(eyeparam); //mygerm.GetEye().GlideEyeToEyeParams(eyeparam);
	}
	
	//__log(new Date().getTime()+" - update pmk visbits");
	ConvenoGerm.prototype.UpdatePlacemarksVisibility();
	//__log(new Date().getTime()+" - update pmk visbits (end)");
}

function showPlacemarksLabel(){
	//show all placemarks label
	var jsobj = cvn.GetData();
	var arrpmk = jsobj.pmk;
	for (var pmk_id in arrpmk){
		cvn_germ.map_id_gpmk[pmk_id].ShowLabel();
	}
}

var showAll=false;
var cur_input="";
function renderSearchEngine(){
	if($("#keyword-wrapper").hasClass("hidden")) $("#keyword-wrapper").removeClass("hidden");
	
	var jsobj = cvn.GetData();
	var core = ConvenoCore.prototype;
	var PMK = ConvenoConst.PMK;
	var CAT = ConvenoConst.CAT;
	var arrpmk = jsobj.pmk;
	var arrcat = jsobj.cat;
	var pmkARR = new Array();
	var catARR = new Array();
	var dataARR = new Array();
	
	//cat
	for (var cat_id in arrcat){
		var temp_arr = new Array();
		temp_arr[0] = "CAT-"+arrcat[cat_id][0];
		temp_arr[1] = core.GetString( arrcat[cat_id][CAT.NAME_SID], arrcat[cat_id][CAT.NAME] ).replace(/&amp;/g, '&');
		temp_arr[2] = null;
		if(arrcat[cat_id][5]){
			temp_arr[3] = '<img src="'+arrcat[cat_id][5]+'" /> '+core.GetString( arrcat[cat_id][CAT.NAME_SID], arrcat[cat_id][CAT.NAME] );
		} else {
			temp_arr[3] = "";
		}
		catARR.push( temp_arr );
	}
	
	//pmk
	for (var pmk_id in arrpmk){
		var temp_arr = new Array();
		temp_arr[0] = "PMK-"+arrpmk[pmk_id][0];
		//temp_arr[1] = addslashes(arrpmk[pmk_id][1]);
		temp_arr[1] = core.GetString( arrpmk[pmk_id][PMK.NAME_SID], arrpmk[pmk_id][PMK.NAME] ).replace(/&amp;/g, '&');
		temp_arr[2] = null;
		if(arrpmk[pmk_id][5]){
			//temp_arr[3] = addslashes('<img src="'+arrpmk[pmk_id][5]+'" /> '+arrpmk[pmk_id][1]);
			temp_arr[3] = '<img src="'+arrpmk[pmk_id][5]+'" /> '+core.GetString( arrpmk[pmk_id][PMK.NAME_SID], arrpmk[pmk_id][PMK.NAME] );
			//use <span icon> & name!
		} else {
			temp_arr[3] = "";
		}
		pmkARR.push( temp_arr );
	}
	
	var dataARR = catARR.concat(pmkARR);
	var dataJSON = JSON.parse(JSON.stringify(dataARR));
	//console.log(arrpmk);
	//console.log(pmkJSON);
	//alert(pmkJSON);
	
	if($('.textboxlist').length){
		$('#keyword-wrapper').html('<input id="keyword" type="text" value=""></input><button id="btn-search"><div class="normal"></div></button><button id="btn-clear" class="hidden"><div class="normal"></div></button>');
	}
	
	// Autocomplete initialization
	var t4 = new $.TextboxList('#keyword', {unique: true, plugins: {autocomplete: {placeholder: GetString("txtnoresults")}}});
	//minLength option
	//var t4 = new $.TextboxList('#keyword', {unique: true, plugins: {autocomplete: {placeholder: false}}});
	//t4.add('John Doe').add('Jane Roe');
	
	t4.getContainer().addClass('textboxlist-loading');				
	//$.ajax({url: 'http://www.dev.conveno.com/theme/modern/js/TextboxList/Source/data1.json', dataType: 'json', success: function(r){
	t4.plugins['autocomplete'].setValues(dataJSON);
	t4.getContainer().removeClass('textboxlist-loading');
	//}});
	
	//alert(jsobj.bbl2["Fusionopolis"]["_"][ConvenoConst.BLDG.NAME]);
	$('.textboxlist-bit-editable-input').addClass("default");
	
	var app_name = core.GetString( jsobj.app[ConvenoConst.APP.NAME_SID], jsobj.app[ConvenoConst.APP.NAME] );
	$('.textboxlist-bit-editable-input').val( GetString("txtsearch") + ' ' + app_name );
	$('.textboxlist-bit-editable-input').bind("blur", function(){
		if($(this).val()==""){
			$('.textboxlist-bit-editable-input').addClass("default");
			$(this).val( GetString("txtsearch") + ' ' + app_name );
		}
	});
	$('.textboxlist-bit-editable-input').bind("focus", function(){
		if($(this).val()==GetString("txtsearch") + ' ' + app_name){
			$('.textboxlist-bit-editable-input').removeClass("default");
			$(this).val("");
		}
	});
	
	$("#btn-search").click(function() {
		setTimeout( function(){ $(".textboxlist-bit-editable-input").focus(); }, 100);
	});
	$("#btn-clear").click(function() {
		showAll = false;
		$(this).addClass("hidden");
		//$('.textboxlist input').val('');
		//$('.textboxlist-bit-editable-input').val( GetString("txtsearch") + ' ' + app_name );
		$('.textboxlist-bit-editable-input').val('');
		$('.textboxlist-bit-editable-input').blur();
		setTimeout(function(){ $('.textboxlist-bit-editable-input').focus(); }, 100);
	});
	$(".textboxlist input").bind('keyup', function() {
		if($(this).val()!=''){
			$("#btn-clear").removeClass("hidden");
		} else {
			$("#btn-clear").addClass("hidden");
		}
	});
	cur_input="";
	$(".textboxlist input").bind('change', function() {
		if(cur_input!=$(this).val() && cur_input!=""){
			showAll = false;
		}
		cur_input = $(this).val();
	});
	
	//$( "#search-results" ).dialog({ autoOpen: false, position: [1592,121] });
	//$( "#search-results" ).dialog({ autoOpen: false, position: [1592,130], width: 283, height: 200 });
	
	/*$( "#btn-search" ).click(function() {
		//if(exist) then repos
		$( "#search-results" ).dialog( "open" );
		$( "#search-results" ).html('<div class="textboxlist-autocomplete" style="width: 254px; margin-left:4px;">'+
									'<div class="textboxlist-autocomplete-placeholder" style="display: none;">Type to receive suggestions</div>'+
									'	<ul class="textboxlist-autocomplete-results1" style="display: block; margin-bottom:15px;">'+
									'		<li class="textboxlist-autocomplete-result" style="background-color:#CCCCCC; border:1px solid #4D4D4D;">'+
									'			<b>Placemark:</b>'+
									'		</li>'+
									'		<li class="textboxlist-autocomplete-result" style="cursor: pointer;">'+
									'			<img src="res/icon/diamond_blue.png"> What\'<strong class="textboxlist-autocomplete-highlight">s</strong> Next <strong class="textboxlist-autocomplete-highlight">S</strong>tudio'+
									'		</li>'+
									'		<li class="textboxlist-autocomplete-result" style="cursor: pointer;">'+
									'			<img src="res/icon/video.png"> <strong class="textboxlist-autocomplete-highlight">S</strong>creening Room'+
									'		</li>'+
									'		<li class="textboxlist-autocomplete-result" style="cursor: pointer;">'+
									'			<img src="res/icon/diamond_blue.png"> <strong class="textboxlist-autocomplete-highlight">S</strong>tudio'+
									'		</li>'+
									'		<li class="textboxlist-autocomplete-result" style="background-color:#CCCCCC; border:1px solid #4D4D4D;">'+
									'			<b>Description:</b>'+
									'		</li>'+
									'		<li class="textboxlist-autocomplete-result" style="cursor: pointer;">'+
									'			Fu<strong class="textboxlist-autocomplete-highlight">s</strong>ionopolis F11 is a world-class R&D workspace for Interactive Digital Media (IDM) companies in Singapore...'+
									'		</li>'+
									'		<li class="textboxlist-autocomplete-result" style="cursor: pointer;">'+
									'			The What<strong class="textboxlist-autocomplete-highlight">s</strong> Next Studio hosts an exciting collection of IDM showcases for be presentation on the large proj...'+
									'		</li>'+
									'	</ul>'+
									'</div>');
		return false;
	});*/

}

function openCalloutMenu(){
	//__log("OpenCalloutMenu. gpmkActive=" + gpmkActive.GetHandle());						
	var eye = mygerm.GetEye();

	if (eye.IsGliding()) return;
	if (eye.IsRotating()) return;
	//if (cvn_germ.IsGliding()) return;
	if (bMouseDown) return;

	if(active_pmk) cvn_germ.SetActivePlacemark(active_pmk);
}

function isEyeParamEqual(a,b) {
	if (!a || !b) return false;
	var pos1 = a.GetPosition();
	var ort1 = a.GetOrientation();
	var pos2 = b.GetPosition();
	var ort2 = b.GetOrientation();
	return (pos1.x==pos2.x && pos1.y==pos2.y && pos1.z==pos2.z &&
					ort1.x==ort2.x && ort1.y==ort2.y && ort1.z==ort2.z);
}

// states for tracking camera movement
// as well as menu size changes
var lastEyeParam = null;
var eyeParamChanged = false;
var tmLastChanged = 0;
var lastMenuWidth = 0;
var lastMenuHeight = 0;
function pollStateChanges() {
	if(!mygerm.GetEye().IsGliding() && !mygerm.IsCalloutOpen() && $(".Conveno_BtnViewInfo").children("div").text()==GetString("txthideinfo")){
		$(".Conveno_BtnViewInfo").children("div").text(GetString("txtviewinfo"));
	}
	
	if(current_page!="ConvenoGuide") return;
	if(last_step==true) return;
	
	var eye = mygerm.GetEye();
	var eyeParam = eye.GetParams();
	eyeParamChanged = false;

	if (isEyeParamEqual(eyeParam, lastEyeParam)) {
		var tmNow = new Date();
		if (tmNow - tmLastChanged >= ConvenoConst.EYE_STABLE_PERIOD) {
			eyeParamChanged = true;
		}
	} else {
		tmLastChanged = new Date();
		lastEyeParam = eyeParam;
	}

	if (eyeParamChanged) {
		if (!mygerm.GetActivePlacemark()) {
			openCalloutMenu();
		}
	}
}

function updateCalloutContent(){
	if(current_page=="ConvenoGuide"){
		if($('#htmlBoxContentIframe1').length && $('#htmlBoxPositioner1').length && $("#htmlBoxTogglerBtn").length){
			if($("#htmlBoxTogglerBtn").children("div").hasClass("minimize")){
				if(ConvenoCore.prototype.GetLanguage()=='ms' || ConvenoCore.prototype.GetLanguage()=='ta'){
					//$('#htmlBoxContentIframe1').css("width", "450px");
					//$('#htmlBoxPositioner1').css("width", "450px");
					
					htmlBox1.SetSize("468px", "64px");
				} else {
					//$('#htmlBoxContentIframe1').css("width", "370px");
					//$('#htmlBoxPositioner1').css("width", "370px");
					
					htmlBox1.SetSize("388px", "64px");
				}
			}
		}
		var walking_time = $('.Conveno_PathInfo .Conveno_WalkingTime').html();
		var walking_dist = $('.Conveno_PathInfo .Conveno_WalkingDist').html();
		var overlay_content = 
			'<div class="Conveno_PathInfo">'+
			'	<div class="p1"><span class="Conveno_WalkingDist">'+walking_dist+'</span><span class="Conveno_Unit">'+GetString("txtmetres")+'</span></div>'+
			'	<div class="p2"><span class="Conveno_WalkingTime">'+walking_time+'</span><span class="Conveno_Unit">'+GetString("txtmins")+'</span></div>'+
			'</div>';
		$('.Conveno_PathInfo').remove();
		$('#controller-wrapper').append( overlay_content );
		$('#controller-wrapper .header .h1').text(GetString("txtplaythepath"));
		$('#controller-wrapper .header .h2').text(GetString("txtwalk"));
		$('#controller-wrapper .header .h3').text(GetString("txttime"));
		
		if(mygerm.IsCalloutOpen()){
			var core = ConvenoCore.prototype;
			var jsobj = core.GetData();
			var path = jsobj.path[current_path_index];
			if(current_guide_index < path.guide.length){
				var text = $('.Conveno_GuideInst .selected div span.text').html();
				var pos = cvn_germ.GetGuidePosition(current_path_index, current_guide_index);
				if (pos) {
					var geom = gpmkFloat.GetGeometry();
					geom.SetPosition(pos[0], pos[1], pos[2]);
					mygerm.UnsetActivePlacemark();
					gpmkFloat.SetContent('<div class="Conveno_GuideText Conveno_Callout">' + text + '</div>');
					cvn_germ.SetActivePlacemark( gpmkFloat );
					active_pmk = gpmkFloat;
				}
			}
		}
	}
}

ConvenoGerm.prototype.UpdatePlacemarksVisibility = (function(oldfn) {
	return function() {
		__log("new UpdatePlacemarksVisibility()");
		
		oldfn();
		
		if (!cvn_germ) return;
		var jsobj = cvn.GetData();
		var arrpmk = jsobj.pmk;
		var PMK = ConvenoConst.PMK;
		var hideLabel = $("#cbHideLabels").attr("checked");
		for (var pmk_id in arrpmk){
			if(!cvn_germ.map_id_gpmk[pmk_id].IsHidden()){
				if(hideLabel==false){
					cvn_germ.map_id_gpmk[pmk_id].ShowLabel();
				} else {
					cvn_germ.map_id_gpmk[pmk_id].HideLabel();
				}
			}
		}
	};
})(ConvenoGerm.prototype.UpdatePlacemarksVisibility);

function numberOfLegends(){
	var jsobj = cvn.GetData();
	var CAT  = ConvenoConst.CAT;
	var numlegends=0;
	
	for (var i in jsobj.cat) {
		var cat = jsobj.cat[i];
		if (cat[CAT.IS_LEGEND]) {
			numlegends++;
		}
	}
	return numlegends;
}

function numberOfPmkLevels(){
	var hashblocks;
	var numblocks=0;
	var numlevels=0;
	
	// create shortcuts
	var APP  = ConvenoConst.APP;
	var CAT  = ConvenoConst.CAT;
	var PMK  = ConvenoConst.PMK;
	var BLDG = ConvenoConst.BLDG;
	var BLOCK = ConvenoConst.BLOCK;
	var LEVEL = ConvenoConst.LEVEL;
	var VIEW = ConvenoConst.VIEW;
	var NODE = ConvenoConst.NODE;
	var EDGE = ConvenoConst.EDGE;
	var SEG  = ConvenoConst.SEG;
	var GUIDE= ConvenoConst.GUIDE;
	var STR  = ConvenoConst.STR;
	var TRANSITION = ConvenoConst.TRANSITION;
	var MAP_PMK_CAT  = ConvenoConst.MAP_PMK_CAT;
	
	// pre-compute mapping table from {BB} to {L} to [PMK]
	if (hashblocks==undefined) {
		var jsobj = cvn.GetData();

		//pmk to cat mapping
		var pmk_to_cat = {};
		for (var i in jsobj.map_pmk_cat) {
			var entry = jsobj.map_pmk_cat[i];
			var pmk_id = entry[MAP_PMK_CAT.PMK_ID];
			var cat_id = entry[MAP_PMK_CAT.CAT_ID];
			
			var hashcat = pmk_to_cat[ pmk_id ];
			if (!hashcat) {
				hashcat = {};
				pmk_to_cat[pmk_id] = hashcat;
			}

			var cat = jsobj.cat[ cat_id ];
			if (cat) {
				var bIsLegend = cat[CAT.IS_LEGEND];
				pmk_to_cat[pmk_id][cat_id] = bIsLegend;
			}
		}

		hashblocks = {};

		for (var i in jsobj.pmk) {

			var pmk = jsobj.pmk[i];
			var bldgid  = pmk[PMK.BLDG_BBL_ID];
			var blockid = pmk[PMK.BLOCK_BBL_ID];
			var levelid = pmk[PMK.LEVEL_BBL_ID];

			// omit placemarks that only belong to legend categories
			var pmk_id = pmk[PMK.PMK_ID];
			var isLegend = true;
			for (var cat_id in pmk_to_cat[pmk_id]) {
				if (pmk_to_cat[pmk_id][cat_id]==0) {
					isLegend = false;
					break;
				}
			}
			if (isLegend) {
				__log("(Is legend) Skipping "+pmk[PMK.NAME]);
				continue;
			}

			if (!levelid) {
				__log("(No level) Skipping "+pmk[PMK.NAME]);
			} else {
				var key = bldgid + "/" + blockid;
				var hashlevel = hashblocks[ key ];
				if (!hashlevel) {
					hashlevel = {};
					hashblocks[ key ] = hashlevel;
					numblocks++;
				}

				var arrpmk = hashlevel[ levelid ];
				if (!arrpmk) {
					arrpmk = [];
					hashlevel[ levelid ] = arrpmk;
					numlevels++;
				}

				arrpmk.push(pmk);
			}
		}
	}
	return numlevels;
}

function renderMainmenuDesc(){
	var core = ConvenoCore.prototype;
	var jsobj = core.GetData();
	var rows = jsobj.cat;
	var CAT  = ConvenoConst.CAT;
	var desc = core.GetString( rows[mainmenu_id][CAT.CONTENT_SID], rows[mainmenu_id][CAT.CONTENT] );
	if(desc){
		//resetting the state
		$('#app-info .Conveno_Description_Wrapper').css('height', '33px');
		$('.readmore a').html("Read more");
		
		$('#app-info .Conveno_Description_Wrapper').removeClass('hidden');
		$('#app-info .Conveno_Description').html(desc);
		setTimeout(function(){
			if($('#app-info .Conveno_Description').height() > 33){ //33px => .Conveno_Description_Wrapper height
				$('#app-info .readmore').removeClass('hidden');
			}
		}, 10);
	} else {
		$('#app-info .Conveno_Description_Wrapper').addClass('hidden');
		$('#app-info .readmore').addClass('hidden');
	}
	onWestResized();
}

function hidePmkLabels(hideLabel){
	var jsobj = cvn.GetData();
	var arrpmk = jsobj.pmk;
	var PMK = ConvenoConst.PMK;
	for (var pmk_id in arrpmk){
		if(!cvn_germ.map_id_gpmk[pmk_id].IsHidden()){
			if(hideLabel==false){
				cvn_germ.map_id_gpmk[pmk_id].ShowLabel();
			} else {
				cvn_germ.map_id_gpmk[pmk_id].HideLabel();
			}
		}
	}
}

ConvenoGerm.prototype.StartLookaround = function(pmk_id) {
	start_rotation = true;
	//__log('StartLookaround');
	mygerm.UnsetActivePlacemark();
	slideshow = false;
		
	var jsobj = cvn.GetData();
	var core = ConvenoCore.prototype;
	var that = ConvenoGerm.prototype;
	var PMK  = ConvenoConst.PMK;
	var NODE  = ConvenoConst.NODE;
	
	var pmk = core.GetPlacemarkById(pmk_id);
	if (!pmk) {
		__log("<ERR> Not a valid placemark");
		return false;
	}

	var bldgid  = pmk[PMK.BLDG_BBL_ID];
	var blockid = pmk[PMK.BLOCK_BBL_ID];
	var levelid = pmk[PMK.LEVEL_BBL_ID];
	var level = null;
	if (bldgid && blockid && levelid) {
		level = mygerm.GetLevelByBBLId(bldgid, blockid, levelid);
	}
	if (!level) {
		__log("<ERR> Not a valid level");
		return false;
	}

	that.HideAllPlacemarks();
	that.SetCurrentPlacemark(pmk_id); // necessary 'cos HideAllPlacemarks unsets curpmk
	/*that.UponGlideCompleted(function() {
		that.UnhideAllLevels();
		mygerm.GetEye().EnableRotation();
	});*/
	
	mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
	mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, function() {
		//if($('.Conveno_BtnLookaroundStart').hasClass("hidden")) mygerm.GetEye().EnableRotation();
		//__log('OnGlideCompleted, start_rotation='+start_rotation);
		if(start_rotation == true){
			$('.Conveno_BtnLookaroundStart').addClass("hidden");
			$('.Conveno_BtnLookaroundStop').removeClass("hidden");
			that.UnhideAllLevels();
			mygerm.GetEye().EnableRotation();
		}
	});
	
	// subscribe to auto-rotate cancel
	mygerm.AddEventHandler(Germanium.Event.OnAutoRotateCancelled, function() {
		//__log('OnAutoRotateCancelled');
		start_rotation = false;
		//core.Emit("OnLookaroundCancelled");
		mygerm.RemoveAllEventHandlers(Germanium.Event.OnAutoRotateCancelled);
		
		$(".Conveno_BtnViewInfo").removeAttr("disabled");
		$(".Conveno_BtnViewInfo").removeClass("disabled");
		$(".Conveno_BtnViewInfo").children("div").text(GetString("txtviewinfo"));
		
		glide_animation=true;
		setTimeout( function(){ ConvenoGerm.prototype.OnLookaroundCancelled(); }, 100 );
	});
	mygerm.AddEventHandler(Germanium.Event.OnGlideCancelled, function() {
		//core.Emit("OnLookaroundCancelled");
		//UpdatePlacemarksVisibility();
		
		mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCancelled);
			
		$(".Conveno_BtnViewInfo").removeAttr("disabled");
		$(".Conveno_BtnViewInfo").removeClass("disabled");
		$(".Conveno_BtnViewInfo").children("div").text(GetString("txtviewinfo"));
			
		glide_animation=false;
		setTimeout( function(){ ConvenoGerm.prototype.OnLookaroundCancelled(); }, 100 );
	});

	var node = jsobj.node[ pmk[PMK.NODE_ID] ];
	var lookaround_y_offset = pmk[PMK.LOOKAROUND_Y_OFFSET];

	var y;
	if (lookaround_y_offset==null) {
		y = level.GetFloorHeight() + 1.65;
	} else {
		y = node[NODE.Y] + lookaround_y_offset;
	}

	var param = mygerm.CreateEyeParams(node[NODE.X], y, node[NODE.Z]+1, 0,0,0, 1);
	mygerm.GetEye().GlideEyeToEyeParams(param);
}

ConvenoGerm.prototype.StopLookaround = function() {
	start_rotation=false;
	//__log('StopLookaround');
	var that = ConvenoGerm.prototype;
	mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
	if (mygerm.GetEye().IsGliding()) mygerm.GetEye().CancelGlide();
	if (mygerm.GetEye().IsRotating()) {
		mygerm.GetEye().DisableRotation();
	}
	
	mygerm.AddEventHandler(Germanium.Event.OnGlideCompleted, function(){
		if(current_page=="ConvenoPlacemark"){ cvn_germ.SetActivePlacemark(cvn_germ.map_id_gpmk[current_pmk_id]); }
		$(".Conveno_BtnViewInfo").removeAttr("disabled");
		$(".Conveno_BtnViewInfo").removeClass("disabled");
		$(".Conveno_BtnViewInfo").children("div").text(GetString("txthideinfo"));
		mygerm.RemoveAllEventHandlers(Germanium.Event.OnGlideCompleted);
	});
	
	glide_animation=true;
	that.OnLookaroundCancelled();
}

var start_rotation=false, glide_animation=true;
ConvenoGerm.prototype.OnLookaroundCancelled = function(event) {
	var core = ConvenoCore.prototype;
	var that = ConvenoGerm.prototype;
	var PMK  = ConvenoConst.PMK;
	
	core.Emit("OnLookaroundCancelled");

	// unsubscribe to auto-rotate cancel
	mygerm.RemoveEventHandler(Germanium.Event.OnAutoRotateCancelled, ConvenoGerm.prototype.OnLookaroundCancelled);
	
	if(current_page=="ConvenoPath"){
		var param={};
		param.path_index=current_path_index;
		that.UpdatePath(param);
	} else if(current_page=="ConvenoGuide"){
		var param={};
		param.path_index=current_path_index;
		param.guide_index=current_guide_index;
		that.UpdateGuide(param);
	} else {
		// restore to placemark
		var pmk = that.curpmk;
		if (!pmk) {
			__log("<ERR> No current placemark set!");
			return false;
		}
		that.UpdatePlacemark({ pmk_id : pmk[PMK.PMK_ID], glide : glide_animation });
	}
}

ConvenoGerm.prototype.OnPlacemarkDeactivate = function(event) {
	var core = ConvenoCore.prototype;
	core.Emit("OnPlacemarkDeactivate", event);
	
	setTimeout(function(){
		if(typeof bouncing_pmk!="undefined" && cvn_germ.map_id_gpmk[current_pmk_id]) bouncing_pmk.Start(cvn_germ.map_id_gpmk[current_pmk_id]);
		$('.Conveno_BtnViewInfo').children('div').text(GetString("txtviewinfo"));
		
		detachContent();
	}, 100);
}

function attachContent(){
	var wrapper = $(".ConvenoGerm_Wrapper");
	if (wrapper.length>0 && desccallout) {
		desccallout.appendTo(wrapper);
		desccallout.css("visibility", "visible");
		wrapper.css({"width":desccallout.outerWidth()+"px","height":desccallout.outerHeight()+"px"});
	} else {
		setTimeout(attachContent, 10); //TW: hack for API 1.4 and below
		return;
	}
}
function detachContent(){
	if (descwrapper){
		desccallout.appendTo(descwrapper);
		desccallout.css("visibility" , "hidden");
	}
}

