/**
 * Meteora
 * Script autoloader
 * ---
 * Written by José Carlos Nieto <xiam@astrata.com.mx>
 *
 * Copyright (c) 2007 Astrata Software S.A. de C.V.
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @author          José Carlo Nieto
 * @copyright       Copyright (c) 2007, Astrata Software S.A. de C.V.
 * @link            http://astrata.com.mx Astrata Open Source Projects
 * @version         $Revision: $
 * @modifiedby      $LastChangedBy: $
 * @lastmodified    $Date: $
 * @license         http://www.opensource.org/licenses/mit-license.php The MIT License
 *
 */

/**
 * Credits:
 *  Meteora is based on MooTools
 *
 * License:
 *  MIT-style license.
 *
 * MooTools Copyright:
 *  copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
*/

/**
 * Dependency list
 * */
var deps = {
  'Core': {
    'Core': {
      'deps': ['Core']
    },
    'Meteora': {
      'deps': ['Core', 'Element.Event', 'Remote.Ajax', 'Window.Domready']
    },
    'Jsonrpc': {
      'deps': ['Core', 'Core.Meteora', 'Fx.Scroll', 'Control.Bubble']
    }
  },
  'Class': {
    'Class': {
      'deps': ['Core']
    },
    'Extras': {
      'deps': ['Core', 'Class.Class', 'Array', 'Function']
    }
  },
  'Native': {
    'Array': {
      'deps': ['Core']
    },
    'String': {
      'deps': ['Core']
    },
    'Function': {
      'deps': ['Core']
    },
    'Number': {
      'deps': ['Core']
    },
    'Element': {
      'deps': ['Array', 'String', 'Function', 'Number', 'Class.Class']
    }
  },
  'Element': {
    'Event': {
      'deps': ['Element']
    },
    'Filters': {
      'deps': ['Element']
    },
    'Selectors': {
      'deps': ['Element.Filters']
    },
    'Form': {
      'deps': ['Element']
    },
    'Dimensions': {
      'deps': ['Element']
    }
  },
  'Window': {
    'Domready': {
      'deps': ['Element.Event']
    },
    'Size': {
      'deps': ['Element']
    }
  },
  'Fx': {
    'Base': {
      'deps': ['Class.Extras', 'Element']
    },
    'CSS': {
      'deps': ['Fx.Base']
    },
    'Style': {
      'deps': ['Fx.CSS']
    },
    'Styles': {
      'deps': ['Fx.CSS']
    },
    'Elements': {
      'deps': ['Fx.CSS']
    },
    'Scroll': {
      'deps': ['Fx.Base', 'Element.Event', 'Element.Dimensions', 'Window.Size']
    },
    'Slide': {
      'deps': ['Fx.Base']
    },
    'Transitions': {
      'deps': ['Fx.Base']
    },
    'Visual': {
      'deps': ['Fx.Base', 'Fx.Styles', 'Fx.Slide', 'Fx.Transitions', 'Element.Dimensions']
    }
  },
  'Drag': {
    'Base': {
      'deps': ['Class.Extras', 'Element.Event']
    },
    'Move': {
      'deps': ['Drag.Base', 'Element.Dimensions']
    }
  },
  'Remote': {
    'XHR': {
      'deps': ['Class.Extras', 'String']
    },
    'Ajax': {
      'deps': ['Remote.XHR', 'Element.Form']
    },
    'Cookie': {
      'deps': ['Core', 'Array', 'String', 'Function', 'Number']
    },
    'Json': {
      'deps': ['Core', 'Array', 'String', 'Function', 'Number']
    },
    'Remote': {
      'deps': ['Remote.XHR', 'Json']
    },
    'Assets': {
      'deps': ['Element.Event']
    }
  },
  'Plugin': {
    'Hash': {
      'deps': ['Element']
    },
    'Hash.Cookie': {
      'deps': ['Hash', 'Cookie', 'Json']
    },
    'Color': {
      'deps': ['Element']
    },
    'Scroller': {
      'deps': ['Class.Extras', 'Element.Event', 'Element.Dimensions']
    },
    'Slider': {
      'deps': ['Drag.Base', 'Element.Dimensions']
    },
    'SmoothScroll': {
      'deps': ['Fx.Scroll']
    },
    'Sortables': {
      'deps': ['Class.Extras', 'Element.Event', 'Element.Dimensions']
    },
    'Tips': {
      'deps': ['Class.Extras', 'Element.Event', 'Window.Size']
    },
    'Group': {
      'deps': ['Class.Extras', 'Element']
    },
    'Accordion': {
      'deps': ['Fx.Elements', 'Element.Event']
    }
  },
  'Control': {
    'Bubble': {
      'deps': ['Core.Meteora', 'Element.Dimensions']
    },
    'Calendar': {
      'deps': ['Core.Meteora', 'Control.Dialog', 'Control.Spinbutton']
    },
    'Toolbox': {
      'deps': ['Core.Meteora', 'Drag.Move']
    },
    'Spinbutton': {
      'deps': ['Core.Meteora']
    },
    'Autocomplete': {
      'deps': ['Core.Meteora', 'Control.Toolbox', 'Element.Dimensions']
    },
    'Datagrid': {
      'deps': ['Core.Meteora', 'Control.Tablesort']
    },
    'Dialog': {
      'deps': ['Core.Meteora', 'Drag.Move' ]
    },
    'Editor': {
      'deps': ['Core.Meteora', 'Control.Notebook', 'Window.Size', 'Control.Dialog']
    },
    'Notebook': {
      'deps': ['Core.Meteora', 'Fx.Scroll']
    },
    'Form': {
      'deps': ['Core.Meteora', 'Core.Jsonrpc', 'Control.Bubble']
    },
    'Menu': {
      'deps': ['Core.Meteora']
    },
    'Searchlist': {
      'deps': ['Core.Meteora']
    },
    'Dock': {
      'deps': ['Core.Meteora']
    },
    'Selection': {
      'deps': ['Core.Meteora', 'Drag.Move']
    },
    'Picbox': {
      'deps': ['Core.Meteora', 'Control.Dialog', 'Fx.Visual']
    },
    'Popup': {
      'deps': ['Core.Meteora', 'Control.Dialog', 'Control.Dock']
    },
    'Panel': {
      'deps': ['Core.Meteora']
    },
    'Filebrowser': {
      'deps': ['Core.Meteora']
    },
    'Tablesort': {
      'deps': ['Core.Meteora']
    },
    'Treeview': {
      'deps': ['Core.Meteora']
    }
  }
}

// Meteora's webroot
var $root = null;

var scripts = document.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
  if (scripts[i].src.match(/.*meteora.js$/)) {
    var $root = scripts[i].src.replace(/meteora\.js/, '');
  }
}

// Media directory
var $mediaDir = $root+'/media/';

// CSS directory
var $cssDir = $root+'/css/';

// Libraries directory
var $libDir = $root+'/lib/';

document.__scripts = {};

/**
 * Loads a library and all its dependencies. Useful only the first time it's called.
 * @author xiam
 * @param name Library name.
 * */
var $lib = function(name, resolve) {

 
  var load = [];

  if (name.match(/\./) == null) {
    if (name == 'Core') {
      name = 'Core.Core';
    } else {
      name = 'Native.'+name;
    }
  }

  if (typeof document.__scripts[name] == 'undefined') {
    var path = name.split('.');

    var script = deps[path[0]][path[1]];
    if (script) {
      document.__scripts[name] = true;
      for (var i = 0; i < script['deps'].length; i++) {
        var dep = script['deps'][i];
        if (typeof document.__scripts[dep] == 'undefined') {
          var depends = $lib(dep, true);
          for (var j = 0; j < depends.length; j++) {
            load.push(depends[j]);
          }
        }
      }
      var name = path[0]+'.'+path[1];
      load.push(name);
    }
  }

  if (resolve == true) {
    return load;
  } else {
    if (document.jscompressor) {
      load = load.join(',');
      if (load) {
        document.write('<script type="text/javascript" src="'+document.jscompressor+'?src='+load+'"></script>');
      }
    } else {
      for (var i = 0; i < load.length; i++) {
        document.write('<script type="text/javascript" src="'+$libDir+load[i].replace('.', '/')+'.js"></script>');
      }
    }
  }
}

$lib('Core.Meteora');

