/*
 * JS script include, with callback functionality
 */
function include_script(src, callback) {
  var script = document.createElement("script");

  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = src;
  if (callback) {
    script.onload = callback;
    script.onreadystatechange = function () {
      if (this.readyState == "complete" || this.readyState == "loaded") {
        this.onload();
        this.onload = this.onreadystatechange = null;
      }
    };
  }
  document.getElementsByTagName("head")[0].appendChild(script);
} 

/*
 * Onload queue helper, first one uses setTimeout to allow browser rendering
 */
  function OnloadExecute() {
    if (!window.onload_queue || window.onload_queue.length == 0)
      return;

    for (var i = 0; i < window.onload_queue.length; i++) {
      window.onload_queue[i]();
    }
  } 
function Onload(func, highprio) {
  if (typeof(func) != 'function')
    return;

  if (!window.onload_queue_set) {
    window.onload_queue_set = true;
    var oldonload = window.onload;

    window.onload = function () {
      if (oldonload)
        oldonload();

      setTimeout(OnloadExecute, 10);
    };
  }

  if (!window.onload_queue)
    window.onload_queue = [];

  if (highprio)
    window.onload_queue.unshift(func);
  else
    window.onload_queue[window.onload_queue.length] = func;
}
