


window.springpad = window.springpad || {};
window.com_springpadit = window.com_springpadit || {};
if(!com_springpadit.loader){
  com_springpadit.loader = function(){ return this.init(); };
  com_springpadit.loader.prototype = {
    'host': 'spqa2.springpadapp.com',
    'modules': {
      'util':{'versions':{'1.0':{'file':'util.js'}},
              'aliases':{'latest':'1.0','1':'1.0'}
              },
      'browser':{'versions':{'1.0':{'file':'browser.js'}},
              'aliases':{'latest':'1.0','1':'1.0'}
              },
      'drag':{'versions':{'1.0':{'file':'drag.js','dependencies':{'util':{'version':'1.0'},'browser':{'version':'1.0'}}}},
              'aliases':{'latest':'1.0','1':'1.0'}
              },
      'springit': { 'versions':{
                      '2.1':{'file':'springit.js','dependencies':{'util':{'version':'1.0'},'browser':{'version':'1.0'},'drag':{'version':'1.0'}}}
                    },
                    'aliases':{'latest':'2.1','2':'2.1','2.0':'2.1'}
                  },
      'clipper': { 'versions':{
                      '2.1':{'file':'clipper.js','dependencies':{'util':{'version':'1.0'},'browser':{'version':'1.0'},'drag':{'version':'1.0'}}}
                    },
                    'aliases':{'latest':'2.1','2':'2.1'}
                  }
    },
    'callbackCounter':0,
    'init': function(){ return this; },
    'load': function(module, version, options){
      var m,v,mv,d,_this;
      options = options || {};
      if(this.modules[module]){
        m = this.modules[module];
        v = !version ? m.aliases['latest'] : (m.versions[version] ? version : (m.aliases[version] ? m.aliases[version] : m.aliases['latest']));
        mv = m.versions[v];
        if(options.callback && typeof(options.callback) == 'function'){
          mv.callback = options.callback;
        }
        for(d in mv.dependencies){
          this.load(d,mv.dependencies[d].version);
        }
        if(!mv.loaded && !mv.loading){
          mv.loading = true;
          _this = this;
          this.inject('http://'+this.host+'/public/loader/'+module+'/'+v+'/'+mv.file, function(){ mv.loaded = true; mv.loading = false; _this.checkDependencies(mv);});
        }else if(mv.loaded && mv.callback){
          mv.callback();
        }
      }
      return true;
    },
    'notReady':[],
    'checkDependencies': function(mv){
      var d, ready = true;
      if(mv.dependencies){
        ready = true;
        for(d in mv.dependencies){
          if(ready && !this.modules[d].versions[mv.dependencies[d].version].loaded){
            ready = false;
            break;
          }
        }
      }
      if(!ready && this.arrayIndexOf(this.notReady, mv) == -1){
        this.notReady.push(mv);
      }else if(ready){
        if(this.arrayIndexOf(this.notReady, mv) !== -1){
          this.arraySplice(this.notReady,this.arrayIndexOf(this.notReady, mv),1);
        }
        if(mv.callback){ mv.callback(); }
        mv.callback = null;
      }
      if(this.notReady.length > 0){
        for(n in this.notReady){
          if(this.notReady[n] != mv){
            this.checkDependencies(this.notReady[n]);
          }
        }
      }
    },
    'inject': function(url, onload){
      var script = document.createElement('script');
      script.type = 'text/javascript';
      script.src = url;
      this.addEvent(script,'load',onload);
      document.getElementsByTagName('head')[0].appendChild(script);
    },
    'arrayIndexOf': function(arr, obj){
      if(typeof(arr.indexOf) == 'function'){
        return arr.indexOf(obj);
      }else{
        for(var i = 0, l = arr.length; i < l; i++){
          if(arr[i] == obj){
            return i;
          }
        }
        return -1;
      }
    },
    'arraySplice':function(arr, start, len) {
      if(typeof(arr.splice) == 'function'){
        return arr.splice(start, len);
      }else{
        var aInsert = new Array(), i;
        if(!len || len < 0) len = 0;
        if(arguments.length > 3) {
          for(i = 2; i < arguments.length; i++) {
            aInsert.push(arguments[i]);
          }
        }
        var aHead = this.subarray(arr, 0, iStart);
        var aDelete = this.subarr(arr, iStart, iLength);
        var aTail = this.subarray(arr, iStart + iLength);

        var aNew = aHead.concat(aInsert, aTail);

        // Rebuild yourself
        arr.length = 0;
        for(var i=0; i < aNew.length; i++) {
          arr.push(aNew[i]);
        }
        return aDelete;
      }
    },
    'subArray':function(arr, indexA, indexB ) {
      if(indexA < 0) indexA = 0;
      if(indexB == null || indexB > arr.length) indexB = arr.length;
      if(indexA == indexB) return [];
      var aReturn = new Array();
      for(var i=indexA; i<indexB; i++) {
        aReturn.push(arr[i]);
      }
      return aReturn;
    },
    addEvent: function(el,event,fn){
      if (el.addEventListener) el.addEventListener(event, fn, false);
      else if (window.attachEvent) el.attachEvent('on' + event, fn);
      else el['on'+event] = fn;
      if(event == 'load'){
        this.addEvent(el,'readystatechange',function(){
          if (el.readyState == 'loaded' || el.readyState == 'complete') fn();
        });
      }
    }
  };
  window.springpad.loader = new com_springpadit.loader();
  window.springpad.load = function(){ window.springpad.loader.load.apply(window.springpad.loader, arguments); }
}

springpad.loader['callback'+springpad.loader.callbackCounter] = function(){
  window.springpad.springit = new com_springpadit.springit(typeof(SPRING_OPTIONS) !== 'undefined' ? SPRING_OPTIONS : null);
}

springpad.load('springit', null, {'callback':springpad.loader['callback'+springpad.loader.callbackCounter]});

springpad.loader.callbackCounter += 1;
