// Flash が使用可能かどうかを調べる
function isFlashAvailable()
{
  var result, mt, i, pi, m;
  result = false;
  if (typeof window.ActiveXObject == "function")
  {
    for (i = 10; i >= 1; --i)
    {
      try
      {
        if (new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i))
        {
          result = i;
          break;
        }
      }
      catch (err)
      {
      }
      if (result)
        break;
    }
  }
  else
    if (window.navigator && window.navigator.mimeTypes)
    {
      for (i = 0; i < navigator.mimeTypes.length; ++i)
        if ((mt = navigator.mimeTypes[i]) &&
            String(mt.type).toLowerCase() == "application/x-shockwave-flash" &&
            (pi = mt.enabledPlugin))
        {
          if (pi.name == "Shockwave Flash" &&
              (m = String(pi.description).match(/[0-9]+(\.[0-9]+)?/)))
            result = parseFloat(m[0]);
          break;
        }
    }
  return result;
}

function parseClassNameValue(str)
{
  var cs, vs, ps, i;
  cs = String(str).split(/[ ,]+/);
  vs = { };
  for (i = 0; i < cs.length; ++i)
  {
    ps = cs[i].split("=", 2);
    vs[canonicalizeIdentifier(ps[0])] = ps[1];
  }
  return vs;
}

// YouTube の Flash をはめ込む
function replaceYoutubeObject(doc, version)
{
  var ie, divs, div, i, requirement, url, obj, child, j, vs, width, height;
  if (doc.createElement &&
      (divs = snapElementsByTagName(doc, "DIV", "youtube")))
  {
    ie = typeof window.ActiveXObject == "function";
    for (i = 0; i < divs.length; ++i)
      if ((div = divs[i]) && div.appendChild && div.removeChild)
      {
        vs = parseClassNameValue(div.className);
        url = false;

        requirement = false;
        if (typeof vs["videoid"] == "string")
        {
          url = "http://www.youtube.com/v/" + vs["videoid"] + "&hl=ja&rel=0&fs=1";
          requirement = 7.0;
        }
        else if (typeof vs["banner"] == "string")
          url = absolutizeUrl(getBaseUrl(doc), vs["banner"]);
        if (typeof vs["requirement"] == "string")
          requirement = parseFloat(vs["requirement"]);

        if (typeof vs["width"] == "string")
          width = parseInt(vs["width"])
        else
          width = div.clientWidth;
        if (typeof vs["height"] == "string")
          height = parseInt(vs["height"])
        else
          height = div.clientHeight;

        if (url && (!requirement || version >= requirement ) &&
            (obj = doc.createElement("OBJECT")))
        {
          if (ie)
            obj.setAttribute("classid", "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
          else
            obj.type = "application/x-shockwave-flash";

          obj.width = width;
          obj.height = height;

          if (!ie)
          {
            obj.data = url;
            if (version >= 9.0)
              appendParamToObject(obj, "allowFullScreen", "true");
            if (version >= 8.0)
              appendParamToObject(obj, "allowScriptAccess", "sameDomain");
            appendParamToObject(obj, "quality", "high");
            appendParamToObject(obj, "wMode", "opaque");
          }
          if (div.appendChild(obj))
          {
            if (ie)
            {
              if (version >= 9.0)
                obj.object.AllowFullScreen = "true";
              if (version >= 8.0)
                obj.object.AllowScriptAccess = "sameDomain";
              obj.object.Quality2 = "high";
              obj.object.WMode = "opaque";
              obj.object.Movie = url;
            }
            // 代替コンテンツを削除する
            if (div.childNodes && div.childNodes.item)
            {
              for (j = div.childNodes.length - 1; j >= 0; --j)
                if ((child = div.childNodes.item(j)) && child != obj)
                  div.removeChild(child);
            }
          }
        }
      }
  }
  return;
}

function appendParamToObject(obj, name, value)
{
  var doc, par;
  if (obj && obj.appendChild && (doc = obj.ownerDocument) &&
      doc.createElement && (par = doc.createElement("PARAM")))
  {
    par.name = name;
    par.value = value;
    obj.appendChild(par);
  }
  return;
}

// base から見た相対 URL を絶対 URL に変換する
function absolutizeUrl(base, url)
{
  var m1, m2, t, s, n, i, j;
  // URL を分離
  //            1:scheme     2:server       3:path  4:query   5:fragment
  if ((m1 = String(base).match(/^([^:\/?#]+:)?(\/\/[^\/?#]*)?([^?#]*)(\?[^#]*)?(.*)?/)) &&
      (m2 = String(url).match(/^([^:\/?#]+:)?(\/\/[^\/?#]*)?([^?#]*)(\?[^#]*)?(.*)?/)))
  {
    delete m2[0];
    if (!m2[1])
      m2[1] = m1[1];
    if (!m2[2])
    {
      m2[2] = m1[2];
      if (!m2[3])
      {
        m2[3] = m1[3];
        if (!m2[4])
        {
          m2[4] = m1[4];
          if (!m2[5])
            m2[5] = m1[5];
        }
      }
      else if (m2[3].charAt(0) != "/")
      {
        base = m1[3].replace(/[^\/]+$/, "");
        if (!base)
          base = "/";
        m2[3] = base + m2[3];
      }
    }
    else
    {
      if (!m2[3])
        m2[3] = "/";
    }
    t = m2[3].split(/(?=\/)/);
    s = [];
    n = t.length - 1;
    j = 0;
    for (i = 0; i <= n; ++i)
    {
      if (t[i] != "/..")
      {
        if (t[i] != "/.")
          s[j++] = t[i];
        else if (i == n)
            s[j++] = "/";
      }
      else
      {
        if (i == n)
          s[--j] = "/";
        else if (j > 0)
            delete s[--j];
      }
    }
    m2[3] = s.join("");
    url = m2.join("");
  }
  return url;
}

// ドキュメントのベース URL を返す
function getBaseUrl(doc)
{
  var bases, base, i;
  if (doc || (doc = document))
  {
    if (typeof doc.baseURI == "string")
      return doc.baseURI;
    if (doc.getElementsByTagName &&
        (bases = doc.getElementsByTagName("BASE")) && bases.item)
    {
      for (i = 0; i < bases.length; ++i)
        if ((base = bases[i]) && base.href)
          return base.href;
    }
    if (doc.location && typeof doc.location.href == "string")
      return doc.location.href;
    if (typeof doc.URL == "string")
      return doc.URL;
  }
  return "";
}

function youtubeLoad(evt)
{
  var version;
  if ((version = isFlashAvailable()))
    replaceYoutubeObject(document, version);
  return;
}

pushEventListener(this, "load", youtubeLoad, false);
