text: /*
   * October General Utilities
   */
  
  /*
   * Path helpers
   */
  
  function backendUrl(url) {
      if (typeof backendBasePath === 'undefined' || !backendBasePath)
          return url;
  
      if (url.substr(0,1) == '/')
          url = url.substr(1);
  
      return backendBasePath + url;
  }
  
  /*
   * Lock Manager
   */
  
  LockManager = function() {
  
      var o = {
          locks: {},
  
          set: function(name) {
              o.locks[name] = true;
          },
          
          get: function(name) {
              return (o.locks[name]);
          },
  
          remove: function(name) {
              o.locks[name] = null;
          }
      };
  
      return o;
  };
  
  lockManager = new LockManager();
  
  /*
   * Asset Manager
   *
   * Usage: assetManager.load({ css:[], js:[], img:[] }, onLoadedCallback)
   */
  
  AssetManager = function() {
  
      var o = {
  
          load: function(collection, callback) {
              var jsList = (collection.js) ? collection.js : [],
                  cssList = (collection.css) ? collection.css : [],
                  imgList = (collection.img) ? collection.img : []
  
              jsList = $.grep(jsList, function(item){
                  return $('head script[src="'+item+'"]').length == 0
              })
  
              cssList = $.grep(cssList, function(item){
                  return $('head link[href="'+item+'"]').length == 0
              })
  
              var cssCounter = 0,
                  jsLoaded = false,
                  imgLoaded = false
  
              if (jsList.length === 0 && cssList.length === 0 && imgList.length === 0) {
                  callback && callback()
                  return
              }
              
              o.loadJavaScript(jsList, function(){
                  jsLoaded = true
                  checkLoaded()
              })
  
              $.each(cssList, function(index, source){
                  o.loadStyleSheet(source, function(){
                      cssCounter++
                      checkLoaded()
                  })
              })
  
              o.loadImage(imgList, function(){
                  imgLoaded = true
                  checkLoaded()
              })
  
              function checkLoaded() {
                  if (!imgLoaded)
                      return false
  
                  if (!jsLoaded)
                      return false
  
                  if (cssCounter < cssList.length) 
                      return false
  
                  callback && callback()
              }
          },
  
          /*
           * Loads StyleSheet files
           */
          loadStyleSheet: function(source, callback) {
              var cssElement = document.createElement('link')
  
              cssElement.setAttribute('rel', 'stylesheet')
              cssElement.setAttribute('type', 'text/css')
              cssElement.setAttribute('href', source)
              cssElement.addEventListener('load', callback, false)
  
              if (typeof cssElement != 'undefined') {
                  document.getElementsByTagName('head')[0].appendChild(cssElement)
              }
  
              return cssElement
          },
  
          /*
           * Loads JavaScript files in sequence
           */
          loadJavaScript: function(sources, callback) {
              if (sources.length <= 0)
                  return callback()
  
              var source = sources.shift(),
                  jsElement = document.createElement('script');
  
              jsElement.setAttribute('type', 'text/javascript')
              jsElement.setAttribute('src', source)
              jsElement.addEventListener('load', function() {
                  o.loadJavaScript(sources, callback)
              }, false)
  
              if (typeof jsElement != 'undefined') {
                  document.getElementsByTagName('head')[0].appendChild(jsElement)
              }
          },
  
          /*
           * Loads Image files
           */
          loadImage: function(sources, callback) {
              if (sources.length <= 0)
                  return callback()
  
              var loaded = 0
              $.each(sources, function(index, source){
                  var img = new Image()
                  img.onload = function() {
                      if (++loaded == sources.length && callback)
                          callback()
                  }
                  img.src = source
              })
          }
  
      };
  
      return o;
  };
  
  assetManager = new AssetManager();
  
  /*
   * Inverse Click Event
   *
   * Calls the handler function if the user has clicked outside the object 
   * and not on any of the elements in the exception list.
   */
  
   $.fn.extend({
      clickOutside: function(handler, exceptions) {
          var $this = this;
  
          $('body').on('click', function(event) {
              if (exceptions && $.inArray(event.target, exceptions) > -1) {
                  return;
              } else if ($.contains($this[0], event.target)) {
                  return;
              } else {
                  handler(event, $this);
              }
          });
  
          return this;
      }
  })
  