//CMS admin Javascript classes with loading on demand - bootstrap.js
Bulldog = { 
   Version: "0.5"
}

Bulldog.System = {
   m_included: {},
   //initialize Bulldog
   init: function() {
      Bulldog.Errors.setHandler(Bulldog.Errors._default);
      if((typeof Prototype == 'undefined') || 
         (typeof Element == 'undefined') || 
         (typeof Element.Methods == 'undefined') || 
         parseFloat(Prototype.Version.split(".")[0] + "." +
                    Prototype.Version.split(".")[1]) < 1.5)
         throw("Bulldog System Requires Prototype >= 1.5 to be installed.");
      if((typeof LowPro == 'undefined') || 
         parseFloat(LowPro.Version.split(".")[0] + "." +
                    LowPro.Version.split(".")[1]) < 0.5)
         throw("Bulldog System Requires LowPro >= 0.5 to be installed.");
      Ajax.Responders.register({
         onException: function(request, exception) {
            alert(exception);
         }
      });
   },
   //add external CSS stylesheet dynamically
   css: function(sheet) {
      var head = document.getElementsByTagName('head')[0];
      if(Object.isElement(sheet) && sheet.tagName.toLowerCase() == 'link')
         stylesheet = sheet;
      else
         stylesheet = $link({rel: 'stylesheet', type: 'text/css', href: sheet});
      $(head).insert(stylesheet);
      return stylesheet;
   },
   //Javascript dynamic ajax loading
   require: function(module) {  
      if(this.m_included[module] == true)
         return;
      this.m_included[module] = true;
      new Ajax.Request(module,{onSuccess: this._include.bind(this), onFailure: this._fail.bind(this, module), method: 'get', asynchronous: false})
   },
   _include: function(xhr) {
      var text = xhr.responseText;
      if(window.execScript) {
         window.execScript(text);
      } else {
         try {
            eval.call(window, text)
         } catch(e) {
            throw new Bulldog.Errors.Exception("Script Load Error");
         }
      }
      for(i = 0; i < 1000; i++) {}
      return true;
   },
   _fail: function(module) {
      this.m_included[module] = false;
      throw new Bulldog.Errors.Exception('Failed to Load: '+module);
   }
};

Bulldog.Errors = {
   setHandler: function(handler) {
      if(typeof(handler) == 'function')
         window.onerror = handler;
   },
   _default: function(exception, file, line) {
      if(exception == "Error loading script") //ignore firefox error loading script errors
         return false;
      alert(exception);
      return true;
   },
   Exception: Class.create({
      initialize: function(message) {
         this.message = message;
         this.name = "Exception";
      },
      toString: function() {
         return this.name+": "+this.message;
      }
   })
};

Bulldog.Resources = {
   CSS: 1,
   IMAGE: 2,
   XML: 3,
   Loader: lazyLoader('Bulldog.Resources.Loader')
}

Bulldog.Behaviours = {
   TabControl: lazyLoader('Bulldog.Behaviours.TabControl'),
   TreeGrid: lazyLoader('Bulldog.Behaviours.TreeGrid'),
   History: lazyLoader('Bulldog.Behaviours.History'),
   Editor: lazyLoader('Bulldog.Behaviours.Editor'),
   DatePicker: lazyLoader('Bulldog.Behaviours.DatePicker'),
   UploadForm: lazyLoader('Bulldog.Behaviours.UploadForm'),
   ValidatedForm: lazyLoader('Bulldog.Behaviours.ValidatedForm'),
   ProductWidget: lazyLoader('Bulldog.Behaviours.ProductWidget'),
   PaymentWidget: lazyLoader('Bulldog.Behaviours.PaymentWidget'),
   EditInPlace: lazyLoader('Bulldog.Behaviours.EditInPlace'),
   Confirm: lazyLoader('Bulldog.Behaviours.Confirm'),
   ListSwap: lazyLoader('Bulldog.Behaviours.ListSwap'),
	TableSorting: lazyLoader('Bulldog.Behaviours.TableSorting')
}

Bulldog.Utility = {
   MD5: lazyLoader('Bulldog.Utility.MD5')
}

function lazyLoader(namespace) {
   namespace = namespace.split('.');
   return function() {
      Bulldog.System.require('/javascripts/'+namespace.join('/').toLowerCase()+'.js');
      var klass = window;
      $A(namespace).each(function(ns) {
         klass = klass[ns];
      });
      if(arguments.callee == klass) {
         throw 'error loading klass: '+namespace.join('.');
      } else {
         if(this == window || $H(this).values().include(klass)) {
            return klass.apply(this, arguments);
         } else {
            Object.extend(this, klass.prototype);
            klass.apply(this, arguments);
            return this;
         }
      }
   }
}

Bulldog.System.init();

Event.addBehavior({
      'ul#tab_control': Bulldog.Behaviours.TabControl(),
      'form.validated_form': Bulldog.Behaviours.ValidatedForm(),
      'form.validated_form .quantity': Bulldog.Behaviours.ProductWidget(),
      'form.validated_form #payment_method': Bulldog.Behaviours.PaymentWidget()
});


