function userOnStart()
{
  objectsOnStart();
}

function userOnAfterPage()
{
  objectsOnAfterPage();
  gPageCompleted = true;
}

function userOnStop()
{
  objectsOnStop();
}

var gObjectClassIds;
var gEmbedTypes;
var gMapClassIdType;

function objectsOnStart()
{
  gObjectClassIds = {};
  gEmbedTypes = {};
  gMapClassIdType = {};
}

function objectsOnAfterPage()
{
  var i;
  var elm;
  var wmode;
  var doc = gSpider.mDocument;
  var emblist;

  var hasScriptForEvent = false;
  var scrlist = doc.getElementsByTagName('script');

  for (i = 0; !hasScriptForEvent && i < scrlist.length; i++)
  {
    var scr = scrlist[i];
    if (scr.getAttribute('for') || scr.getAttribute('event'))
    {
      hasScriptForEvent = true;
    }
  }

  if (hasScriptForEvent)
  {
    cdump('WARNING: SCRIPT FOR EVENT');
  }

  var objlist = doc.getElementsByTagName('object');

  for (i = 0; i < objlist.length; i++)
  {
    elm   = objlist[i];
    var classid = elm.getAttribute('classid');
    var data  = elm.getAttribute('data');
    var paramList = elm.getElementsByTagName('param');
    for (var j = 0; j < paramList.length; j++)
    {
      var param = paramList[j];
      var name  = param.getAttribute('name');
      if (name)
      {
        name = name.toLowerCase();
        if (name == 'wmode')
        {
          wmode = param.getAttribute('value');
        }
      }
    }

    cdump('OBJECT: classid = ' + classid + ' ' + 
    (data ? 'data = ' + data  + ' ' : '') + (wmode ? 'wmode = ' + wmode  + ' ' : ''));

    emblist = elm.getElementsByTagName('embed');
    if (emblist.length == 0)
    {
      cdump('WARNING: OBJECT Tag does not contain EMBED Tag');
    }
    else
    {
      var emb = emblist[0];

      if (wmode)
      {
        var ewmode = emb.getAttribute('wmode');
        if (!ewmode)
        {
          cdump('WARNING: OBJECT Tag has FLASH WMODE but child EMBED Tag does not.');
        }
      }

      var etype = emb.getAttribute('type');

      if (etype && classid)
      {
        classid = classid.toLowerCase();
        etype = etype.toLowerCase();
        gMapClassIdType[classid] = etype;
      }

      objectsDumpEmbed(emb);
    }

    if (classid)
    {
      classid = classid.toLowerCase();

      if (classid in gObjectClassIds)
      {
        gObjectClassIds[classid] += 1;
      }
      else
      {
        gObjectClassIds[classid] = 1;
      }
    }

    if (data)
    {
      if (data in gObjectClassIds)
      {
        gObjectClassIds[data] += 1;
      }
      else
      {
        gObjectClassIds[data] = 0;
      }
    }
  }

  // cdump embed tags not contained in object tags

  emblist = doc.getElementsByTagName('embed');
  for (i = 0; i < emblist.length; i++)
  {
    elm = emblist[i];
    var parent = elm.parentNode;
    if (parent && parent.tagName != 'OBJECT')
    {
      objectsDumpEmbed(elm);
    }
  }
}

function objectsOnStop()
{
  var val;

  cdump('\n\n **** SUMMARY ****\n\n');

  cdump('\n\nUnique OBJECT CLSID/DATA\n\n')

  for (val in gObjectClassIds)
  {
    cdump(val + ' occurred ' + gObjectClassIds[val] + ' times.');
  }

  cdump('\n\nUnique EMBED TYPE\n\n')

  for (val in gEmbedTypes)
  {
    cdump(val + ' occurred ' + gEmbedTypes[val] + ' times.');
  }
  
  cdump('\n\nCLASSID to TYPE map\n\n');

  for (val in gMapClassIdType)
  {
    cdump('CLASSID ' + val + ' == ' + 'TYPE ' + gMapClassIdType[val]);
  }
}

function objectsDumpEmbed(elm)
{
  var src   = elm.getAttribute('src');
  var type  = elm.getAttribute('type');
  var wmode = elm.getAttribute('wmode');

  cdump('EMBED: type = ' + type + ' ' + 
       (wmode ? 'wmode = ' + wmode  + ' ' : ''));

  if (type)
  {
    type = type.toLowerCase();

    if (type in gEmbedTypes)
    {
      gEmbedTypes[type] += 1;
    }
    else
    {
      gEmbedTypes[type] = 1;
    }
  }
}


