/* Create Timestamp for localConnection connection */
var timestamp = new Date();
var flashWidth=760;
var flashHeight=520;
var ovmap;
var marker_count=0;
var smallVRload=0;
var smallVRloaded=false;
var home="";
var fov="";
var tilt="";
var pan="";
var pt_code1=pt_code2=qt_code1=qt_code2='';

function writeLightboxPano(n,o) {
	var content='', tw=document.writeln; 
    document.writeln=function(txt){content+=txt+"\n"};
	nr=sprintf('%04d',n);
    writevrcode("http://www.fellini.ee/pano/"+nr+"/"+nr+".mov",n,"http://www.fellini.ee/pano/"+nr+"/"+nr+".swf",n,flashWidth,flashHeight);
    document.writeln=tw;
//  alert(content);
//	document.all('code').value =content;
	$(o).innerHTML=content;
}

function startSmallVR(n){
	if ((typeof smallVRloaded!="undefined") && !smallVRloaded) {
		var content='', tw=document.writeln; 
    	document.writeln=function(txt){content+=txt+"\n"};
		nr=sprintf('%04d',n);
    	writevrcode("http://www.fellini.ee/pano/"+nr+"/"+nr+"s.mov",n,"http://www.fellini.ee/pano/"+nr+"/"+nr+"s.swf",n,"347","240");
	    document.writeln=tw;
		var o = document.getElementById('panorama-viewer');
		if (o) o.innerHTML=content;
		smallVRloaded=true;
	}
}

function stopSmallVR() {
	if((typeof smallVRloaded!="undefined") && smallVRloaded) {
		cleanupObjects();
		var o = document.getElementById('panorama-viewer');
		if (o) o.innerHTML = continueFLHTML();
		smallVRloaded=false;
	}
}

function cleanupObjects() {
	if (window.opera || !document.all) {
		var embeds=document.getElementsByTagName("EMBED");
		for (var i=0; i < embeds.length; i++) embeds[i].style.display="none";
		return;
	}
	var objects = document.getElementsByTagName("OBJECT");
	for (var i=0; i < objects.length; i++) {
		objects[i].style.display = 'none';
		for (var x in objects[i]) {
			if (typeof objects[i][x] == 'function') {
				objects[i][x] = function(){};
			}
		}
	}
}

function loadFS(n){
	document.location='http://www.fellini.ee/show/?id='+n;
}

function openFS(n){
	// if SmallFlashVR was used
	smallVRload=n;
	stopSmallVR();
	var w = screen.width ? screen.width : 800;
	var h = screen.height ? screen.height : 550;
	openWindow('http://www.fellini.ee/show/?lang='+lang+'&id='+n,w,h,'panowin',false);
}	

function checkBrowser()
{
	this.ver = navigator.appVersion;
	this.dom = document.getElementById?1:0;
	this.ua = navigator.userAgent.toLowerCase();	
	this.opera= this.ua.indexOf("opera")>-1;	// before ns or ie
	this.ie6 = (this.ver.indexOf("MSIE 6")>-1 && this.dom)?1:0;
	this.ie55 = (this.ver.indexOf("MSIE 5.5")>-1 && this.dom)?1:0;
	this.ie5 = (this.ver.indexOf("MSIE 5")>-1 && this.dom)?1:0;
	this.ie4 = (document.all && !this.dom)?1:0;
	this.ns5 = (this.dom && parseInt(this.ver) >= 5) ?1:0;
	this.ns4 = (document.layers)?1:0;
	this.bw  = (this.ie5 || this.ie4 || this.ns4 || this.ns5 || this.ie55);
	this.os  = (this.ver.indexOf("Macintosh")>-1)? "mac":"pc";
	this.ie  = (this.ie5 || this.ie4 || this.ie55 || this.ie6);
	this.ns  = (this.ns4 || this.ns5);
	this.win = (this.ver.indexOf("Win")>-1) ? 1:0;
	this.mac = (this.ver.indexOf("Mac")>-1) ? 1:0;
	this.lin = ((this.ver.indexOf("Lin")>-1) || (this.ver.indexOf("X11")>-1)) ? 1:0;
	return this;
}

function openWindow(urlX,wX,hX,winX,toolbarsX,modalX) {
	var cb=checkBrowser();
	url=urlX?urlX:home+'/fullscreen.html';
	var win=winX?winX:'win';
	var w=wX?wX:1024;
	var h=hX?hX:768;
	var toolbars=toolbarsX?true:false;
	var modal=modalX?true:false;
	var ow = (w>=screen.width)?(screen.width-10):w;
	var oh = (h>=screen.height)?(screen.height-56):h;
	var centerW=(screen.width-w)/2;
	var centerH=(screen.height-h)/2;
	LeftPosition = (screen.width)?((centerW<0)?0:centerW):0;
	TopPosition = (screen.height)?((centerH<0)?0:centerH):0;
	var location='0';
	var status='0';
	var menubar='0';
	var scrollbars='0';
	var resizable='0';
	var scrolling='no';
	var noresize='noresize';
	ow = (modal && window.showModalDialog)?ow+6:ow;
	oh = (modal && window.showModalDialog)?oh+24:oh;
	if ((w>=screen.width) || (h>=screen.height)) {
		scrollbars = '1';
		scrolling='yes';
		ow = (ow<(screen.width-10))?(ow+14):ow;
		oh = (oh<(screen.height-56))?(oh+14):oh;
	}
	if (toolbars) {
		location='0';
		status='1';
		menubar='0';
		scrollbars='1';
		resizable='1';
		scrolling='yes';
		noresize='';
		TopPosition=0;
	}
	if (cb.opera && !toolbars) {
		popupWindow = window.open('',win,'toolbar=0,location='+location+',directories=0,status='+status+',menubar='+menubar+',width='+(ow+2)+',height='+(oh+2));
		popupWindow.document.writeln('<html><head><title>.:: Panoramas viewer by Ebeling Data OY &copy; ::.</title></head>');
		popupWindow.document.writeln('<frameset rows="1*,'+oh+',1*" cols="1*,'+ow+',1*" frameborder="0" border="0" framespacing="0">');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('<frame name="main"  src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling='+scrolling+' frameborder="0" '+noresize+'>');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('<frame name="blank" src="'+home+'/blank.html" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" noresize>');
		popupWindow.document.writeln('</frameset>');
		popupWindow.document.writeln('</html>');
		popupWindow.document.close(); 
		popupWindow.main.location=url;
		if(popupWindow.window.focus){popupWindow.window.focus();}
	} else if (modal && window.showModalDialog) {
		popupWindow = window.showModalDialog(url,"return false;","dialogHeight: "+oh+"px; dialogWidth: "+ow+"px; dialogTop: px; dialogLeft: px; edge: Raised; center: Yes; help: No; resizable: No; status: No; scroll: "+toolbars+";");
	} else {
		popupWindow = window.open(url,win,'toolbar=0,location='+location+',directories=0,status='+status+',menubar='+menubar+',scrollbars='+scrollbars+',resizable='+resizable+',width='+ow+',height='+oh+',top='+TopPosition+',left='+LeftPosition);
		if(popupWindow.window.focus){popupWindow.window.focus();}
	}
}

function ClickReturn (noret) {
	var cb=checkBrowser();
	if (!noret) {
		if (!cb.opera) return true;
	} else {
		if (cb.mac) return true;
	}
	return false;
}

/*
if (window.location.href.indexOf('id=')!=-1)
{
	var cd=window.location.href.indexOf('id=');
	var idx=window.location.href.slice(cd+3);
	newvr=(idx>=numscenes)?start:idx;
}
*/

function setMap(vl){
	if(changeDMS(vl))return;
	map.setCenter(new GLatLng(document.getElementById('latitude').value,document.getElementById('longitude').value),13);
	addPanoMarker(document.getElementById('longitude').value,document.getElementById('latitude').value);
}

function changeDMS(vl){
	var newLat =0, newLong=0;
	if (vl){
		if(document.getElementById('latitude').value)newLat = document.getElementById('latitudeDMS').value = toDMS(document.getElementById('latitude').value, 'S', 'N');
		if(document.getElementById('longitude').value)newLong = document.getElementById('longitudeDMS').value = toDMS(document.getElementById('longitude').value, 'W', 'E');
	} else {
		if(document.getElementById('latitudeDMS').value)newLat = document.getElementById('latitude').value = toDD(document.getElementById('latitudeDMS').value);
		if(document.getElementById('longitudeDMS').value)newLong = document.getElementById('longitude').value = toDD(document.getElementById('longitudeDMS').value);
	}
	if(!newLat || !newLong)return 1;
	return 0;
}

function toDMS(ns, tp1, tp2) { 
	ch = 0;
	if (ns < 0){
		ns = ns*-1;
		ch = 1;
	}
	ns=parseFloat(ns);
	dd=ns;
	deg=Math.floor(dd);
	dd=dd-deg;
	min=Math.floor(dd/(1/60));
	av=dd-min/60;
	sec=Math.floor(av/(1/3600));
	if(sec==60){min++; sec=0};
	if(min==60){deg++; min=0};
	return deg + unescape("%B0") + min + "'" + sec + "\"" + (ch?tp1:tp2); 
} 

function toDD(ns) { 
	var d1 = ns.indexOf(unescape("%B0")), m1 = ns.indexOf(unescape("'")), s1 = ns.indexOf(unescape("\""));
	var deg = ns.substring(0, d1), min = ns.substring(d1+1, m1), sec = ns.substring(m1+1, s1), tp = ns.substring(s1+1);
	ns = deg;
	ns = parseFloat(ns);
	if(ns=="")ns="0";
	ns=parseInt(ns);
	deg=ns;

	ns = min;
	if(ns=="")ns="0";
	ns = parseFloat(ns);
	ns=parseInt(ns);
	min=ns;

	ns = sec;
	if(ns=="")ns="0"
	ns = parseFloat(ns);
	ns=parseInt(ns);
	sec=ns;
	av = deg + min / 60 + sec / 3600;
	if(tp == 'S' || tp == 'W')av = av*-1;
	return av;
} 

function writeLightboxGmap(n,on,c,o) {
	if (GBrowserIsCompatible()) { 
		useLatitude=latitude[n];
		useLongitude=longitude[n];
		LatDMS = toDMS(useLatitude, 'S', 'N');
		LongDMS = toDMS(useLongitude, 'W', 'E');
		PSLinkText=openPSHTML();
		FSLinkText=openFSHTML();

		var map = new GMap2($(o));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(useLatitude,useLongitude),14,G_SATELLITE_MAP);

		var point = new GLatLng(useLatitude,useLongitude);
		var marker = createMarker0(point,"blue",'<strong>'+c+'</strong><br>Location: '+LatDMS+', '+LongDMS+'<br><br><a href="#" onClick="myLightbox.clearObjects(); myLightbox.changeObject('+on+'); return false;"><strong>'+PSLinkText+'</strong></a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onClick="myLightbox.end; openFS('+n+'); return false;"><strong>'+FSLinkText+'</strong></a>');
		map.addOverlay(marker);
		GEvent.trigger(marker,'click'); 
		
		var ovcontrol = new GOverviewMapControl(new GSize(200,200)); 
		map.addControl(ovcontrol);

		ovmap = ovcontrol.getOverviewMap();
		setTimeout("ovmap.setCenter(new GLatLng(useLatitude,useLongitude),8,G_NORMAL_MAP);",1);
	} else {
		alert("Sorry, the Google Maps API is not compatible with this browser");
    }
}

function createMarker0(point,color,html) {
	var f = new GIcon();
	f.image = "http://labs.google.com/ridefinder/images/mm_20_" + color
	         + ".png";
	f.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
	f.iconSize = new GSize(12,20);
	f.shadowSize = new GSize(22,20);
	f.iconAnchor = new GPoint(6,20);
	f.infoWindowAnchor = new GPoint(6,1);
	f.infoShadowAnchor = new GPoint(13,13);

	var marker = new GMarker(point,
    {icon: f,
     draggable: false});
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
	return marker;
}

function createMarker(point, color) {
  var f = new GIcon();
  f.image = "http://labs.google.com/ridefinder/images/mm_20_" + color
            + ".png";
  f.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
  f.iconSize = new GSize(12,20);
  f.shadowSize = new GSize(22,20);
  f.iconAnchor = new GPoint(6,20);
  f.infoWindowAnchor = new GPoint(6,1);
  f.infoShadowAnchor = new GPoint(13,13);

  newMarker = new GMarker(point,
    {icon: f,
     draggable: true});

  return newMarker;
}

function currentMapTypeNumber(map){
  var type=-1;
  for(var ix=0;ix<map.getMapTypes().length;ix++){
    if(map.getMapTypes()[ix]==map.getCurrentMapType())
      type=ix;
  }
  return type;
} 

function addPanoMarker(lng,lat) {

	// The point we are adding the marker to
	point = new GLatLng(lat,lng);
	// if we already have a marker
	if (marker_count > 0) {
		map.clearOverlays();
	}
	marker = createMarker(point, "green");
	current_marker = map.addOverlay(marker);
	marker_count++;
	document.getElementById('latitude').value = lat;
	document.getElementById('longitude').value = lng;
	GEvent.addListener(marker, "drag", function() {
		document.getElementById('latitude').value = marker.getPoint().y;
		document.getElementById('longitude').value = marker.getPoint().x;
		changeDMS(1);
	});
}

function removePanoMarker(overlay) {
	map.removeOverlay(overlay);
	marker_count--;
	document.getElementById('latitude').value = '';
	document.getElementById('longitude').value = '';
}

/* DOM functions */

function addEvent(elm, evType, fn, useCapture)
// cross-browser event handling for IE5+, NS6+ and Mozilla/Gecko
// By Scott Andrew
{
	if (elm.addEventListener) {
	  elm.addEventListener(evType, fn, useCapture); 
	  return true; 
	} else if (elm.attachEvent) {
	  var r = elm.attachEvent('on' + evType, fn); 
	  return r; 
	} else {
	  elm['on' + evType] = fn;
	}
}

// climb up the tree to the supplied tag.
function ascendDOM(e, target) {
  while (e.nodeName.toLowerCase() != target && 
      e.nodeName.toLowerCase() != 'html')
    e = e.parentNode;
  
  return (e.nodeName.toLowerCase() == 'html') ? null : e;
}

function sprintf()
{
   if (!arguments || arguments.length < 1 || !RegExp)
   {
      return;
   }
   var str = arguments[0];
   var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
   var a = b = [], numSubstitutions = 0, numMatches = 0;
   while (a = re.exec(str))
   {
      var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
      var pPrecision = a[5], pType = a[6], rightPart = a[7];

      numMatches++;
      if (pType == '%')
      {
         subst = '%';
      }
      else
      {
         numSubstitutions++;
         if (numSubstitutions >= arguments.length)
         {
            alert('Error! Not enough function arguments (' + (arguments.length - 1)
               + ', excluding the string)\n'
               + 'for the number of substitution parameters in string ('
               + numSubstitutions + ' so far).');
         }
         var param = arguments[numSubstitutions];
         var pad = '';
                if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
           else if (pPad) pad = pPad;
         var justifyRight = true;
                if (pJustify && pJustify === "-") justifyRight = false;
         var minLength = -1;
                if (pMinLength) minLength = parseInt(pMinLength);
         var precision = -1;
                if (pPrecision && pType == 'f')
                   precision = parseInt(pPrecision.substring(1));
         var subst = param;
         switch (pType)
         {
         case 'b':
            subst = parseInt(param).toString(2);
            break;
         case 'c':
            subst = String.fromCharCode(parseInt(param));
            break;
         case 'd':
            subst = parseInt(param) ? parseInt(param) : 0;
            break;
         case 'u':
            subst = Math.abs(param);
            break;
         case 'f':
            subst = (precision > -1)
             ? Math.round(parseFloat(param) * Math.pow(10, precision))
              / Math.pow(10, precision)
             : parseFloat(param);
            break;
         case 'o':
            subst = parseInt(param).toString(8);
            break;
         case 's':
            subst = param;
            break;
         case 'x':
            subst = ('' + parseInt(param).toString(16)).toLowerCase();
            break;
         case 'X':
            subst = ('' + parseInt(param).toString(16)).toUpperCase();
            break;
         }
         var padLeft = minLength - subst.toString().length;
         if (padLeft > 0)
         {
            var arrTmp = new Array(padLeft+1);
            var padding = arrTmp.join(pad?pad:" ");
         }
         else
         {
            var padding = "";
         }
      }
      str = leftpart + padding + subst + rightPart;
   }
   return str;
}
