Element.fromHTML = function(html) {
  return new Element('div').update(html).down();
};

Element.addMethods({
  insertInOrder: function(container, element_to_insert, selector) {
    var needToInsert = true;
    
    container.childElements().each(function(element) {
      var element_text_node = selector ? element.down(selector) : element;
      if(element_text_node && needToInsert) {
        var element_text = element_text_node.innerHTML.unescapeHTML().toLowerCase();
        var element_to_insert_text_node = selector ? element_to_insert.down(selector) : element_to_insert;
        var element_to_insert_text = element_to_insert_text_node.innerHTML.unescapeHTML().toLowerCase();
        if(element_text > element_to_insert_text) {
          element.insert({before: element_to_insert});
          needToInsert = false;
          throw $break;
        }
      }
    });

    if(needToInsert) {
      container.insert({top: element_to_insert});
    }
  },

  reInsertInOrder: function(element_to_insert, selector) {
    element_to_insert.up().insertInOrder(element_to_insert, selector);
  },

  observeExclusively: function(element, eventName, handler) {
    Event.observe(element, eventName, handler.wrap(function(proceed, event) {
      event.stop();
      return proceed();
    }));
  },
  
  request: function(element, options) {
    if(!element.match("[href]")) { return false; }
    
    element = $(element);
    options = Object.extend({ method: "get" }, options);

    var action = element.readAttribute('href') || '';
    if (action.blank()) action = window.location.href;

    return new Ajax.Request(action, options);
  },

  baseUrl: function(element) {
    return element.readAttribute('href').replace(/(\?|#).*$/g, '');
  }
});

Object.extend(Function.prototype, {
  bindAsJSONResponse: function(object) {
    return this.bind(object).wrap(function(proceed, request) {
      var data = request.responseJSON;
      return proceed(data);
    }.bind(this))
  }
});