Ajaxer = {
  /**
   * Функция для аякса всего
   * 
   * @param url - урл для запроса (функция вида function (a) {return a;} или текст), по умолчанию null
   * @param container - контейнер, который будет заменен полученным html, по умолчанию null
   * @param placeholder - элемент, на который будет повешено событие, по умолчанию null
   * @param data - данные для аякса. статичны для каждого инита, по умолчанию {}
   * @param callback - функция, которая будет вызвана с полученными данными, по умолчанию null
   * @param datatype - параметр dataType метода $.ajax, по умолчанию 'html'
   * @param event - событие, по которому будет происходить запрос, по умолчанию 'click'
   * @param trigger_after - событие, которое будет вызвано после окончания отработки аяксера, по умолчанию 'ajaxer_after'
   * @param trigger_before - событие, которое будет вызвано в начале отработки аяксера, по умолчанию 'ajaxer_before'
   * @param method - метод вставки хтмл в документ. по умолчанию 'replace'
   * 
   * @example Ajaxer.init({url: '/some_url', container: '#ajax-content', placeholder: 'a.some-link'});
   */
  init: function (in_params) {
    var default_params = {
      url: null,
      container: null,
      placeholder: null,
      data: {},
      callback: null,
      datatype: 'html',
      event: 'click',
      trigger_after: 'ajaxer_after',
      trigger_before: 'ajaxer_before',
      method: 'replace'
    };

    var params = $.extend(default_params, in_params); 
    if (params.placeholder == null || params.url == null) return false;
    if ($(params.placeholder).length) {
      $(params.placeholder).each(function () {
        var link = this;
        $(link).unbind(params.event);
        $(link).bind(params.event, function () {
          Ajaxer.trigger_many(params.trigger_before);
          if ($.isFunction(params.url)) var url = params.url($(link));else var url = params.url;
            $.ajax({url: url, cache: false, async: false, data: params.data, dataType: params.datatype, success: function (reply) {
            if (params.callback == null) {
              if (params.container == null) return false; else {
                switch (params.method) {
                  case 'replace':
                    $(params.container).replaceWith(reply);
                    break;
                  case 'append':
                    $(params.container).empty();
                    $(params.container).append(reply);
                }
              }
            } else {
              params.callback(reply);
            }
            Ajaxer.trigger_many(params.trigger_after);
          }});
          return false;
        });        
      });
    }
  },

  trigger_many: function (events) {
    events = events.split(',');
    for (var i = 0;i < events.length;i++) {
      $(document).trigger(events[i]);
    }
  }
}
