function findJSPath(jsFile){
  var getBase, n, nl, res, i, re = new RegExp(jsFile+'(|_dev|_src|_jquery).js');
  getBase = function (re, n) {
    if (n.src && re.test(n.src)) return n.src.substring(0, n.src.lastIndexOf('/')+1);
    return false;
  };
  nl = document.getElementsByTagName('script');
  for (i=0; i<nl.length; i++) {
    res = getBase(re, nl[i]);
    if(res) return res;
  }
  n = document.getElementsByTagName('head')[0];
  if (n) {
    nl = n.getElementsByTagName('script');
    for (i=0; i<nl.length; i++) {
      res = getBase(re, nl[i]);
      if(res) return res;
    }
  }
}

function getJSArgs(jsFile){
  var processArgs, n, nl, res, i, re = new RegExp(jsFile+'(|_dev|_src|_jquery).js');
  processArgs = function(re, n){
    var args, i, tmp, params = new Object();
    if (n.src && re.test(n.src)){
      args = n.src.slice(n.src.indexOf('?')+1);
      args = args.split('&');
      for(i = 0; i<args.length; i++){
        tmp = args[i].split('=');
        if (!tmp||tmp.length!= 2) continue;
        params[unescape(tmp[0])] = unescape(tmp[1]).replace(/\+/g, ' ');
      }
      return params;
    }
    return false;
  };
  nl = document.getElementsByTagName('script');
  for (i=0; i<nl.length; i++) {
    res = processArgs(re, nl[i]);
    if(res) return res;
  }
  n = document.getElementsByTagName('head')[0];
  if (n) {
    nl = n.getElementsByTagName('script');
    for (i=0; i<nl.length; i++) {
      res = processArgs(re, nl[i]);
      if(res) return res;
    }
  }
}
    
var include = (function () {
  var include = function (src) {
    if(include._loaded!==true) return include.addauto(src);
    return include.doinclude(src);
  };
  include._loaded = false;
  include.registry = [];
  include.toload = [];
  include.listeners= [];
  include.css = function(file){
    var head = document.getElementsByTagName('head')[0],
        f    = document.createElement("link");
    f.setAttribute("rel", "stylesheet");
    f.setAttribute("type", "text/css");
    f.setAttribute("href", file);
    head.appendChild(f);
    return include;
  };
  include.registerListener = function(file, callback){
    include.listeners[include.listeners.length] = {file: file.toLowerCase(), callback: callback};
    if(include.loaded(file)&&(typeof(callback)==='function')) callback();
    else include(file);
    return include;
  };
  include.addauto = function(src){
    var i, reg;
    for (i = 0; reg = include.toload[i]; i++) {
      if (reg === src) return true;
    }
    include.toload.push(src);
    return true;
  };
  include.doinclude = function(src){
    if(!src) return false;
    if(include.loaded(src)) return false;
    var reg = null,
        head   = document.getElementsByTagName('head')[0],
        script = document.createElement("script");
    script.src  = src.match(/^\//) ? src : include.base + src;
    script.type = "text/javascript";
    script.language = "javascript";
    head.appendChild(script);
    include.registry.push(src.toLowerCase());
    script.onreadystatechange = function(){
      if(script.readyState === 'complete'||script.readyState === 'loaded') include.callListeners(src);
    };
    script.onload = function(){
      include.callListeners(src);
    };
    return script;
  };
  include.doautos = function(){
    var i, reg;
    for (i = 0; reg = include.toload[i]; i++) {
      include.doinclude(reg);
    }
  };
  include.getListeners = function(forFile, clearIfFound){
    var i, res = [];
    clearIfFound = clearIfFound?true:false;
    forFile = forFile.toLowerCase();
    for(i=0;i<include.listeners.length;i++){
      if((forFile===include.listeners[i].file)&&(typeof(include.listeners[i].callback)==='function')){
        res.push(include.listeners[i]);
        if(clearIfFound){
          include.listeners.splice(i, 1);
        }
      }
    }
    return res.length>0?res:false;
  };
  include.defferCallbacks=function(forFile){
    var callbacks = include.getListeners(forFile, true);
    if(callbacks) return (function(){
      if(callbacks) for(var i = 0; i<callbacks.length; i++){
        callbacks[i].callback();
      }
    });
    else return false;
  };
  include.callListeners = function(forFile){
    forFile = forFile.toLowerCase();
    for(var i=0;i<include.listeners.length;i++){
      if((forFile===include.listeners[i].file)&&(typeof(include.listeners[i].callback)==='function')) include.listeners[i].callback();
    }
  };
  include.loaded = function(file){
    var i, reg;
    file = file.toLowerCase();
    for (i = 0; reg = include.registry[i]; i++) {
      if (reg === file) return true;
    }
    return false;
  };
  include.base = findJSPath('support');
  return include;
}());

// addEvent and removeEvent from http://www.scottandrew.com/weblog/articles/cbs-events
function addEvent(obj, evType, fn){ 
  if(obj.addEventListener){
    obj.addEventListener(evType, fn, false); 
    return true;
  }else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn); 
    return r; 
  }else return false; 
}
function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  }else if (obj.detachEvent) return obj.detachEvent("on"+evType, fn);
  else return false;
}

addEvent(window, 'load', function(){
  include._loaded = true;
  include('exts.js');
  include.doautos();
});

