// Flash Player Version Detection - Rev 1.5
// Detect Client Browser type
// Copyright(c) 2005-2006 Adobe Macromedia Software, LLC. All rights reserved.
var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

function ControlVersion()
{
	var version;
	var axo;
	var e;

	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}

	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			
			// installed player is some revision of 6.0
			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
			// so we have to be careful. 
			
			// default to the first public version
			version = "WIN 6,0,21,0";

			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
			axo.AllowScriptAccess = "always";

			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}

// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;			
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			if ( descArray[3] != "" ) {
				tempArrayMinor = descArray[3].split("r");
			} else {
				tempArrayMinor = descArray[4].split("r");
			}
			var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?'); 
  else
    return src + ext;
}

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
    var str = '';
    if (isIE && isWin && !isOpera)
    {
  		str += '<object ';
  		for (var i in objAttrs)
  			str += i + '="' + objAttrs[i] + '" ';
  		for (var i in params)
  			str += '><param name="' + i + '" value="' + params[i] + '" /> ';
  		str += '></object>';
    } else {
  		str += '<embed ';
  		for (var i in embedAttrs)
  			str += i + '="' + embedAttrs[i] + '" ';
  		str += '> </embed>';
    }

    //document.write(str);
		return str;
}

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  //AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
	return AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();    

    switch (currArg){	
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":	
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblClick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
      case "id":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "width":
      case "height":
      case "align":
      case "vspace": 
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}


﻿//
//  DevalVR + QuickTime + PTviewer + Flash + Spi-v  Javascript workaround
//	Author: Armando Saenz (aka fiero) http://www.devalvr.com
//  Version: 1.1.9
//
//	p2q_... functions based on Thomas Rauscher's code: 
//	Thomas Rauscher http://www.pano2qtvr.com
//		
//		
//	To embed a panorama just include these lines in your HTML file (change filenames):
//
//	<SCRIPT type="text/javascript" src="detectvr.js"></SCRIPT>
//	<SCRIPT type="text/javascript">
//		writecode("fileForQT.mov","fileForDevalVR.mov","fileForJava.jpg","fileForFlash.swf","fileForSPIV.jpg","100%","94%");
//	</SCRIPT>
//
//
//	NOTE: To use Spi-v viewer, place "SPi-V.dcr" file in same folder that HTML file, you can find it here: http://www.fieldofview.com
//	
// 	IMPORTANT: Use this file at your own risk
//

var minQTVersion = "5.0.0";			// minimal required version checked for QuickTime
var minDevalVRVersion = "0,5,0,0";  // minimal required version checked for DevalVR
var minFlashVersion = "9.0.0";		// minimal required version checked for Flash
var minShockwaveVersion = "10.1";	// minimal required version checked for Shockwave

var pluginPriority_QuickTime=2;		// Set the order of Priority to use in each plugin 
var pluginPriority_DevalVR=1;		// when Autodetect option is selected. Change 
var pluginPriority_Flash=4;			// the number or priority for each plugin
var pluginPriority_Java=5;
var pluginPriority_Spiv=6;
var pluginPriority_PangeaVR=3;

var enableSizeLimits=0;				// 0: disable  1: enable  (size limits for QT, DevalVR and Spi-v)
var enableSizeLimitsJava=0;			// 0: disable  1: enable  (size limits for Java)
var enableSizeLimitsFlash=0;		// 0: disable  1: enable  (size limits for Flash)
var maxViewerWidth="1280";
var maxViewerHeight="1024";
var maxViewerWidthJava="900";
var maxViewerHeightJava="700";
var maxViewerWidthFlash="900";
var maxViewerHeightFlash="700";

var enableSizeRatio=0;				// 0: disable size ratio    1: enable size ratio
var sizeRatio=6/3;					// maximum aspect ratio, horizontal/vertical proportions

var enableLineUnderPanorama=0;		//Enable an adviser line under panorama
var writeLineUnderQuickTime="";
var writeLineUnderDevalVR="";
var writeLineUnderJava="<FONT face='Verdana' size='1' color='#cdcdcd'> Install the DevalVR plugin for an optimal viewing experience <A href='http://www.devalvr.com/install/'>click here to install</A>, and <A href='javascript:reloadPage()'>click here after installing</A></FONT>";
var writeLineUnderFlash="<FONT face='Verdana' size='1' color='#cdcdcd'> Install the DevalVR plugin for an optimal viewing experience <A href='http://www.devalvr.com/install/'>click here to install</A>, and <A href='javascript:reloadPage()'>click here after installing</A></FONT>";
var writeLineUnderSpiV="";
var writeLineUnderPangeaVR="";

var installfont="<FONT face='Verdana' size='2' color='#FFFFFF'>";

var usePurePlayer=0;						//0: PTViewer is used as Java player  1: PurePlayer is used (write correct names below)
var archivePurePlayer='PurePlayer.jar';		//Copy this file in the same folder
var codePurePlayer='PurePlayer.class';

var detectvr_replacepage=0;		// 1 to use window.location.replace() function to open a new page for each viewer (if 1 then writecode parameters must be the name of HTML pages)

/////////////////////////////////////////////////////////////////////////////////////////////////

var isOpera=(navigator.userAgent.indexOf('Opera')!=-1);
var isIE=((navigator.appVersion.indexOf("MSIE") != -1) && !isOpera);
var isDOM=document.getElementById?1:0;
var isNS4=navigator.appName=='Netscape'&&!isDOM?1:0;
var isIE4=isIE&&!isDOM?1:0;
var isWindows=(navigator.platform.indexOf('Win')!=-1);
var isMac=(navigator.platform.indexOf('Mac')!=-1 || navigator.platform.indexOf('PowerPC')!=-1);
var favoriteViewer=getCookie("panorama_viewer");
if(!favoriteViewer) favoriteViewer="DETECT";  //DEVALVR , QT, FLASH, JAVA, SPIV, PANGEAVR, or DETECT
var detectableWithVB = false;
var adviselineunderpano="";
var orgsizepluginx=new Array();
var orgsizepluginy=new Array();
var numberofplugins=0;
var sizepluginx;
var sizepluginy;
var writePluginVR=0;
var writeInstallPluginVR=0;
var reloadpagewhenchangeviewer=0;
var auxparameters=new Array();
auxparameters['devalvr']=new Array();
auxparameters['qt']=new Array();
auxparameters['java']=new Array();
auxparameters['flash']=new Array();
auxparameters['spiv']=new Array();


//Use 'viewerparameters' function to define different parameters for each viewer
//Use "devalvr", "qt", "java", "flash", "spiv" or "pangeavr" in first parameter
//for example: viewerparameters("devalvr","resize","0","autoplay","3");

function viewerparameters(viewer)
{
	auxparameters[viewer]=new Array();
	for(var i=1;i<arguments.length;i++) 
	{
		auxparameters[viewer][i-1]=arguments[i];
	}
}

function writecode(qtfile, devalvrfile, javafile, flashfile, spivfile, sizex, sizey)
{
	writecode2(qtfile, qtfile, devalvrfile, javafile, flashfile, spivfile, sizex, sizey);
}

function writecode2(qtfile, pangeafile, devalvrfile, javafile, flashfile, spivfile, sizex, sizey)
{
	var priority=new Array();
	var existfile=new Array();
	writePluginVR=0;
	writeInstallPluginVR=0;
	
	existfile[1]=(devalvrfile!=null && devalvrfile!="");
	existfile[2]=(qtfile!=null && qtfile!="");
	existfile[3]=(flashfile!=null && flashfile!="");
	existfile[4]=(javafile!=null && javafile!="");
	existfile[5]=(spivfile!=null && spivfile!="");
	existfile[6]=(pangeafile!=null && pangeafile!="");
	
	if((favoriteViewer=="DEVALVR" && (!existfile[1] || !isWindows))
	|| (favoriteViewer=="QT" && !existfile[2])
	|| (favoriteViewer=="JAVA" && !existfile[4]) 
	|| (favoriteViewer=="FLASH" && !existfile[3]) 
	|| (favoriteViewer=="SPIV" && !existfile[5])
	|| (favoriteViewer=="PANGEAVR" && !existfile[6]))
		favoriteViewer="DETECT";
	
	priority[1]=pluginPriority_DevalVR;
	priority[2]=pluginPriority_QuickTime;
	priority[3]=pluginPriority_Flash;
	priority[4]=pluginPriority_Java;
	priority[5]=pluginPriority_Spiv;
	priority[6]=pluginPriority_PangeaVR;
	
	if(favoriteViewer=="DETECT")
	{
		for(order=1;order<=6 && writePluginVR==0;order++)
		{
			for(n=1;n<=6;n++)
			{
				if(priority[n]==order && existfile[n] && IsPluginInstalled(n))
				{
					writePluginVR=n;
					break;
				}
			}
		}
	}
	else if(favoriteViewer=="DEVALVR" && isWindows)
	{
		if(IsPluginInstalled(1)) writePluginVR=1;
		else writeInstallPluginVR=1;
	}
	else if(favoriteViewer=="QT" && (isWindows || isMac))
	{
		if(IsPluginInstalled(2)) writePluginVR=2;
		else writeInstallPluginVR=2;
	}
	else if(favoriteViewer=="FLASH")
	{
		if(IsPluginInstalled(3)) writePluginVR=3;
		else writeInstallPluginVR=3;
	}
	else if(favoriteViewer=="JAVA") 
	{
		if(IsPluginInstalled(4)) writePluginVR=4;
		else writeInstallPluginVR=4;
	}
	else if(favoriteViewer=="SPIV" && (isWindows || isMac)) 
	{
		if(IsPluginInstalled(5)) writePluginVR=5;
		else writeInstallPluginVR=5;
	}
	else if(favoriteViewer=="PANGEAVR" && isMac) 
	{
		if(IsPluginInstalled(6)) writePluginVR=6;
		else writeInstallPluginVR=6;
	}
	
	if(writeInstallPluginVR==0 && writePluginVR==0)
	{
		if(isWindows) writeInstallPluginVR=1;	//Install DevalVR if there is not any plugin (fastest installation)
		else if(isMac) writeInstallPluginVR=2;	//Install QT always in Mac
		else writeInstallPluginVR=4;			//Install Java always in Linux
	} 
	
	adviselineunderpano="";
	if(enableLineUnderPanorama)
	{
		if(writePluginVR==1 && writeLineUnderDevalVR!="") adviselineunderpano=writeLineUnderDevalVR;
		else if(writePluginVR==2 && writeLineUnderQuickTime!="") adviselineunderpano=writeLineUnderQuickTime;
		else if(writePluginVR==3 && writeLineUnderFlash!="") adviselineunderpano=writeLineUnderFlash;
		else if(writePluginVR==4 && writeLineUnderJava!="") adviselineunderpano=writeLineUnderJava;
		else if(writePluginVR==5 && writeLineUnderSpiV!="") adviselineunderpano=writeLineUnderSpiV;
		else if(writePluginVR==6 && writeLineUnderPangeaVR!="") adviselineunderpano=writeLineUnderPangeaVR;
	}

	if(sizex=="") sizex="100%";
	if(sizey=="") sizey="94%";

	orgsizepluginx[numberofplugins]=sizex;
	orgsizepluginy[numberofplugins]=sizey;
	
	CalcLimits(sizex,sizey);
	sizex=sizepluginx;
	sizey=sizepluginy;

	idpano='PANORAMAID';
	if(numberofplugins>0) idpano+=numberofplugins;
	numberofplugins++;
	
	if(writePluginVR==1)
	{
		if(detectvr_replacepage) window.location.replace(devalvrfile); 
		else p2q_EmbedDevalVR(devalvrfile,sizex,sizey,idpano,'filter','0');
	}
	else if(writePluginVR==2)
	{
		if(detectvr_replacepage) window.location.replace(qtfile); 
		else p2q_EmbedQuicktime(qtfile,sizex,sizey,idpano,'scale','tofit','autostart','true','kioskmode','true','controller', 'true');
	}
	else if(writePluginVR==3)
	{
		if(detectvr_replacepage) window.location.replace(flashfile); 
		else p2q_EmbedFlash(flashfile,sizex,sizey,idpano,'bgcolor', '#f0f0f0', 'play', 'true', 'cache','true', 'autoplay','true','allowFullScreen', 'true');
	}
	else if(writePluginVR==4)
	{
		if(detectvr_replacepage) window.location.replace(javafile); 
		else 
		{
			if(usePurePlayer==0) p2q_EmbedPtviewer(javafile,sizex,sizey,idpano,'fov','120','cursor','MOVE','showToolbar','true','imgLoadFeedback','false','pan','120');
			else p2q_EmbedPurePlayer(javafile,sizex,sizey,idpano);
		}
	}
	else if(writePluginVR==5)
	{
		if(detectvr_replacepage) window.location.replace(spivfile); 
		else p2q_EmbedSPiV(spivfile,sizex,sizey,idpano);
	}
	else if(writePluginVR==6)
	{
		if(detectvr_replacepage) window.location.replace(pangeafile); 
		else p2q_EmbedPangea(pangeafile,sizex,sizey,idpano,'maxtilt','0','mintilt','0','maxfov','0','minfov','0');
	}
	else if(writeInstallPluginVR==1)
	{
		var str='<DIV align=center><table border="0" cellpadding="0" cellspacing="0" style="WIDTH: ' + sizex + '; HEIGHT: ' + sizey + '" width="'+sizex+'"  height="'+sizey+'"><tr><td align="center" valign="middle">';
		str+='DevalVR plugin is required to see this content';
		str+='<BR><BR><A href="http://www.devalvr.com/install/">click here to install (250 KB, it only takes a few seconds)</A>';
		str+='<BR><BR><A href="javascript:reloadPage()">click here after installing to reload page</A>';
		str+='</td></tr></table></DIV>';
  
		document.writeln(str);
	}
	else
	{
		var pluginname,pluginurl;
		
		if(writeInstallPluginVR==2) 
		{
			pluginname="QuickTime Player"
			pluginurl="http://www.apple.com/quicktime/download/"
		}
		else if(writeInstallPluginVR==3) 
		{
			pluginname="Adobe Flash Player Version " + minFlashVersion + " or higher."
			pluginurl="http://www.adobe.com/go/getflash/"
		}
		else if(writeInstallPluginVR==4) 
		{
			pluginname="Java Software"
			pluginurl="http://java.com/en/download/"
		}
		else if(writeInstallPluginVR==5) 
		{
			pluginname="Shockwave Player"
			pluginurl="http://www.macromedia.com/shockwave/download"
		}
		else if(writeInstallPluginVR==6) 
		{
			pluginname="PangeaVR Player"
			pluginurl="http://www.pangeasoft.net/pano/plugin/downloads.html"
		}
		
		var str='<DIV align=center><table border="0" cellpadding="0" cellspacing="0" style="WIDTH: ' + sizex + '; HEIGHT: ' + sizey + '" width="'+sizex+'"  height="'+sizey+'"><tr><td align="center" valign="middle">';
		str+=installfont+'This content requires '+ pluginname +'.';
		str+='<BR><BR><A href="'+ pluginurl +'">click here to install '+ pluginname +'</A>';
		str+='</FONT></td></tr></table></DIV>';
		document.writeln(str);
	}

	if(writeInstallPluginVR==0) window.onresize=OnResizeWindow;
}

function ShowViewerSelection(options)
{
	reloadpagewhenchangeviewer=(options.indexOf("reload")!=-1);
	options.toLowerCase();
	var vertical='';
	var combobox=(options.indexOf("combobox")!=-1);
	var str='';

	if(options.indexOf("horizontal")==-1)
		vertical='<BR>';
	
	viewer=getCookie("panorama_viewer");
	if(!viewer) viewer="DETECT";

	if(combobox)
	{
		str+='<SELECT id=comboboxViewer style="WIDTH: 160px" width=160 name=comboboxViewer onchange="favoriteViewerChangedCombo()">';
	}
	if(options.indexOf("detect")!=-1)
	{
		if(combobox) str+='<OPTION value="DETECT" '+(viewer=="DETECT"?'selected':'')+'> Automatic detection</OPTION>';
		else str+='<INPUT id=radioViewer value=1 type=radio name=radioViewer OnClick="javascript:changeFavoriteViewer(\'DETECT\');" '+(viewer=="DETECT"?'CHECKED':'')+'>Automatic detection'+vertical;
	}
	if(options.indexOf("devalvr")!=-1 && isWindows)
	{
		if(combobox) str+='<OPTION value="DEVALVR" '+(viewer=="DEVALVR"?'selected':'')+'> DevalVR</OPTION>';
		else str+='<INPUT id=radioViewer value=2 type=radio name=radioViewer OnClick="javascript:changeFavoriteViewer(\'DEVALVR\');" '+(viewer=="DEVALVR"?'CHECKED':'')+'>DevalVR '+vertical;
	}
	if(options.indexOf("qt")!=-1)
	{
		if(combobox) str+='<OPTION value="QT" '+(viewer=="QT"?'selected':'')+'> QuickTime</OPTION>';
		else str+='<INPUT id=radioViewer value=3 type=radio name=radioViewer OnClick="javascript:changeFavoriteViewer(\'QT\');" '+(viewer=="QT"?'CHECKED':'')+'>QuickTime '+vertical;
	}
	if(options.indexOf("flash")!=-1)
	{
		if(combobox) str+='<OPTION value="FLASH" '+(viewer=="FLASH"?'selected':'')+'> Flash</OPTION>';
		else str+='<INPUT id=radioViewer value=4 type=radio name=radioViewer OnClick="javascript:changeFavoriteViewer(\'FLASH\');" '+(viewer=="FLASH"?'CHECKED':'')+'>Flash '+vertical;
	}
	if(options.indexOf("java")!=-1)
	{
		if(combobox) str+='<OPTION value="JAVA" '+(viewer=="JAVA"?'selected':'')+'> Java</OPTION>';
		else str+='<INPUT id=radioViewer value=5 type=radio name=radioViewer OnClick="javascript:changeFavoriteViewer(\'JAVA\');" '+(viewer=="JAVA"?'CHECKED':'')+'>Java '+vertical;
	}
	if(options.indexOf("spiv")!=-1 || options.indexOf("spi-v")!=-1)
	{
		if(combobox) str+='<OPTION value="SPIV" '+(viewer=="SPIV"?'selected':'')+'> Spi-V</OPTION>';
		else str+='<INPUT id=radioViewer value=6 type=radio name=radioViewer OnClick="javascript:changeFavoriteViewer(\'SPIV\');" '+(viewer=="SPIV"?'CHECKED':'')+'>Spi-V '+vertical;
	}
	if(options.indexOf("pangeavr")!=-1 && isMac)
	{
		if(combobox) str+='<OPTION value="PANGEAVR" '+(viewer=="PANGEAVR"?'selected':'')+'> PangeaVR</OPTION>';
		else str+='<INPUT id=radioViewer value=7 type=radio name=radioViewer OnClick="javascript:changeFavoriteViewer(\'PANGEAVR\');" '+(viewer=="PANGEAVR"?'CHECKED':'')+'>PangeaVR '+vertical;
	}
	if(combobox)
	{
		str+='</SELECT><BR>';
	}
	else if(vertical=='') str+='<BR>';

	document.writeln('<FONT id=IDVIEWEROPTIONS>&nbsp;</FONT>');
	ref=getRef("IDVIEWEROPTIONS");
	if(ref)	ref.innerHTML=str;
}

function favoriteViewerChangedCombo()
{
	ref=getRef("comboboxViewer");
	if(ref) changeFavoriteViewer(ref.value);
}

function changeFavoriteViewer(viewer)
{
	if(favoriteViewer!=viewer)
	{
		setCookie("panorama_viewer",viewer);
		if(reloadpagewhenchangeviewer)
			window.location.reload();
	}
}

//Old version, it exist for compatibility with old pages
function writevrcode(movfile,javafile,flashfile,spivfile,width,height)
{
	var sizex=0,sizey=0;
	
	//Compatibility code, old versions of writevrcode only was 
	//qtfile and javafile parameters: writevrcode(movfile,javafile,width,height)
	
	var paramsize=2;
	for(var n=2;n<4;n++)
	{
		if(arguments[n]!=null)
		{
			var str=arguments[n].toString();
			str.toLowerCase();
			if(n==2)
			{
				if(str.indexOf(".swf")!=-1 || str=="") paramsize++;
				else flashfile="";
			}
			else if(n==3)
			{
				if(str.indexOf(".spv")!=-1 || str.indexOf(".xml")!=-1 || str.indexOf(".jpg")!=-1 || str=="")
				{
					if(paramsize==2) paramsize++;
					paramsize++;
				}
				else spivfile="";
			}
		}
	}
	if(arguments[paramsize]!=null)
		sizex=arguments[paramsize];
	if(arguments[paramsize+1]!=null)
		sizey=arguments[paramsize+1];
	
	var qtfile=movfile;	
	if(movfile.toLowerCase().indexOf(".mov")==-1)
		qtfile="";

	writecode(qtfile,movfile,javafile,flashfile,spivfile,sizex,sizey);
}

function IsPluginInstalled(numplugin)
{
	var installed=0;
	
	if(isWindows && isIE)
	{
		if(detectableWithVB)
		{
			if(numplugin==1)
			{
				installed=detectActiveXControl('DevalVRXCtrl.DevalVRXCtrl.1');
			}
			else if(numplugin==2)
			{
				installed=detectQuickTimeActiveXControl();
			}
			else if(numplugin==3)
			{
				installed =DetectFlashVer(); 
			}
			else if(numplugin==4)
			{
				installed=detectActiveXControl('JavaPlugin') && navigator.javaEnabled();
			}
			else if(numplugin==5)
			{
				var strswversion=minShockwaveVersion.split(".");
				var strshockwave="";
				do{
					strshockwave="SWCtl.SWCtl."+strswversion[0]+"."+strswversion[1]+".1";
					strswversion[1]++;
					if(strswversion[1]>9)
					{
						strswversion[1]=0;
						strswversion[0]++;
					}
					installed=detectActiveXControl(strshockwave);
				}while(installed==0 && strswversion[0]<20);
			}
		}
	}
	else
	{
		if(numplugin==1)
		{
			if(navigator.mimeTypes && navigator.mimeTypes["application/x-devalvrx"] && navigator.mimeTypes["application/x-devalvrx"].enabledPlugin)
			{
				var words = navigator.plugins["DevalVR 3D Plugin"].description.split(" ");
				var version = words[3].split(",");
				var min = minDevalVRVersion.split(",");
				installed=checkMinVersion(version,min,4);
			}	
		}
		else if(numplugin==2)
		{
			if(isMac) 
			{
				installed=1;
			}
			else
			{
				if(navigator.mimeTypes && navigator.mimeTypes["video/quicktime"] && navigator.mimeTypes["video/quicktime"].enabledPlugin)
				{
					for (var i = 0; i < navigator.plugins.length; i++)
					{
						if(navigator.plugins[i].name.indexOf("QuickTime Plug-in")!=-1)
						{
							var words = navigator.plugins[i].name.split(" ");
							if (words.length<3) installed=1;
							else
							{
								var version = words[2].split(".");
								var min = minQTVersion.split(".");
								installed=checkMinVersion(version,min,version.length);
							}
							break;
						}
					}
				}
			}
		}
		else if(numplugin==3)
		{
			installed = DetectFlashVer(); 
		}
		else if(numplugin==4)
		{
			if (isOpera || (navigator.mimeTypes && navigator.mimeTypes['application/x-java-applet'] && navigator.mimeTypes["application/x-java-applet"].enabledPlugin))
			{
				installed=navigator.javaEnabled();
			}
		}
		else if(numplugin==5)
		{
			if(navigator.mimeTypes && navigator.mimeTypes["application/x-director"] && navigator.mimeTypes["application/x-director"].enabledPlugin)
			{
				var description=navigator.plugins["Shockwave for Director"].description;
				var pos=description.indexOf("version");
				if (pos!=-1)
				{
					var words=description.substr(pos+8);
					var version = words.split(".");
					var min = minShockwaveVersion.split(".");
					installed=checkMinVersion(version,min,2);
				}
			}
		}
		else if(numplugin==6)
		{
			if(navigator.mimeTypes && navigator.mimeTypes["graphics/pangeavr2"] && navigator.mimeTypes["graphics/pangeavr2"].enabledPlugin)
			{
				installed=1;
			}
		}
	}
	return installed;
}

function OnResizeWindow()
{
	for(n=0;n<numberofplugins;n++)
	{
		CalcLimits(orgsizepluginx[n],orgsizepluginy[n]);

		if(n==0) ref=getRef("PANORAMAID");
		else ref=getRef("PANORAMAID"+n);
		if(ref!=null)
		{
			if(isIE || isOpera)
			{
				ref.style.width=sizepluginx;
				ref.style.height=sizepluginy;
			}
			else
			{	
				ref.width=sizepluginx;
				ref.height=sizepluginy;
			}
		}
	}
}

function checkMinVersion(version,min,num)
{
	var installed=0;
	for (var i = 0; i < num; i++)
	{
		if(parseInt(version[i])>parseInt(min[i])) 
		{
			installed=1;
			break;
		}
		else if(parseInt(version[i])<parseInt(min[i]))
		{
			break;
		}
		else if(parseInt(version[i])==parseInt(min[i]) && i==num-1)
			installed=1;
	}
	return installed;
}

function CalcLimits(sizex, sizey)
{
	var sizew,sizeh,limits;
	
	if(writePluginVR==4)
	{
		maxx=maxViewerWidthJava;
		maxy=maxViewerHeightJava;
		limits=enableSizeLimitsJava;
	}
	else if(writePluginVR==3)
	{
		maxx=maxViewerWidthFlash;
		maxy=maxViewerHeightFlash;
		limits=enableSizeLimitsFlash;
	}
	else
	{
		maxx=maxViewerWidth;
		maxy=maxViewerHeight;
		limits=enableSizeLimits;
	}

	if(sizex<0) sizex=getPageWidth()+parseInt(sizex);
	if(sizey<0) sizey=getPageHeight()+parseInt(sizey);
	
	if(limits || enableSizeRatio || adviselineunderpano!="")
	{
		sizex=sizex.toString();
		sizey=sizey.toString();
		pw=sizex.indexOf("px");
		if(pw!=-1) sizex=sizex.substring(0,pw);
		pw=sizey.indexOf("px");
		if(pw!=-1) sizey=sizey.substring(0,pw);
	
		sizew=getPageWidth();
		sizeh=getPageHeight();
	
		pw=sizex.indexOf("%");
		if(pw!=-1)
		{
			percent=sizex.substring(0,pw);
			sizex=(sizew*percent)/100;
		}
		pw=sizey.indexOf("%");
		if(pw!=-1)
		{
			percent=sizey.substring(0,pw);
			sizey=(sizeh*percent)/100;
		}
	
		sizex=parseInt(sizex);
		sizey=parseInt(sizey);

		if(limits)
		{
			if(sizex>maxx) sizex=maxx;
			if(sizey>maxy) sizey=maxy;
		}	
		if(enableSizeRatio)
		{
			x=sizey*sizeRatio;
			if(x<sizex)
			{
				sizex=x;
				if(limits && sizex>maxx) sizex=maxx;
			}
		}
		if(adviselineunderpano!="")
		{
			sizey-=16;
		}
	}

/*	if(limits || enableSizeRatio || adviselineunderpano!="")
	{
		sizex=((sizex*100.0)/sizew);
		sizey=((sizey*100.0)/sizeh);
		if(sizex<1) sizex=1; 
		if(sizex>100) sizex=100; 
		if(sizey<1) sizey=1; 
		if(sizey>100) sizey=100;
		sizex=parseInt(sizex)+"%";
		sizey=parseInt(sizey)+"%";
	}
*/
	sizepluginx=sizex;
	sizepluginy=sizey;

}

function reloadPage()
{
	if(!isIE) navigator.plugins.refresh(true);
	window.location.reload();
}

function getCookie(nombre)
{
	var dcookie=document.cookie;
	var cname=nombre+"=";
	var longitud=dcookie.length;
	var inicio=0;
	while(inicio<longitud)
	{
		var vbegin=inicio+cname.length;
		if(dcookie.substring(inicio,vbegin)==cname)
		{
			var vend=dcookie.indexOf(";",vbegin);
			if(vend==-1) vend=longitud;
			return unescape(dcookie.substring(vbegin,vend));
		}
		inicio=dcookie.indexOf(" ",inicio)+1;
		if(inicio==0) break;
	}
	return null;
}

function setCookie(name, value, expires)
{
	if(!expires)
	{ 
		expires=new Date();
		expires.setTime(expires.getTime()+(24*3600*1000*365));
	}
	var str=name+"="+escape(value)+"; expires=" + expires.toGMTString()+ "; path=/";
	document.cookie=str;
}

function getPageHeight()
{
	var ret;
	if(isIE) ret=document.body.clientHeight-document.body.topMargin-document.body.bottomMargin;
	else ret=window.innerHeight-16;
	
	return ret;
}

function getPageWidth()
{
	var ret;
	if(isIE) ret=document.body.clientWidth-document.body.leftMargin-document.body.rightMargin;
	else ret=window.innerWidth;
	
	return ret;
}

function IEGetSwfVer()
{
	flashVer=0;
		
	for(i=25;i>0 && flashVer==0;i--)
	{
		flashVer=VBGetSwfVer(i);
	}
	return flashVer;
}

// JavaScript helper required to detect Flash Player PlugIn version information
function JSGetSwfVer()
{
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
      		var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			descArray = flashDescription.split(" ");
			tempArrayMajor = descArray[2].split(".");
			versionMajor = tempArrayMajor[0];
			versionMinor = tempArrayMajor[1];
			if ( descArray[3] != "" ) {
				tempArrayMinor = descArray[3].split("r");
			} else {
				tempArrayMinor = descArray[4].split("r");
			}
      		versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
            flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
      	} else {
			flashVer = -1;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	// Can't detect in all other cases
	else {
		
		flashVer = -1;
	}
	return flashVer;
}
 
function DetectFlashVer() 
{
  	if (isIE && isWindows && !isOpera) {
		versionStr = IEGetSwfVer();
	} else {
		versionStr = JSGetSwfVer();		
	}
	if (versionStr != 0 && versionStr != -1) 
	{
		if(isIE && isWindows && !isOpera) {
			tempArray         = versionStr.split(" ");
			tempString        = tempArray[1];
			versionArray      = tempString .split(",");				
		} 
		else 
		{
			versionArray      = versionStr.split(".");
		}
		var min=minFlashVersion.split(".");
		return checkMinVersion(versionArray,min,3);
	}
	else return false;
}

function writeParameters(parameters, auxparameters, IEparameters)
{
	for(i=0;i<auxparameters.length;i+=2) 
	{
		if(IEparameters)
			document.writeln('  <param name="' + auxparameters[i] + '" value="' + auxparameters[i+1] + '">');
		else
			document.write(' ' + auxparameters[i] + '="' + auxparameters[i+1] + '"');
	}
	for(i=4;i<parameters.length;i+=2) 
	{
		var exists=0;
		for(j=0;j<auxparameters.length;j+=2) {
			if(auxparameters[j]==parameters[i]) exists=1;
		}
		if(exists==0)
		{
			if(IEparameters)
				document.writeln('  <param name="' + parameters[i] + '" value="' + parameters[i+1] + '">');
			else
				document.write(' ' + parameters[i] + '="' + parameters[i+1] + '"');
		}
	}
}

function p2q_EmbedQuicktime(sFile,sWidth,sHeight,sId) 
{
	document.writeln('<div align=center><object id='+sId+' classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"');
	document.writeln(' codebase="http://www.apple.com/qtactivex/qtplugin.cab"');
	document.writeln('  style="WIDTH: ' + sWidth + '; HEIGHT: ' + sHeight + '" width="' + sWidth + '" height="' + sHeight + '" >');
	document.writeln('  <param name="src" value="' + sFile + '">');
	
	writeParameters(arguments,auxparameters['qt'],1);
	
	document.writeln('<embed name='+sId+' width="' + sWidth + '" height="' + sHeight + '"');
	document.writeln('	pluginspage="http://www.apple.com/quicktime/download/"');
	document.writeln('	type="video/quicktime"');
	document.writeln('	src="' + sFile + '"');

	writeParameters(arguments,auxparameters['qt'],0);

	document.writeln('	/>');
	document.writeln('</object>');
	
	if(adviselineunderpano!="")
	{
		if(sWidth!="100%") document.writeln('<BR>');
		document.writeln(adviselineunderpano);
	}
	document.writeln('</div>');
}

function p2q_EmbedDevalVR(sFile,sWidth,sHeight,sId) 
{
	document.write('<div align=center>');
	document.write('<object id='+sId+' classid="clsid:5D2CF9D0-113A-476B-986F-288B54571614"');
	document.write(' codebase="http://www.devalvr.com/instalacion/plugin/devalocx.cab');
	document.write('#version='+minDevalVRVersion+'"');
	document.write(' style="WIDTH: ' + sWidth + '; HEIGHT: ' + sHeight + '" width="' + sWidth + '" height="' + sHeight + '" >');
	document.write('<param name="src" value="' + sFile + '">');
	writeParameters(arguments,auxparameters['devalvr'],1);
	document.write('<embed name='+sId+' width="' + sWidth + '" height="' + sHeight + '"');
	document.write(' pluginspage="http://www.devalvr.com/instalacion/plugin/install.html"');
	document.write(' type="application/x-devalvrx"');
	document.write(' src="' + sFile + '"');
	writeParameters(arguments,auxparameters['devalvr'],0);
	document.write(' />');
	document.write('</object>');
	
	if(adviselineunderpano!="")
	{
		if(sWidth!="100%") document.writeln('<BR>');
		document.writeln(adviselineunderpano);
	}
	document.writeln('</div>');
}

function p2q_EmbedFlash(sFile,sWidth,sHeight,sId) 
{
	document.writeln('<DIV align=center ><object id='+sId+' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"');
	document.writeln(' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab');
	document.writeln('  style="WIDTH: ' + sWidth + '; HEIGHT: ' + sHeight + '" width="' + sWidth + '" height="' + sHeight + '" >');
	document.writeln('  <param name="src" value="' + sFile + '">');
	writeParameters(arguments,auxparameters['flash'],1);
	document.writeln('<embed name='+sId+' width="' + sWidth + '" height="' + sHeight + '"');
	document.writeln('	pluginspage="http://www.macromedia.com/go/getflashplayer"');
	document.writeln('	type="application/x-shockwave-flash"');
	document.writeln('	src="' + sFile + '"');
	writeParameters(arguments,auxparameters['flash'],0);
	document.writeln('	/>');
	document.writeln('</object>');
	
	if(adviselineunderpano!="")
	{
		if(sWidth!="100%") document.writeln('<BR>');
		document.writeln(adviselineunderpano);
	}
	document.writeln('</DIV>');
}

function p2q_EmbedPtviewer(sFile,sWidth,sHeight,sId) 
{
	document.writeln('<DIV align=center><applet name='+sId+' code="ptviewer.class" archive="ptviewer.jar"'); 
	document.writeln('  width="' + sWidth + '" height="' + sHeight + '" >');
	document.writeln('	<param name="file" value="' + sFile + '">');
	writeParameters(arguments,auxparameters['java'],1);
	document.writeln('</applet>');
	
	if(adviselineunderpano!="")
	{
		if(sWidth!="100%") document.writeln('<BR>');
		document.writeln(adviselineunderpano);
	}
	document.writeln('</DIV>');
}

function p2q_EmbedPurePlayer(sFile,sWidth,sHeight,sId) 
{
	document.writeln('<DIV align=center><applet name='+sId+' code="' + codePurePlayer + '" archive="' + archivePurePlayer + '"'); 
	document.writeln('  width="' + sWidth + '" height="' + sHeight + '" >');
	document.writeln('	<param name="panorama" value="' + sFile + '" >');
	document.writeln('	<param name="optimizememory" value="true" >');
	writeParameters(arguments,auxparameters['java'],1);
	document.writeln('</applet>');
	
	if(adviselineunderpano!="")
	{
		if(sWidth!="100%") document.writeln('<BR>');
		document.writeln(adviselineunderpano);
	}
	document.writeln('</DIV>');
}

function p2q_EmbedSPiV(sFile,sWidth,sHeight,sId) 
{
	document.writeln('<DIV align=center ><object id='+sId+' classid="clsid:166B1BCA-3F9C-11CF-8075-444553540000"');
	document.writeln('codebase="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"');
	document.writeln('  style="WIDTH: ' + sWidth + '; HEIGHT: ' + sHeight + '" width="' + sWidth + '" height="' + sHeight + '" >');
	document.writeln('	<param name="src" value="SPi-V.dcr">');
	document.writeln('	<param name="swStretchStyle" value="stage">');
	document.writeln('	<param name="swRemote"       value="swContextMenu=' + "'" + 'FALSE' + "'" + '">');
	document.writeln('	<param name="progress"       value="true">'); 
	document.writeln('	<param name="logo"           value="false">'); 

	document.writeln('  <param name="swURL" value="' + sFile + '">');
	writeParameters(arguments,auxparameters['spiv'],1);
	document.writeln('<embed name='+sId+' width="' + sWidth + '" height="' + sHeight + '"');
	document.writeln('	pluginspage="http://www.macromedia.com/shockwave/download/"');
	document.writeln('	type="application/x-director" ');
	document.writeln('	swURL="' + sFile + '" ');
	document.writeln('	src="SPi-V.dcr" ');
	document.writeln('	swStretchStyle="stage" ');
	document.writeln('	swRemote="swContextMenu=' + "'" + 'FALSE' + "'" + '" ');
	document.writeln('	progress="true" ');
	document.writeln('	logo="false" ');
	writeParameters(arguments,auxparameters['spiv'],0);
	document.writeln('	/>');
	document.writeln('</object>');
	
	if(adviselineunderpano!="")
	{
		if(sWidth!="100%") document.writeln('<BR>');
		document.writeln(adviselineunderpano);
	}
	document.writeln('</DIV>');
}

function p2q_EmbedPangea(sFile,sWidth,sHeight,sId) 
{
	document.writeln('<DIV align=center><embed name='+sId+' width="' + sWidth + '" height="' + sHeight + '"');
	document.writeln('	pluginspage="http://www.pangeasoft.net/pano/plugin/downloads.html"');
	document.writeln('	type="graphics/pangeavr2"');
	document.writeln('	src="' + sFile + '"');
	writeParameters(arguments,auxparameters['pangeavr'],0);
	document.writeln(' />');
	
	if(adviselineunderpano!="")
	{
		if(sWidth!="100%") document.writeln('<BR>');
		document.writeln(adviselineunderpano);
	}
	document.writeln('</DIV>');
}

// Here we write out the VBScript block for MSIE Windows
if (isWindows && isIE) 
{
    document.writeln('<script language="VBscript" type="text/vbscript">');

    document.writeln('\'do a one-time test for a version of VBScript that can handle this code \n');
    document.writeln('detectableWithVB = False \n');
    document.writeln('If ScriptEngineMajorVersion >= 2 then \n');
    document.writeln('  detectableWithVB = True \n');
    document.writeln('End If \n');

    document.writeln('\'this next function will detect most plugins \n');
    document.writeln('Function detectActiveXControl(activeXControlName) \n');
    document.writeln('  on error resume next \n');
    document.writeln('  detectActiveXControl = False \n');
    document.writeln('  If detectableWithVB Then \n');
    document.writeln('		set pControl = CreateObject(activeXControlName) \n');
    document.writeln('		If (IsObject(pControl)) then \n');
    document.writeln('			detectActiveXControl = True \n');
    document.writeln('		End If \n');
    document.writeln('  End If \n');
    document.writeln('End Function \n');

    document.writeln('\'and the following function handles QuickTime \n');
    document.writeln('Function detectQuickTimeActiveXControl() \n');
    document.writeln('  on error resume next \n');
    document.writeln('  detectQuickTimeActiveXControl = False \n');
    document.writeln('  If detectableWithVB Then \n');
    document.writeln('    detectQuickTimeActiveXControl = False \n');
    document.writeln('    hasQuickTimeChecker = false \n');
    document.writeln('    Set hasQuickTimeChecker = CreateObject("QuickTimeCheckObject.QuickTimeCheck.1") \n');
    document.writeln('    If IsObject(hasQuickTimeChecker) Then \n');
    document.writeln('      If hasQuickTimeChecker.IsQuickTimeAvailable(0) Then  \n');
    document.writeln('        detectQuickTimeActiveXControl = True \n');
    document.writeln('      End If \n');
    document.writeln('    End If \n');
    document.writeln('  End If \n');
    document.writeln('End Function \n');

    document.writeln('\'Visual basic helper required to detect Flash Player ActiveX control version information \n');
    document.writeln('Function VBGetSwfVer(i) \n');
    document.writeln('  on error resume next \n');
    document.writeln('  Dim swControl, swVersion \n');
    document.writeln('  swVersion = 0 \n');
    document.writeln('  If detectableWithVB Then \n');
    document.writeln('		set swControl = CreateObject("ShockwaveFlash.ShockwaveFlash." + CStr(i)) \n');
    document.writeln('		If (IsObject(swControl)) then \n');
    document.writeln('			swVersion = swControl.GetVariable("$version") \n');
    document.writeln('		End If \n');
    document.writeln('  End If \n');
    document.writeln('  VBGetSwfVer = swVersion \n');
    document.writeln('End Function \n');

    document.writeln('</scr' + 'ipt>');
}


//////////////// Special functions to create dynamic pages
function getQueryVariable(variable) 
{
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	for (var i=0;i< vars.length;i++) 
	{
		var pair = vars[i].split("=");
		if (pair[0] == variable) 
		{
			return pair[1];
		}
	} 
	return -1;
}	

function getRef(id) 
{
	return (isDOM ? document.getElementById(id) : (isIE4 ? document.all[id] : document.layers[id]));
}
function getStyle(id) 
{
	return (isNS4 ? getRef(id) : getRef(id).style);
}

var panoramadata=new Array();
var panoramanumdata=0;

function insertpanoramadata(name, panofile, title, description, date, jpgimage)
{
	var pano="pano"+panoramanumdata;
	panoramadata[pano]=name;
	panoramadata[name]=new Array();
	panoramadata[name]["movfile"]=panofile;
	panoramadata[name]["title"]=title;
	panoramadata[name]["description"]=description;
	panoramadata[name]["date"]=date;
	panoramadata[name]["jpgimage"]=jpgimage;
	
	panoramanumdata++;
}

///////////////////

/*
 * QTObject embed
 * http://blog.deconcept.com/2005/01/26/web-standards-compliant-javascript-quicktime-detect-and-embed/
 *
 * by Geoff Stearns (geoff@deconcept.com, http://www.deconcept.com/)
 *
 * v1.0.2 - 02-16-2005
 *
 * Embeds a quicktime movie to the page, includes plugin detection
 *
 * Usage:
 *
 *	myQTObject = new QTObject("path/to/mov.mov", "movid", "width", "height");
 *	myQTObject.altTxt = "Upgrade your Quicktime Player!";    // optional
 
 *  myQTObject.addParam("controller", "false");              // optional
 *	myQTObject.write();
 *
 */

QTObject = function(mov, id, w, h) {
	this.mov = mov;
	this.id = id;
	this.width = w;
	this.height = h;
	this.redirect = "";
	this.sq = document.location.search.split("?")[1] || "";
	this.altTxt = "This content requires the QuickTime Plugin. <a href='http://www.apple.com/quicktime/download/'>Download QuickTime Player</a>.";
	this.bypassTxt = "<p>Already have QuickTime Player? <a href='?detectqt=false&"+ this.sq +"'>Click here.</a></p>";
	this.params = new Object();
	this.doDetect = getQueryParamValue('detectqt');
}

QTObject.prototype.addParam = function(name, value) {
	this.params[name] = value;
}

QTObject.prototype.getParams = function() {
    return this.params;
}

QTObject.prototype.getParam = function(name) {
    return this.params[name];
}

QTObject.prototype.getParamTags = function() {
    var paramTags = "";
    for (var param in this.getParams()) {
        paramTags += '<param name="' + param + '" value="' + this.getParam(param) + '" />';
    }
    if (paramTags == "") {
        paramTags = null;
    }
    return paramTags;
}

QTObject.prototype.getHTML = function() {
    var qtHTML = "";
	if (navigator.plugins && navigator.plugins.length) { // not ie
        qtHTML += '<embed type="video/quicktime" src="' + this.mov + '" width="' + this.width + '" height="' + this.height + '" id="' + this.id + '"';
        for (var param in this.getParams()) {
            qtHTML += ' ' + param + '="' + this.getParam(param) + '"';
        }
        qtHTML += '></embed>';
    }
    else { // pc ie
        qtHTML += '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="' + this.width + '" height="' + this.height + '" id="' + this.id + '">';
        this.addParam("src", this.mov);
        if (this.getParamTags() != null) {
            qtHTML += this.getParamTags();
        }
        qtHTML += '</object>';
    }
    return qtHTML;
}


QTObject.prototype.getVariablePairs = function() {
    var variablePairs = new Array();
    for (var name in this.getVariables()) {
        variablePairs.push(name + "=" + escape(this.getVariable(name)));
    }
    if (variablePairs.length > 0) {
        return variablePairs.join("&");
    }
    else {
        return null;
    }
}

QTObject.prototype.write = function(elementId) {
	if(isQTInstalled() || this.doDetect=='false') {
		if (elementId) {
			document.getElementById(elementId).innerHTML = this.getHTML();
		} else {
			document.write(this.getHTML());
		}
	} else {
		if (this.redirect != "") {
			document.location.replace(this.redirect);
		} else {
			if (elementId) {
				document.getElementById(elementId).innerHTML = this.altTxt +""+ this.bypassTxt;
			} else {
				document.write(this.altTxt +""+ this.bypassTxt);
			}
		}
	}		
}

function isQTInstalled() {
	var qtInstalled = false;
	qtObj = false;
	if (navigator.plugins && navigator.plugins.length) {
		for (var i=0; i < navigator.plugins.length; i++ ) {
         var plugin = navigator.plugins[i];
         if (plugin.name.indexOf("QuickTime") > -1) {
			qtInstalled = true;
         }
      }
	} else {
		execScript('on error resume next: qtObj = IsObject(CreateObject("QuickTimeCheckObject.QuickTimeCheck.1"))','VBScript');
		qtInstalled = qtObj;
	}
	return qtInstalled;
}

/* get value of querystring param */
function getQueryParamValue(param) {
	var q = document.location.search;
	var detectIndex = q.indexOf(param);
	var endIndex = (q.indexOf("&", detectIndex) != -1) ? q.indexOf("&", detectIndex) : q.length;
	if(q.length > 1 && detectIndex != -1) {
		return q.substring(q.indexOf("=", detectIndex)+1, endIndex);
	} else {
		return "";
	}
}

/*!	SWFObject v2.0 <http://code.google.com/p/swfobject/>
	Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/

var swfobject = function() {
	
	var UNDEF = "undefined",
		OBJECT = "object",
		SHOCKWAVE_FLASH = "Shockwave Flash",
		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
		FLASH_MIME_TYPE = "application/x-shockwave-flash",
		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
		
		win = window,
		doc = document,
		nav = navigator,
		
		domLoadFnArr = [],
		regObjArr = [],
		timer = null,
		storedAltContent = null,
		storedAltContentId = null,
		isDomLoaded = false,
		isExpressInstallActive = false;
	
	/* Centralized function for browser feature detection
		- Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
		- User agent string detection is only used when no alternative is possible
		- Is executed directly for optimal performance
	*/	
	var ua = function() {
		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF && typeof doc.appendChild != UNDEF && typeof doc.replaceChild != UNDEF && typeof doc.removeChild != UNDEF && typeof doc.cloneNode != UNDEF,
			playerVersion = [0,0,0],
			d = null;
		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
			d = nav.plugins[SHOCKWAVE_FLASH].description;
			if (d) {
				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
				playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
			}
		}
		else if (typeof win.ActiveXObject != UNDEF) {
			var a = null, fp6Crash = false;
			try {
				a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
			}
			catch(e) {
				try { 
					a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
					playerVersion = [6,0,21];
					a.AllowScriptAccess = "always";  // Introduced in fp6.0.47
				}
				catch(e) {
					if (playerVersion[0] == 6) {
						fp6Crash = true;
					}
				}
				if (!fp6Crash) {
					try {
						a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
					}
					catch(e) {}
				}
			}
			if (!fp6Crash && a) { // a will return null when ActiveX is disabled
				try {
					d = a.GetVariable("$version");  // Will crash fp6.0.21/23/29
					if (d) {
						d = d.split(" ")[1].split(",");
						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
					}
				}
				catch(e) {}
			}
		}
		var u = nav.userAgent.toLowerCase(),
			p = nav.platform.toLowerCase(),
			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
			ie = false,
			windows = p ? /win/.test(p) : /win/.test(u),
			mac = p ? /mac/.test(p) : /mac/.test(u);
		/*@cc_on
			ie = true;
			@if (@_win32)
				windows = true;
			@elif (@_mac)
				mac = true;
			@end
		@*/
		return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac };
	}();

	/* Cross-browser onDomLoad
		- Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/
		- Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
	*/ 
	var onDomLoad = function() {
		if (!ua.w3cdom) {
			return;
		}
		addDomLoadEvent(main);
		if (ua.ie && ua.win) {
			try {  // Avoid a possible Operation Aborted error
				doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors 
				var s = getElementById("__ie_ondomload");
				if (s) {
					s.onreadystatechange = function() {
						if (this.readyState == "complete") {
							this.parentNode.removeChild(this);
							callDomLoadFunctions();
						}
					};
				}
			}
			catch(e) {}
		}
		if (ua.webkit && typeof doc.readyState != UNDEF) {
			timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10);
		}
		if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
		}
		addLoadEvent(callDomLoadFunctions);
	}();
	
	function callDomLoadFunctions() {
		if (isDomLoaded) {
			return;
		}
		if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
			var s = createElement("span");
			try { // Avoid a possible Operation Aborted error
				var t = doc.getElementsByTagName("body")[0].appendChild(s);
				t.parentNode.removeChild(t);
			}
			catch (e) {
				return;
			}
		}
		isDomLoaded = true;
		if (timer) {
			clearInterval(timer);
			timer = null;
		}
		var dl = domLoadFnArr.length;
		for (var i = 0; i < dl; i++) {
			domLoadFnArr[i]();
		}
	}
	
	function addDomLoadEvent(fn) {
		if (isDomLoaded) {
			fn();
		}
		else { 
			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
		}
	}
	
	/* Cross-browser onload
		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
		- Will fire an event as soon as a web page including all of its assets are loaded 
	 */
	function addLoadEvent(fn) {
		if (typeof win.addEventListener != UNDEF) {
			win.addEventListener("load", fn, false);
		}
		else if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("load", fn, false);
		}
		else if (typeof win.attachEvent != UNDEF) {
			win.attachEvent("onload", fn);
		}
		else if (typeof win.onload == "function") {
			var fnOld = win.onload;
			win.onload = function() {
				fnOld();
				fn();
			};
		}
		else {
			win.onload = fn;
		}
	}
	
	/* Main function
		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
	*/
	function main() { // Static publishing only
		var rl = regObjArr.length;
		for (var i = 0; i < rl; i++) { // For each registered object element
			var id = regObjArr[i].id;
			if (ua.pv[0] > 0) {
				var obj = getElementById(id);
				if (obj) {
					regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
					regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
					if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
						if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements
							fixParams(obj);
						}
						setVisibility(id, true);
					}
					else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
						showExpressInstall(regObjArr[i]);
					}
					else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
						displayAltContent(obj);
					}
				}
			}
			else {  // If no fp is installed, we let the object element do its job (show alternative content)
				setVisibility(id, true);
			}
		}
	}
	
	/* Fix nested param elements, which are ignored by older webkit engines
		- This includes Safari up to and including version 1.2.2 on Mac OS 10.3
		- Fall back to the proprietary embed element
	*/
	function fixParams(obj) {
		var nestedObj = obj.getElementsByTagName(OBJECT)[0];
		if (nestedObj) {
			var e = createElement("embed"), a = nestedObj.attributes;
			if (a) {
				var al = a.length;
				for (var i = 0; i < al; i++) {
					if (a[i].nodeName.toLowerCase() == "data") {
						e.setAttribute("src", a[i].nodeValue);
					}
					else {
						e.setAttribute(a[i].nodeName, a[i].nodeValue);
					}
				}
			}
			var c = nestedObj.childNodes;
			if (c) {
				var cl = c.length;
				for (var j = 0; j < cl; j++) {
					if (c[j].nodeType == 1 && c[j].nodeName.toLowerCase() == "param") {
						e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
					}
				}
			}
			obj.parentNode.replaceChild(e, obj);
		}
	}
	
	/* Fix hanging audio/video threads and force open sockets and NetConnections to disconnect
		- Occurs when unloading a web page in IE using fp8+ and innerHTML/outerHTML
		- Dynamic publishing only
	*/
	function fixObjectLeaks(id) {
		if (ua.ie && ua.win && hasPlayerVersion("8.0.0")) {
			win.attachEvent("onunload", function () {
				var obj = getElementById(id);
				if (obj) {
					for (var i in obj) {
						if (typeof obj[i] == "function") {
							obj[i] = function() {};
						}
					}
					obj.parentNode.removeChild(obj);
				}
			});
		}
	}
	
	/* Show the Adobe Express Install dialog
		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
	*/
	function showExpressInstall(regObj) {
		isExpressInstallActive = true;
		var obj = getElementById(regObj.id);
		if (obj) {
			if (regObj.altContentId) {
				var ac = getElementById(regObj.altContentId);
				if (ac) {
					storedAltContent = ac;
					storedAltContentId = regObj.altContentId;
				}
			}
			else {
				storedAltContent = abstractAltContent(obj);
			}
			if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
				regObj.width = "310";
			}
			if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
				regObj.height = "137";
			}
			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
				dt = doc.title,
				fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
				replaceId = regObj.id;
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			if (ua.ie && ua.win && obj.readyState != 4) {
				var newObj = createElement("div");
				replaceId += "SWFObjectNew";
				newObj.setAttribute("id", replaceId);
				obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
				obj.style.display = "none";
				win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
			}
			createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
		}
	}
	
	/* Functions to abstract and display alternative content
	*/
	function displayAltContent(obj) {
		if (ua.ie && ua.win && obj.readyState != 4) {
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			var el = createElement("div");
			obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
			el.parentNode.replaceChild(abstractAltContent(obj), el);
			obj.style.display = "none";
			win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
		}
		else {
			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
		}
	}	

	function abstractAltContent(obj) {
		var ac = createElement("div");
		if (ua.win && ua.ie) {
			ac.innerHTML = obj.innerHTML;
		}
		else {
			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
			if (nestedObj) {
				var c = nestedObj.childNodes;
				if (c) {
					var cl = c.length;
					for (var i = 0; i < cl; i++) {
						if (!(c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param") && !(c[i].nodeType == 8)) {
							ac.appendChild(c[i].cloneNode(true));
						}
					}
				}
			}
		}
		return ac;
	}
	
	/* Cross-browser dynamic SWF creation
	*/
	function createSWF(attObj, parObj, id) {
		var r, el = getElementById(id);
		if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
			attObj.id = id;
		}
		if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
			var att = "";
			for (var i in attObj) {
				if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
					if (i == "data") {
						parObj.movie = attObj[i];
					}
					else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
						att += ' class="' + attObj[i] + '"';
					}
					else if (i != "classid") {
						att += ' ' + i + '="' + attObj[i] + '"';
					}
				}
			}
			var par = "";
			for (var j in parObj) {
				if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
					par += '<param name="' + j + '" value="' + parObj[j] + '" />';
				}
			}
			el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
			fixObjectLeaks(attObj.id); // This bug affects dynamic publishing only
			r = getElementById(attObj.id);	
		}
		else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
			var e = createElement("embed");
			e.setAttribute("type", FLASH_MIME_TYPE);
			for (var k in attObj) {
				if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
					if (k == "data") {
						e.setAttribute("src", attObj[k]);
					}
					else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
						e.setAttribute("class", attObj[k]);
					}
					else if (k != "classid") { // Filter out IE specific attribute
						e.setAttribute(k, attObj[k]);
					}
				}
			}
			for (var l in parObj) {
				if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
					if (l != "movie") { // Filter out IE specific param element
						e.setAttribute(l, parObj[l]);
					}
				}
			}
			el.parentNode.replaceChild(e, el);
			r = e;
		}
		else { // Well-behaving browsers
			var o = createElement(OBJECT);
			o.setAttribute("type", FLASH_MIME_TYPE);
			for (var m in attObj) {
				if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
					if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
						o.setAttribute("class", attObj[m]);
					}
					else if (m != "classid") { // Filter out IE specific attribute
						o.setAttribute(m, attObj[m]);
					}
				}
			}
			for (var n in parObj) {
				if (parObj[n] != Object.prototype[n] && n != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
					createObjParam(o, n, parObj[n]);
				}
			}
			el.parentNode.replaceChild(o, el);
			r = o;
		}
		return r;
	}
	
	function createObjParam(el, pName, pValue) {
		var p = createElement("param");
		p.setAttribute("name", pName);	
		p.setAttribute("value", pValue);
		el.appendChild(p);
	}
	
	function getElementById(id) {
		return doc.getElementById(id);
	}
	
	function createElement(el) {
		return doc.createElement(el);
	}
	
	function hasPlayerVersion(rv) {
		var pv = ua.pv, v = rv.split(".");
		v[0] = parseInt(v[0], 10);
		v[1] = parseInt(v[1], 10);
		v[2] = parseInt(v[2], 10);
		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
	}
	
	/* Cross-browser dynamic CSS creation
		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
	*/	
	function createCSS(sel, decl) {
		if (ua.ie && ua.mac) {
			return;
		}
		var h = doc.getElementsByTagName("head")[0], s = createElement("style");
		s.setAttribute("type", "text/css");
		s.setAttribute("media", "screen");
		if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
			s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
		}
		h.appendChild(s);
		if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
			var ls = doc.styleSheets[doc.styleSheets.length - 1];
			if (typeof ls.addRule == OBJECT) {
				ls.addRule(sel, decl);
			}
		}
	}
	
	function setVisibility(id, isVisible) {
		var v = isVisible ? "visible" : "hidden";
		if (isDomLoaded) {
			getElementById(id).style.visibility = v;
		}
		else {
			createCSS("#" + id, "visibility:" + v);
		}
	}
	
	return {
		/* Public API
			- Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation
		*/ 
		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
			if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
				return;
			}
			var regObj = {};
			regObj.id = objectIdStr;
			regObj.swfVersion = swfVersionStr;
			regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
			regObjArr[regObjArr.length] = regObj;
			setVisibility(objectIdStr, false);
		},
		
		getObjectById: function(objectIdStr) {
			var r = null;
			if (ua.w3cdom && isDomLoaded) {
				var o = getElementById(objectIdStr);
				if (o) {
					var n = o.getElementsByTagName(OBJECT)[0];
					if (!n || (n && typeof o.SetVariable != UNDEF)) {
				    	r = o;
					}
					else if (typeof n.SetVariable != UNDEF) {
						r = n;
					}
				}
			}
			return r;
		},
		
		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
			if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
				return;
			}
			widthStr += ""; // Auto-convert to string to make it idiot proof
			heightStr += "";
			if (hasPlayerVersion(swfVersionStr)) {
				setVisibility(replaceElemIdStr, false);
				var att = (typeof attObj == OBJECT) ? attObj : {};
				att.data = swfUrlStr;
				att.width = widthStr;
				att.height = heightStr;
				var par = (typeof parObj == OBJECT) ? parObj : {};
				if (typeof flashvarsObj == OBJECT) {
					for (var i in flashvarsObj) {
						if (flashvarsObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
							if (typeof par.flashvars != UNDEF) {
								par.flashvars += "&" + i + "=" + flashvarsObj[i];
							}
							else {
								par.flashvars = i + "=" + flashvarsObj[i];
							}
						}
					}
				}
				addDomLoadEvent(function() {
					createSWF(att, par, replaceElemIdStr);
					if (att.id == replaceElemIdStr) {
						setVisibility(replaceElemIdStr, true);
					}
				});
			}
			else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
				setVisibility(replaceElemIdStr, false);
				addDomLoadEvent(function() {
					var regObj = {};
					regObj.id = regObj.altContentId = replaceElemIdStr;
					regObj.width = widthStr;
					regObj.height = heightStr;
					regObj.expressInstall = xiSwfUrlStr;
					showExpressInstall(regObj);
				});
			}
		},
		
		getFlashPlayerVersion: function() {
			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
		},
		
		hasFlashPlayerVersion:hasPlayerVersion,
		
		createSWF: function(attObj, parObj, replaceElemIdStr) {
			if (ua.w3cdom && isDomLoaded) {
				return createSWF(attObj, parObj, replaceElemIdStr);
			}
			else {
				return undefined;
			}
		},
		
		createCSS: function(sel, decl) {
			if (ua.w3cdom) {
				createCSS(sel, decl);
			}
		},
		
		addDomLoadEvent:addDomLoadEvent,
		
		addLoadEvent:addLoadEvent,
		
		getQueryParamValue: function(param) {
			var q = doc.location.search || doc.location.hash;
			if (param == null) {
				return q;
			}
		 	if(q) {
				var pairs = q.substring(1).split("&");
				for (var i = 0; i < pairs.length; i++) {
					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
						return pairs[i].substring((pairs[i].indexOf("=") + 1));
					}
				}
			}
			return "";
		},
		
		// For internal usage only
		expressInstallCallback: function() {
			if (isExpressInstallActive && storedAltContent) {
				var obj = getElementById(EXPRESS_INSTALL_ID);
				if (obj) {
					obj.parentNode.replaceChild(storedAltContent, obj);
					if (storedAltContentId) {
						setVisibility(storedAltContentId, true);
						if (ua.ie && ua.win) {
							storedAltContent.style.display = "block";
						}
					}
					storedAltContent = null;
					storedAltContentId = null;
					isExpressInstallActive = false;
				}
			} 
		}
		
	};

}();

/**
 * Pano clas
 */
var Pano = Class.create({
	priorities: {DevalVr: "DevalVr", Flash: "FlashPanorama", QT: "QT", Java: "Java"},
	versions: {DevalVr:"0,6,2,0", QT: "7,0,0", Flash: "9,0,0", Java: "1"},
	parameters: {
		"DevalVr": {
			"resize": "0",
      "autoplay": "1",
      "firstautoplay": "1,50",
      "autoplayspeed": "5",
      "autoplayspeed": "5",
      
      "rotationy": "0",
      "zoom": "0.6",
      "minzoom": "0.5",
      "maxzoom": "4"
		},
		"QT": {
			"controller": "true"
		},
		"FlashPanorama": {
			"allowFullScreen": "true",
			"allowScriptAccess": "sameDomain",
			"xml": {
				"loaderStreamed": "1",
				"zoomHome": 0.7,
				"auto_speed": -0.2,
				"auto_interval": 30,
				"auto_pause": 2000,
				"auto_quality": "low"
			}
		},
		"ImmerVision": {
			"allowFullScreen": "true",
			"allowScriptAccess": "sameDomain"
		},
		"Java": {
		}
	},
	elements: [],
	initialize: function(sources, id, width, height) {
		this.sources = sources;
		this.id = id;
		this.width = width;
		this.height = height;
	},
	getPriorities: function() {
		return this.priorities;
	},
	setPriorities: function(priorities) {
		this.priorities = priorities;
	},
	getVersions: function() {
		return this.versions;
	},
	setVersions: function(versions) {
		this.versions = versions;
	},
	getParameters: function(provider) {
		return this.parameters[provider];
	},
	setParameters: function(provider, parameters) {
		this.parameters[provider] = parameters;
	},
	write: function(id, provider) {
		provider = provider || '';
		var method = 'write' + provider;
		if (!provider || typeof(this[method]) == 'undefined') {
			// deterimine technology to use
			for (var tech in this.priorities) {
				var detect = 'detect' + tech;
				var version = this.versions[tech];
				if (this[detect](version)) {
					provider = this.priorities[tech];
					break;
				}
			}
		}
		method = 'write' + provider;
		if (typeof(this[method]) != 'undefined') {
			var parameters = this.parameters[provider];
			this[method](id, parameters);
		}
	},
	fullscreen: function(id) {
		if (typeof(id) == 'undefined' && this.elements.length == 1)
			id = this.elements[0][0];
		if (typeof(id) != 'undefined') {
			for (i in this.elements) {
				if (this.elements[i][0] == id) {
					var tech = this.elements[i][1];
					var method = 'fullscreen'+tech;
					this[method](id);
					return true;
				}
			}
		}
		return false;
	},
	writeDevalVr: function(id, parameters) {
		var params = ["devalvr"];
		for (var param in parameters) {
			params.push(param);
			params.push(parameters[param]);
		}
    viewerparameters.apply(null, params);
    
    var source = (this.sources.mov || this.sources.qf || this.sources.jpg || this.sources.jf);
    var tmp_id = 'deval_tmp_'+Math.random(1000);
    document.writeln('<div id="'+tmp_id+'" style="display:none">');
		p2q_EmbedDevalVR("/flash/pano_dvl.php?source="+source+"&ext=dvl", this.width, this.height, this.id);
		document.writeln('</div>');
		
		$(id).update($(tmp_id).innerHTML);
		//$(tmp_id).remove();
		
		this.elements.push([id, "DevalVr", "DevalVr"]);
	},
	writeQT: function(id, parameters) {
		var source = (this.sources.mov || this.sources.qf);
		var qtObject = new QTObject(source, this.id, this.width, this.height);
		if (this.height == '100%')
			parameters['scale'] = 'tofit';
		for (var param in parameters) {
			qtObject.addParam(param, parameters[param]);
		}
		qtObject.write(id);
		
		this.elements.push([id, "QT", "QT"]);
	},
	writeFlashPanorama: function(id, parameters, version) {
		var source = (this.sources.mov || this.sources.qf || this.sources.jpg || this.sources.jf);
		version = (typeof(version) == 'undefined' ? this.versions.Flash : version).replace(/,/g, ".");
		// xml_params
		var xml_params = 'source='+escape(source);
		for (var param in parameters.xml)
			xml_params += '&'+param+'='+parameters.xml[param];
		delete parameters.xml;
		var flashvars = {"xml_file": "/flash/pano_xml.php?"+xml_params, "redirect": window.location};
		var attributes = {id: this.id};
		// tmp_id
		var tmp_id = "flash_panorama_tmp_"+Math.random(1000);
		var tmp_html = '<div id="'+tmp_id+'"></div>';
		$(id).update(tmp_html);
		swfobject.embedSWF("/flash/pano.swf", tmp_id, this.width, this.height, version, "/flash/expressInstall.swf", flashvars, parameters, attributes);
		
		this.elements.push([id, "Flash", "FlashPanorama"]);
	},
	writeImmerVision: function(id, parameters) {
		this.elements.push([id, "Flash", "ImmerVision"]);
	},
	writeJava: function(id, parameters) {
		this.elements.push([id, "Java", "Java"]);
	},
	detectDevalVr: function(ver) {
    minDevalVRVersion = ver;
    return IsPluginInstalled(1);
	},
	detectQT: function(ver) {
		minQTVersion = ver.replace(/,/g, ".");
		return IsPluginInstalled(2);
		/*return isQTInstalled();*/
	},
	detectFlash: function(ver) {
		return swfobject.hasFlashPlayerVersion(ver.replace(/,/g, "."));
	},
	detectJava: function(ver) {
	},
	fullscreenDevalVr: function(id) {
		document[this.id].fullscreen=1
	},
	fullscreenQT: function() {
	},
	fullscreenFlash: function() {
		alert('Double click on panorama');
	},
	fullscreenJava: function() {
	}
});