/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
function userOnStart()
{
  objectsOnStart();
  metaTagsOnStart();
}

function userOnBeforePage()
{
  metaTagsOnBeforePage();
}

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

function compatModeOnAfterPage()
{
  cdump('Page: ' + 
       gSpider.mCurrentUrl.mUrl + 
       ' is in ' + 
       (gSpider.mDocument.compatMode == 'BackCompat' ? 'Quirks' : 'Standards') +
       ' mode.');
}

function userOnStop()
{
  objectsOnStop();
  metaTagsOnStop();
}

var gObjectClassIds;
var gEmbedTypes;
var gMapClassIdType;

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

function objectsOnAfterPage()
{
  var i;
  var elm;
  var wmode;
  var doc = gSpider.mDocument;
  var loc = doc ? doc.location.href : '';
  var emblist;

  var reLanguageVer = /javascript([0-9.]*)/i;
  var scrlist = doc.getElementsByTagName('script');

  for (i = 0; i < scrlist.length; i++)
  {
    var scr = scrlist[i];

    var file = scr.getAttribute('src');

    if (scr.getAttribute('for') || scr.getAttribute('event'))
    {
      cdump('WARNING: SCRIPT FOR EVENT. Source File: ' + loc + (file ? ' src: ' + file : ''));
    }
    // check for javascript language version uses which can cause
    // incompatibilities
    var scrLanguage = scr.getAttribute('language');
    var scrType = scr.getAttribute('type');
    if (scrLanguage)
    {
      cdump('SCRIPT: LANGUAGE ' + scrLanguage + ' ' +
            'TYPE ' + scrType + '. Source File: ' + loc + (file ? ' src: ' + file : ''));
    }
  }

  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  + ' ' : '') + '. Source File: ' + loc );

    emblist = elm.getElementsByTagName('embed');
    if (emblist.length == 0)
    {
      cdump('WARNING: OBJECT Tag does not contain EMBED Tag. Source File: ' + loc + (file ? ' src: ' + file : ''));
    }
    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. Source File: ' + loc + (file ? ' src: ' + file : ''));
        }
      }

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

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

      objectsDumpEmbed(emb, loc);
    }

    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, loc);
    }
  }
}

function objectsOnStop()
{
  var val;

  cdump('\n\n **** OBJECT 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, loc)
{
  var src   = elm.getAttribute('src');
  var type  = elm.getAttribute('type');
  var wmode = elm.getAttribute('wmode');

  cdump('EMBED: type = ' + type + ' ' + 
       (wmode ? 'wmode = ' + wmode  + ' ' : '') + '. Source File: ' + loc );

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

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

var gMetaGenerators;
var gMetaCapturedMessages;

function metaTagsOnStart()
{
  gMetaGenerators = {};
}

function metaTagsOnBeforePage()
{
  gMetaCapturedMessages = [];
  gConsoleListener.onConsoleMessage = metaTagsOnConsoleMessage;
}

function metaTagsOnConsoleMessage(msg)
{
  gMetaCapturedMessages.push(msg);
}

function metaTagsOnAfterPage()
{
  gConsoleListener.onConsoleMessage = null;

  var doc = gSpider.mDocument;
  var url = doc.location.href;
  var i;

  var list = doc.getElementsByTagName('meta');

  for (i = 0; i < list.length; i++)
  {
    var meta = list[i];

    var name = meta.getAttribute('name');
    if (!name || name.toLowerCase() != 'generator')
    {
      continue;
    }

    var generator = meta.getAttribute('content');
    if (!generator)
    {
      continue;
    }

    cdump('GENERATOR: ' + generator + ' Page: ' + url);
    if (!(generator in gMetaGenerators))
    {
      gMetaGenerators[generator] = [];
    }
    gMetaGenerators[generator].push(url);
    break;
  }
  if (!generator)
  {
    generator = '';
  }
  else
  {
    generator = ' generator[' + generator + ']';
  }

  var length = gMetaCapturedMessages.length;
  for (i = 0; i < length; i++)
  {
    dump(gMetaCapturedMessages[i] + generator);
  }
}

function metaTagsOnStop()
{
  var totalPages = gSpider.mPagesVisited.length;

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

  for (var generator in gMetaGenerators)
  {
    var pageCount = gMetaGenerators[generator].length;
    cdump(generator + ' used on ' + pageCount +
          ' pages (' +  ((pageCount/totalPages)*100).toFixed(2) + '%).');
  }
}

