var BODY_EL = document.getElementsByTagName('body')[0];
function addToOnLoad (fn) {
  var prevonload = window.onload;
  if (typeof prevonload != 'function') {
    window.onload = fn;
  } else {
    window.onload = function() {
      if (prevonload) {
        prevonload.call(window, []);
      }
      fn.call(window, []);
    }
  }
};
var domReady = {
  queue : [],
  fired : false,

  add : function (fn) {
    if (domReady.fired) fn.call(window, []);
    else domReady.queue.push(fn);
  },

  exec : function () {
    var fn = null;
    while (fn = domReady.queue.shift()) {
      fn.call(window, []);
    }
    domReady.fired = true;
  },

  check : function () {
    if (domReady.fired) return;

    if (document.addEventListener) {
      document.addEventListener("DOMContentLoaded", domReady.exec, false);
    }

    var ua = navigator.userAgent.toLowerCase();
    if (/webkit/.test(ua)) {
      if (document.readyState == "loaded" || document.readyState == "complete") {
        if (domReady.numStyles === undefined) {
          domReady.numStyles = 0;
          var links = document.getElementsByTagName("link");
          for (var i=0; i < links.length; i++) {
            if(links[i].getAttribute('rel') == 'stylesheet') {
              domReady.numStyles++;
            }
          }
          var styles = document.getElementsByTagName("style");
          domReady.numStyles += styles.length;
        }
        if (document.styleSheets.length == domReady.numStyles) {
          domReady.exec();
          return;
        }
      }
    } else if (/msie/.test(ua) && window == top) {
      (function () {
        if (domReady.fired) return;
        try {
          document.documentElement.doScroll("left");
        } catch(error) {
          setTimeout(arguments.callee, 0);
          return;
        }
        domReady.exec();
      })();
    }
  }
}
setTimeout(domReady.check, 10);
addToOnLoad(domReady.exec);

// test the onload vs domReady timing
// var start = (new Date()).getTime();
// addToOnLoad(function () { log.push(((new Date()).getTime() - start) +' addToOnLoad'); } );
// domReady.add(function () { log.push(((new Date()).getTime() - start) +' domReady'); } );
// var log = [((new Date()).getTime() - start) +' immediate'];
// addToOnLoad(function () { alert(log.join("\n")); } );

var Menus = {
  initialize : function(tabsElement) {
    if (document.all&&document.getElementById) {
      navRoot = tabsElement ? tabsElement : document.getElementById("tabs");
    if (navRoot.childNodes)
      for (i=0; i<navRoot.childNodes.length; i++) {
      node = navRoot.childNodes[i];
      if (node.nodeName=="LI") {
        node.onmouseover=function() {
        this.className+=" over";
        }
        node.onmouseout=function() {
          this.className=this.className.replace(" over", "");
        }
      }
      }
    }
  }
}
if (document.getElementById("tabs")) {
  Menus.initialize();
} else {
  domReady.add(Menus.initialize);
}


var globalSearch = {
  init : function () {
      var $search_form_trg = document.getElementById('search_form_trg');
      if ( $search_form_trg) {
        var searchForm = document.createElement('div');
        searchForm.innerHTML = '<form id="search_form" action="/search.html" method="get">' +
            '<input type="text" name="q" id="global_search_q" class="topsearch" maxlength="128" size="15" value="" title="Enter the terms you wish to search for." action="/search_suggest.html" columns="2" autocomplete="off" delay="1500" /> ' +
            '<input type="submit" name="op" class="topsearchbtn" value="Search" />' +
            '</form>';
        BODY_EL.appendChild(searchForm);
        searchForm.id = 'searchfieldDiv';
        searchForm.className = 'searchfield';

        searchMove();
        $search_form_trg.innerHTML = '&nbsp;';
        initializeSuggestFramework();
      }
    }, // END:init

  complete:true
}
domReady.add(globalSearch.init);

function searchMove() {
  var searchForm = document.getElementById('searchfieldDiv');
  var searchFormTrg = document.getElementById('search_form_trg');

  if (searchForm != null) {
    searchForm.style.top = searchFormTrg.offsetTop + 'px';
    searchForm.style.left = searchFormTrg.offsetLeft + 'px';
  }
}

if (document.addEventListener) {
  window.addEventListener('resize', searchMove, false);
} else {
  window.attachEvent('onresize', searchMove);
}

function hideshow(szDivID, iState) // 1 visible, 0 hidden
{
   var obj = document.layers ? document.layers[szDivID] :
   document.getElementById ?  document.getElementById(szDivID).style :
   document.all[szDivID].style;
   obj.visibility = document.layers ? (iState ? "show" : "hide") : (iState ? "visible" : "hidden");
   if(iState == 2) {
     obj.display = 'inline';
   } else if(iState == 1) {
     obj.display = 'block';
   } else {
     obj.display = 'none';
   }
}


function deleteValidate(objForm, message, url) {
  if(confirm(message)) {
    document.location.href=url;
  }
}

function confirmDelete(message, url) {
  if(confirm(message)) {
    document.location.href=url;
  }
}

function newWindow(a_str_windowURL, a_str_windowName, a_int_windowWidth, a_int_windowHeight, a_bool_scrollbars, a_bool_resizable, a_bool_menubar, a_bool_toolbar, a_bool_addressbar, a_bool_statusbar, a_bool_fullscreen) {
  var int_windowLeft = (screen.width - a_int_windowWidth) / 2;
  var int_windowTop = (screen.height - a_int_windowHeight) / 2;
  var str_windowProperties = 'height=' + a_int_windowHeight + ',width=' + a_int_windowWidth + ',top=' + int_windowTop + ',left=' + int_windowLeft + ',scrollbars=' + a_bool_scrollbars + ',resizable=' + a_bool_resizable + ',menubar=' + a_bool_menubar + ',toolbar=' + a_bool_toolbar + ',location=' + a_bool_addressbar + ',statusbar=' + a_bool_statusbar + ',fullscreen=' + a_bool_fullscreen + '';
  var obj_window = window.open(a_str_windowURL, a_str_windowName, str_windowProperties)
    if (parseInt(navigator.appVersion) >= 4) {
      obj_window.window.focus();
    }
}

var fixAdFixed = false;
var fixAd = function () {
  if (fixAdFixed) return;
  try {//alert('fixing (was fixed? '+ fixAdFixed +')');
    var elObject = document.getElementById('main').getElementsByTagName('object')[0];
    if (elObject) {
      if (elObject.outerHTML) { // IE doesn't like replacing innerHTML, and gums up FlashVars with outerHTML
        if(elObject.data) {
          elObject.removeAttribute('data');
        }
        var strFlashVars, blnWmodePresent;
        var elsParam = elObject.getElementsByTagName("param");
        for (var xx=0, elParam=null; elParam = elsParam[xx]; xx++) {
          if(elParam.name.toLowerCase() == 'flashvars'){
            strFlashVars = elParam.value;
          }
          if(elParam.name.toLowerCase() == 'wmode'){
            blnWmodePresent = true;
          }
        }
        if (strFlashVars) {
          var strOuterHTML = elObject.outerHTML.replace(/<param[^>]*name="FlashVars"[^>]*>/ig, "<param name='FlashVars' value='" + strFlashVars + "'>");
        } else {
          var strOuterHTML = elObject.outerHTML;
        }
        if (blnWmodePresent) {
          strOuterHTML = strOuterHTML.replace(/<param[^>]*name="WMode"[^>]*>/ig, "<PARAM NAME='WMode' VALUE='Transparent'>");
        } else {
          strOuterHTML = strOuterHTML.replace(/<\/object>/i, '<PARAM NAME="WMode" VALUE="Transparent"><\/OBJECT>');
        }
        strOuterHTML = strOuterHTML.replace(/<embed[^>]+>/,'');
        elObject.outerHTML = strOuterHTML;
      } else {
        var newHTML = elObject.innerHTML;
        if (
            /param\s+name="wmode"\s+value="transparent"/i.test(newHTML)
          ||
            /param\s+value="transparent"\s+name="wmode"/i.test(newHTML)
        ) {
          fixAdFixed = true;
          return;  // our work is done here
        }
        newHTML = newHTML.replace(/(<embed.*?")(\s*\/?>)/i, '<param name="wmode" value="transparent"/>$1 wmode="transparent"$2');
        elObject.innerHTML = newHTML;
      }
    }
    fixAdFixed = true;
  } catch (err) {
    fixAdFixed = true;
  }
}
// no longer used, and interfering with video playback:
// domReady.add( function () {
//     var el = document.getElementById('navborder');
//     if (el) el.onmouseover = fixAd;
//   });



var adReport = {
  init : function () {
    var divs = document.getElementsByTagName('div');
    for (var x=0, div=null; div=divs[x]; x++) {
      if ( /\badmeta\b/.test(div.className) ) {
        var trg = div.getElementsByTagName('span');
        if (trg.length == 1) {
          adReport.addReportLink(trg[0], x);
        }
      }
    }
  },

  addReportLink : function (el, uniq) {
    if (el.parentNode.parentNode.id) {
      var host_id = el.parentNode.parentNode.id;
    } else {
      var host_id = 'ad_report_host_no'+ uniq;
      el.parentNode.parentNode.id = host_id;
    }
    var self_id = 'ad_report_self_no'+ uniq;
    el.innerHTML += ' &nbsp; | &nbsp; <a id="'+ self_id +'" href="javascript:/* report the ad */" onclick="adReport.submitReport(this, \''+ host_id +'\');">Report</a>';
  },


  submitReport : function (el, host_id) {
    var ad = document.getElementById(host_id);
    var currentHTML = ad.innerHTML;

    var pageLocation = [];
    var ad_ancestor = ad;
    while ( ad_ancestor = ad_ancestor.parentNode ) {
      pageLocation.push(ad_ancestor);
    }

    for (var node = 0; node<pageLocation.length; node++) {
      if (pageLocation[node].id) {
        pageLocation[node] = pageLocation[node].nodeName.toLowerCase() +'#'+ pageLocation[node].id;
      } else if (pageLocation[node].className) {
        pageLocation[node] = pageLocation[node].nodeName.toLowerCase() +'.'+ pageLocation[node].className.replace(/\s+/, '.');
      } else {
        pageLocation[node] = pageLocation[node].nodeName.toLowerCase();
      }
    }
    var comment = false;
    if (null !== (comment = prompt('Would you like to add a comment?\n\nPlease let us know what product the ad is for, and why you are reporting the ad.', ''))) {
      var msg = document.createElement('em');
      msg.innerHTML = 'reporting...';
      msg.id = el.id;
      el.parentNode.replaceChild(msg, el);

      var post_data = [];
      var post_obj = {
          page:location.href,
          client_time:new Date(),
          comment:comment,
          node_path:pageLocation.reverse().join(' > '),
          html:currentHTML
        };
      for (var key in post_obj) {
        post_data.push(key +'='+ escape(post_obj[key]));
      }
      var params = post_data.join('&');

      var request = null;
      try {
        request = new XMLHttpRequest();
      } catch (ex) {
        try {
          request = new ActiveXObject('Msxml2.XMLHTTP');
        } catch (ex) {
          try {
            request = new ActiveXObject('Microsoft.XMLHTTP');
          } catch (ex) {
            request = null;
          }
        }
      }

      if (request == null) return null;

      request.onreadystatechange = function (el, ad) {
        return function() {
          switch (request.readyState) {
            case 4:
              adReport.reportSuccess(el, ad);
              break;
          }
        };
      }(msg, ad);

      request.open("POST", '/api/report_ad', true);
      request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      request.setRequestHeader("Content-length", params.length);
      request.setRequestHeader("Connection", "close");
      request.send(params);
    } else {
      alert('OK. No report submitted.');
    }
  },

  reportSuccess : function (el, ad) {
    el.innerHTML = '<strong style="color:#c44;">Ad flagged.</strong>';
    window['timer'+ ad.id] = setInterval(
        function (ad) {
          var op = 240;
          return function () {
            op -= 4;
            if (op < 100) {
              ad.style.opacity = op / 100;
              ad.style.MozOpacity = op / 100;
              ad.style.KHTMLOpacity = op / 100;
              if (ad.filters && !ad.filters.alpha) // if this hasn't been declared yet as a style, it's not a filter object
                ad.style.filter += ' alpha(opacity='+ op +')'; // append to prevent overwriting previous filters
              if (ad.filters && ad.filters.length && ad.filters.alpha)
                ad.filters.alpha.opacity = op;
            }
            if (op <= 0) {
              ad.style.visibility = 'hidden';
              clearInterval(window['timer'+ ad.id]);
            }
          }
        }(ad),
        10
      );
  },

  complete : true
}
domReady.add(adReport.init);


var bugReport = {
  submitReport : function ( name, msg ) {
    var submitter = name ? name : 'unknown-submission';
    var error_message = msg ? msg : '';
    var form_data = [];
    var apparent_session_id = '';
    var apparent_formstate = '';
    var form_data = [];
    for (var i=0, form; form = document.forms[i]; i++) {
      var form_hash = {};
      for (var x=0, el; el = form.elements[x]; x++) {
        if (! el.name) continue;
        switch (el.type) {
          case 'text' :
          case 'password' :
          case 'textarea' :
          case 'hidden' :
            form_hash[el.name] = el.value;
            break;

          case 'radio' :
          case 'checkbox' :
            if (el.checked) {
              form_hash[el.name] = el.value;
            }
            break;

          case 'select' :
            form_hash[el.name] = el.options[el.selectedIndex].value;
        }
      }
      form_hash.action = form.action;

      form_hash_array = [];
      for (var prop in form_hash) {
        form_hash_array.push('"'+ prop.replace('"', '\\"') +'":"'+ form_hash[prop].replace('"', '\\"') +'"');
      }
      form_data.push('{'+ form_hash_array.join(',') +'}');
      if (form.elements['Qform__FormState']) apparent_formstate = form.elements['Qform__FormState'].value;
    }

    try {
      var parent_same_domain = (parent.document.location) ? true : false;
    } catch (ex) {
      var parent_same_domain = false;
    }

    bugReport.postReport({
        submitter:submitter,
        error_message:error_message,
        page:location.href,
        client_time:(new Date()).toUTCString(),
        html:document.getElementsByTagName('html')[0].innerHTML,
        cookies:document.cookie,
        forms:'['+ form_data.join(',') +']',
        self_is_top:(self == top),
        parent_same_domain:parent_same_domain,
        apparent_session_id:apparent_session_id,
        apparent_formstate:apparent_formstate
      });
  },

  postReport : function ( post_obj ) {
    var request = null;
    try {
      request = new XMLHttpRequest();
    } catch (ex) {
      try {
        request = new ActiveXObject('Msxml2.XMLHTTP');
      } catch (ex) {
        try {
          request = new ActiveXObject('Microsoft.XMLHTTP');
        } catch (ex) {
          request = null;
        }
      }
    }

    if (request == null) return null;

    var post_data = [];
    for (var key in post_obj) {
      post_data.push(key +'='+ escape(post_obj[key]));
    }
    var params = post_data.join('&');

// use for debugging:
//       request.onreadystatechange = function() {
//           switch (request.readyState) {
//             case 4:
//               alert(request.responseText);
//               break;
//           }
//         };

    request.open("POST", '/api/remote_error_logger', true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("Content-length", params.length);
    request.setRequestHeader("Connection", "close");
    request.send(params);
  },

  complete : true
}

function AttachEvent(obj,evt,fnc,useCapture){
	if (!useCapture) useCapture=false;
	if (obj.addEventListener){
		obj.addEventListener(evt,fnc,useCapture);
		return true;
	} else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
	else{
		MyAttachEvent(obj,evt,fnc);
		obj['on'+evt]=function(){ MyFireEvent(obj,evt) };
	}
}