// start VRML and X3D plugin detection

var nvrml  = 0;
var vrmlok = 0;
var vrmlPlugin = '';
var vrml = new Array(20);

var vrmlMime = new Array(10);
vrmlMime[1] = 'model/vrml';
vrmlMime[2] = 'x-world/x-vrml';
var nvrmlMime = 2;

var nx3d  = 0;
var x3dok = 0;
var x3dPlugin = '';
var x3d = new Array(20);

var x3dMime = new Array(10);
x3dMime[1] = 'model/x3d';
x3dMime[2] = 'model/x3d+xml';
x3dMime[3] = 'model/x3d+vrml';
x3dMime[4] = 'model/x3d+binary';
var nx3dMime = 4;

var bold = 0;

// detect plugins in Netscape, Mozilla, Opera, and other browser that use the navigator.plugins array

if (navigator.plugins && navigator.plugins.length > 0) {
  var numPlugins = navigator.plugins.length;

// loop over all plugins
  for (i = 0; i < numPlugins; i++) {
    var plugin = navigator.plugins[i];
    var numTypes = plugin.length;

// look for VRML plugins by checking mimetype for 'vrml'
    for (j = 0; j < numTypes; j++) {
      mimetype = plugin[j];
      if (mimetype) {
        if (mimetype.type == vrmlMime[1] ||
            mimetype.type == vrmlMime[2] ||
            mimetype.suffixes == 'wrl' ||
            mimetype.suffixes == 'wrz' ||
            mimetype.suffixes == 'vrml') {
          enabledPlugin = mimetype.enabledPlugin;
          if (enabledPlugin && (enabledPlugin.name == plugin.name)) {
            vrmlPlugin = plugin.name;
            if (!vrmlok) {vrmlok = 1;}
          }
          ok = 1;
          for (k = 1; k <= nvrml; k++) {if (plugin.name == vrml[k]) {ok = 0;}}
          if (ok) {nvrml = nvrml + 1; vrml[nvrml] = plugin.name;}
          ok = 1;
          for (m = 1; m <= nvrmlMime; m++) {if (mimetype.type == vrmlMime[m]) {ok = 0;}}
          if (ok) {nvrmlMime = nvrmlMime + 1; vrmlMime[nvrmlMime] = mimetype.type;}
        }

// look for X3D plugins by checking mimetype for 'x3d'
        if (mimetype.type.indexOf('x3d') != -1 ||
            mimetype.type.indexOf('X3D') != -1 || 
            mimetype.suffixes.indexOf('x3d') != -1 || 
            mimetype.suffixes.indexOf('x3b') != -1 || 
            mimetype.suffixes.indexOf('b3d') != -1 || 
            mimetype.suffixes.indexOf('b3z') != -1 || 
            mimetype.suffixes.indexOf('X3D') != -1) {
          enabledPlugin = mimetype.enabledPlugin;
          if (enabledPlugin && (enabledPlugin.name == plugin.name)) {
            x3dPlugin = plugin.name;
            if (!x3dok) {x3dok = 1;}
          }
          ok = 1;
          for (k = 1; k <= nx3d; k++) {if (plugin.name == x3d[k]) {ok = 0;}}
          if (ok) {nx3d = nx3d + 1; x3d[nx3d] = plugin.name;}
          ok = 1;
          for (m = 1; m <= nx3dMime; m++) {if (mimetype.type == x3dMime[m]) {ok = 0;}}
          if (ok) {nx3dMime = nx3dMime + 1; x3dMime[nx3dMime] = mimetype.type;}
        }
      }
    }
  }

// *****************************************************************************
// detect VRML and X3D plugins in Microsoft Internet Explorer, only with Windows

} else if (navigator.appName == "Microsoft Internet Explorer") {
  if (navigator.appVersion.indexOf('Win') != -1 && parseFloat(navigator.appVersion) >= 4) {

// IEDetectObject is used to detect ActiveX Controls
    document.writeln('<SCRIPT LANGUAGE="VBScript">');
    document.writeln('function IEDetectObject(activeXControlName)');
    document.writeln('  On Error Resume Next');
    document.writeln('  IEDetectObject = IsObject(CreateObject(activeXControlName))');
    document.writeln('End function');
    document.writeln('</SCR' + 'IPT>');

// detect VRML and X3D ActiveX controls
    if (IEDetectObject('SGI.CosmoPlayer.2')) {
      nvrml = nvrml + 1; vrml[nvrml] = "Cosmo Player 2.1.1";
    } else if (IEDetectObject('SGI.CosmoPlayer.1')) {
      nvrml = nvrml + 1; vrml[nvrml] = "Cosmo Player 2.0";
    }
    if (IEDetectObject('Cortona.Control.1')) {
      nvrml = nvrml + 1; vrml[nvrml] = "Cortona";
    }
    if (IEDetectObject('bsContact.bsContact.1')) {
      nvrml = nvrml + 1; vrml[nvrml] = "BS Contact VRML/X3D";
      nx3d  = nx3d  + 1; x3d[nx3d]   = "BS Contact VRML/X3D";
    }
    if (IEDetectObject('blaxxunCC3D.blaxxunCC3D.1'))   {
      nvrml = nvrml + 1; vrml[nvrml] = "blaxxun Contact";
    }
    if (IEDetectObject('Nexternet.NexternetPlayer.1')) {
      nvrml = nvrml + 1; vrml[nvrml] = "Pivoron Player";
    }
    if (IEDetectObject('VenuesCtrl.VenuesCtrl.1')) {
      nvrml = nvrml + 1; vrml[nvrml] = "Vcom3D Venues";
      nx3d  = nx3d  + 1; x3d[nx3d]   = "Vcom3D Venues";
    }

// detecting the following causes an error in IE, figure out a different way that doesn't
//     if (IEDetectObject('ANIMA.AnimaCtrl.1')) {
//       nx3d  = nx3d  + 1; x3d[nx3d]   = "Flux";
//     }
//     if (IEDetectObject('OctagonX.OctagonX.1')) {
//       nvrml = nvrml + 1; vrml[nvrml] = "Octaga";
//       nx3d  = nx3d  + 1; x3d[nx3d]   = "Octaga";
//     } else if (IEDetectObject('OCTAGONFREEX.OctagonFreeXCtrl.1')) {
//       nvrml = nvrml + 1; vrml[nvrml] = "Octaga";
//       nx3d  = nx3d  + 1; x3d[nx3d]   = "Octaga";
//     }

    if (nvrml == 0) {
      if (IEDetectObject('Owatl.OwCtl.1')) {nvrml = nvrml + 1; vrml[nvrml] = "OpenWorlds";}
      if (IEDetectObject('MSVRML2C.VRMLBrowserCtl.1')) {nvrml = nvrml + 1; vrml[nvrml] = "Microsoft VRML Viewer";}
      if (IEDetectObject('WorldView.WorldView VrmlViewer.1')) {
        nvrml = nvrml + 1; vrml[nvrml] = "WorldView";
      } else if (IEDetectObject('WorldView.WorldView VrmlViewer.2')) {
        nvrml = nvrml + 1; vrml[nvrml] = "WorldView";
      } else if (IEDetectObject('WORLDVIEW.WorldViewCtrl.1')) {
        nvrml = nvrml + 1; vrml[nvrml] = "WorldView";
      }
    }

    if (nvrml > 0) {
      vrmlok = 1;
      if (nvrml == 1) {
        vrmlPlugin = vrml[1];
      } else {
        vrmlPlugin = 'indefinido';
      }
    }
    if (nx3d > 0) {
      x3dok = 1;
      if (nx3d == 1) {
        x3dPlugin = x3d[1];
      } else {
        x3dPlugin = 'indefinido';
      }
    }
  }
  bold = 1;
}

// OS

var win   = 0;
var wince = 0;
var mac   = 0;
var irix  = 0;
var unix  = 0;
if (navigator.appVersion.indexOf('Win')  != -1)      {win   = 1;}
if (navigator.appVersion.indexOf('Mac')  != -1)      {mac   = 1;}
if (navigator.appVersion.indexOf('X11')  != -1)      {unix  = 1;}
if (navigator.userAgent.indexOf('Windows CE') != -1) {wince = 1;}
if (navigator.userAgent.indexOf('Linux') != -1)      {unix  = 1;}
if (navigator.userAgent.indexOf('IRIX') != -1 && parseFloat(navigator.appVersion) < 5) {irix = 1; unix = 0;}
 
// VRML plugin URLs, update as necessary

var httpBlaxxun = '<A HREF="http://www.blaxxun.com/en/products/contact/index.html">';
var httpContact = '<A HREF="http://www.bitmanagement.de/">';
var httpCortona = '<A HREF="http://www.parallelgraphics.com/products/cortona/">';
// var httpCosmo   = '<A HREF="http://ca.com/cosmo/home.htm">';
var httpCosmo   = '<A HREF="http://cic.nist.gov/vrml/vrmlnotes.html">';
var httpCyber   = '<A HREF="http://www.cybergarage.org/vrml/">';
var httpFlux    = '<A HREF="http://www.mediamachines.com/">';
var httpFreeWRL = '<A HREF="http://freewrl.sourceforge.net/">';
var httpLookat  = '<A HREF="http://sourceforge.net/projects/openvrml/">';
var httpOctaga  = '<A HREF="http://www.octaga.com/">';
var httpVcom3d  = '<A HREF="http://www.vcom3d.com/Viewer.htm">';
var httpX3DKit  = '<A HREF="http://artis.imag.fr/Members/Yannick.Legoc/X3D/">';
var httpXj3D    = '<A HREF="http://www.xj3d.org/">';

if (mac) {
  httpCortona = '<A HREF="http://www.parallelgraphics.com/products/cortonamac/">';
} else if (irix) {
  httpCosmo   = '<A HREF="http://www.sgi.com/software/cosmo/irix_player.html">';
} else if (wince) {
  httpCortona = '<A HREF="http://www.parallelgraphics.com/products/cortonace/">';
}

var urlBlaxxun = httpBlaxxun + 'blaxxun Contact</A>';
var urlContact = httpContact + 'BS Contact VRML/X3D</A>';
var urlCortona = httpCortona + 'Cortona</A>';
var urlCosmo   = httpCosmo   + 'Cosmo Player</A>';
var urlCyber   = httpCyber   + 'CyberX3D</A>';
var urlFlux    = httpFlux    + 'Flux</A>';
var urlFreeWRL = httpFreeWRL + 'FreeWRL</A>';
var urlLookat  = httpLookat  + 'OpenVRML-Lookat</A>';
var urlOctaga  = httpOctaga  + 'Octaga</A>';
var urlVcom3d  = httpVcom3d  + 'Vcom3D Venues</A>';
var urlX3DKit  = httpX3DKit  + 'X3DToolKit</A>';
var urlXj3D    = httpXj3D    + 'Xj3D</A>';
if (wince) {urlCortona = httpCortona + 'Pocket Cortona</A>';}

var blaxxun = 0;
var contact = 0;
var cortona = 0;
var cosmo   = 0;
var flux    = 0;
var freewrl = 0;
var lookat  = 0;
var octaga  = 0;
var vcom3d  = 0;

// report VRML plugins -----------------------------------------------------------------------

var ip = vrmlPlugin.indexOf(' from PLATINUM');
if (ip != -1) {vrmlPlugin = vrmlPlugin.substring(0,ip);}
var urlHelp = "";

document.write('<P></P><P>');
if (nvrml > 0) {
  document.write('Plugins VRML');
  if (nvrml > 1) {document.write('s');}
  document.write(': &nbsp;');
  
  for (k = 1; k <= nvrml; k++) {
    ip = vrml[k].indexOf(' from PLATINUM');
    if (ip != -1) {vrml[k] = vrml[k].substring(0,ip);}
    ip = vrml[k].indexOf(' Netscape - Mozilla Plugin');
    if (ip != -1) {vrml[k] = vrml[k].substring(0,ip);}
    
    if (nvrml > 1) {document.write('[');}
    if (bold || vrml[k] == vrmlPlugin) {document.write('<B>');}
    
    if (vrml[k].indexOf('Cosmo') != -1) {
      document.write(httpCosmo + vrml[k] + '</A>');
      cosmo = 1;
      if (win) {
        urlHelp = '<A HREF="http://cic.nist.gov/vrml/cosmo/Doc/frames-help.html">';
      } else if (irix) {
        urlHelp = '<A HREF="file://localhost/usr/CosmoPlayer/doc/en/frames-help.html">';
      }

    } else if (vrml[k].indexOf('Cortona') != -1) {
      document.write(httpCortona + vrml[k] + '</A>');
      cortona = 1;
      urlHelp = '<A HREF="http://www.parallelgraphics.com/developer/products/cortona/help/">';

    } else if (vrml[k].indexOf('BS Contact') != -1) {
      document.write(httpContact + vrml[k] + '</A>');
      contact = 1;
      urlHelp = '<A HREF="http://www.bitmanagement.de/developer/contact/userguide/index.html">'; 

    } else if (vrml[k].indexOf('blaxxun') != -1) {
      document.write(httpBlaxxun + vrml[k] + '</A>');
      blaxxun = 1;
      urlHelp = '<A HREF="http://www.blaxxun.com/en/products/contact/documentation.html">'; 

    } else if (vrml[k].indexOf('FreeWRL') != -1) {
      document.write(httpFreeWRL + vrml[k] + '</A>');
      freewrl = 1;
      urlHelp = '<A HREF="http://freewrl.sourceforge.net/freewrl.html">'; 

    } else if (vrml[k].indexOf('ookat') != -1 || vrml[k].indexOf('OpenVRML') != -1) {
      document.write(httpLookat + vrml[k] + '</A>');
      lookat  = 1;

    } else if (vrml[k].indexOf('Flux') != -1) {
      document.write(httpFlux + vrml[k] + '</A>');
      flux = 1;
      urlHelp = '<A HREF="http://www.mediamachines.com/userguide.html">'; 

    } else if (vrml[k].indexOf('Octag') != -1) {
      document.write(httpOctaga + vrml[k] + '</A>');
      octaga = 1;
      urlHelp = '<A HREF="http://www.octaga.com/freedownloads/Octaga/User%20Manual.rtf">';

    } else if (vrml[k].indexOf('Vcom') != -1) {
      document.write(httpVcom3d + vrml[k] + '</A>');
      vcom3d = 1;
      urlHelp = '<A HREF="http://www.vcom3d.com/viewer/X3D_Browser_and_Simulation_EngineB2.pdf">'; 

    } else {
      document.write(vrml[k]);
    }

    if (bold || vrml[k] == vrmlPlugin) {document.write('</B>');}

    if (urlHelp != "") {document.write(' &nbsp;(' + urlHelp + 'Ayuda</A>)');}

    if (blaxxun) {document.write(' &nbsp;(<A HREF="http://www.bitmanagement.de/">Nueva Versión</A>)');}
    if (cosmo && irix) {document.write(' &nbsp;(<A HREF="file://localhost/usr/CosmoPlayer/doc/en/frames-relnotes.html">Release Notes</A>)');}

    if (nvrml > 1) {
      document.write(']');}
      if (k < nvrml) {document.write('&nbsp;&nbsp;');
    }
  }

// no VRML plugins

} else {
  document.write('VRML plugin: &nbsp;<B>none</B>');
}

// VRML plugin recommendations ----------------------------------------------------------------

if (win && !wince && !cosmo && !cortona && !contact) {
   now = new Date()
   var nows = now.getTime().toString();
   var jdx = new Array(3);
   var idx = 0;
   idx = parseInt(now.getTime().toString().substring(9,13));
   if (idx < 1666)      {jdx[0] = 0; jdx[1] = 1; jdx[2] = 2;}
   else if (idx < 3332) {jdx[0] = 0; jdx[1] = 2; jdx[2] = 1;}
   else if (idx < 4998) {jdx[0] = 1; jdx[1] = 2; jdx[2] = 0;}
   else if (idx < 6664) {jdx[0] = 1; jdx[1] = 0; jdx[2] = 2;}
   else if (idx < 8330) {jdx[0] = 2; jdx[1] = 0; jdx[2] = 1;}
   else                 {jdx[0] = 2; jdx[1] = 1; jdx[2] = 0;}

   var winplug = new Array(3);
   winplug[0] = urlCosmo;
   winplug[1] = urlCortona;
   winplug[2] = urlContact;

   document.write('<BR>Available VRML plugins:&nbsp;');
   for (k = 0; k < 3; k++) {
     document.write(winplug[jdx[k]]);
     if (k < 2) {document.write(',  ');}
   }
   if (navigator.appName == "Microsoft Internet Explorer") {
     document.write(',  ' + urlFlux);
     document.write(',  ' + urlOctaga);
     document.write(',  ' + urlVcom3d);
   }

} else if (unix) {
  if (!freewrl && !lookat) {
    document.write('<BR>Available VRML software:&nbsp; ');
    document.write(urlFreeWRL);
    document.write(',  ' + urlLookat);
    document.write(',  ' + urlXj3D);
    document.write(',  ' + urlCyber);
  }
//   document.write('<BR>More information can be found at <A HREF="http://chromebob.com/vrml/">VRML4Linux</A>.');

} else if (mac) {
  if (!cortona && !freewrl) {
    document.write('<BR>Available VRML plugins:&nbsp; ');
    document.write(urlCortona);
    document.write(',  ' + urlFreeWRL);
    document.write(',  ' + urlLookat);
  }
  document.write('<BR>Más información en <A HREF="http://www.macweb3d.org/">MacWeb3D</A>.');

} else if (irix && !cosmo) {
  document.write('<BR>Available VRML plugin:&nbsp; ' + urlCosmo);

} else if (wince && !cortona) {
  document.write('<BR>Available VRML plugin:&nbsp; ' + urlCortona);
}

document.write('</P>');

// report X3D plugins -----------------------------------------------------------------------

if (!wince) {
  urlHelp = "";

  document.write('<P></P><P>');
  if (nx3d > 0) {
    document.write('Plugins X3D');
    if (nx3d > 1) {document.write('s');}
    document.write(': &nbsp;');

    for (k = 1; k <= nx3d; k++) {
      ip = x3d[k].indexOf(' Netscape - Mozilla Plugin');
      if (ip != -1) {x3d[k] = x3d[k].substring(0,ip);}

      if (nx3d > 1) {document.write('[');}
      if (bold || x3d[k] == x3dPlugin) {document.write('<B>');}

      if (x3d[k].indexOf('BS Contact') != -1) {
	document.write(httpContact + x3d[k] + '</A>');
	contact = 1;
        urlHelp = '<A HREF="http://www.bitmanagement.de/developer/contact/userguide/index.html">'; 

      } else if (x3d[k].indexOf('Flux') != -1) {
	document.write(httpFlux + x3d[k] + '</A>');
	flux = 1;
	urlHelp = '<A HREF="http://www.mediamachines.com/userguide.html">'; 

      } else if (x3d[k].indexOf('FreeWRL') != -1) {
	document.write(httpFreeWRL + x3d[k] + '</A>');
	freewrl = 1;
	urlHelp = '<A HREF="http://freewrl.sourceforge.net/freewrl.html">'; 

      } else if (x3d[k].indexOf('Octag') != -1) {
	document.write(httpOctaga + x3d[k] + '</A>');
	octaga = 1;

      } else if (x3d[k].indexOf('Vcom') != -1) {
	document.write(httpVcom3d + x3d[k] + '</A>');
	vcom3d = 1;
        urlHelp = '<A HREF="http://www.vcom3d.com/viewer/X3D_Browser_and_Simulation_EngineB2.pdf">'; 

      } else if (x3d[k].indexOf('Cortona') != -1) {
	document.write(httpCortona + x3d[k] + '</A>');
	cortona = 1;
	urlHelp = '<A HREF="http://www.parallelgraphics.com/developer/products/cortona/help/">';

      } else if (x3d[k].indexOf('ookat') != -1 || x3d[k].indexOf('OpenVRML') != -1) {
	document.write(httpLookat + x3d[k] + '</A>');

      } else {
	document.write(x3d[k]);
      }
      if (bold || x3d[k] == x3dPlugin) {document.write('</B>');}
      if (urlHelp != "") {document.write(' &nbsp;(' + urlHelp + 'Ayuda</A>)');}
      if (nx3d > 1) {
	document.write(']');}
	if (k < nx3d) {document.write('&nbsp;&nbsp;');
      }
    }

// no X3D plugins

  } else {
    document.write('X3D plugin: &nbsp;<B>none</B>');
  }

// X3D plugin recommendations

  if (win && !wince && !contact && !flux && !octaga && !vcom3d) {
    document.write('<BR>Available X3D plugins:&nbsp; ');
    document.write(urlContact);
    if (navigator.appName == "Microsoft Internet Explorer") {
      document.write(',  ' + urlFlux);
      document.write(',  ' + urlOctaga);
      document.write(',  ' + urlVcom3d);
    }

  } else if ((unix || mac || irix) && !freewrl) {
    document.write('<BR>Available X3D software:&nbsp; ');
    document.write(urlFreeWRL);
    document.write(',  ' + urlXj3D);
    document.write(',  ' + urlCyber);
    document.write(',  ' + urlX3DKit);
  }
}
  
