var Controller = Class.create({
  //Параметры url - url на который шлётся запрос
  //container - html элемент, в который записывается результат запроса
  
	//params - это объект-"прототип", хранящий разделяемы наследниками данными. Класс наследуется через prototype'овский Class.create
	initialize: function(params) {
      this.params = params;
	  this.ajax_params = $H(); //объект, хранящий параметры, которые будут переданы с запросом по update()
	  this.is_busy = false;
	  this.defered = $A(); //массив "отложенных" на исполнение объектов-методов вида {method: f, param1: arg1, param2: arg2}
  },
  
  //обновление/установка параметров, которые должны быть переданы на сервер в ajax-запросе
  setParams: function(params) {
  	  this.ajax_params.update(params); //обновление параметров 
	  return this;
  },
  
  //Запрос на сервер. Результат передается ф-ии _onUpdate
  update: function() {
  	  this.is_busy = true;
      request(this.params.url, this.ajax_params, this._onUpdate.bind(this));
  },
  
  //Базовая ф-ия onUpdate - действия после получения запроса
  _onUpdate: function(transport) {
      this.params.container.update(transport.responseText); //обновляем контейнер, переданный в параметрах, контентом из ответа с сервера
	  this.prepareHTML(); //навешиваем все, что можем навесить на контроллер
	  this.is_busy = false; //делаем контроллер доступным для дальнейшей работы

	  //смотрим, какие функции поступили на очередь на выполнение через defer, и вызываем их (ф-ии вида f(x,y))
	  for (var i=0; i<this.defered.length; i++) {
	  	this.defered[i].method(this.defered[i].param1, this.defered[i].param2);
	  }
	  
	  this.defered.clear();	  //очищаем список функций на ожидание
	  
	  //вызываем "виртуальную" ф-ию, которую переопределили "потомки" - реальные контроллеры 
	  this.onUpdate();	  
  },
  
  //метод позволяет поместить ф-ию вида f(x,y) в очередь на выполнение, чтобы она выполнилась после запроса на сервер 
  //помещает, только если запрос еще шлется, и возвращает false. Если не шлется, то не помещает, и возвращает true 
  defer: function(method, param1, param2) {
  	 if (this.is_busy) {
	   this.defered.push({'method': method, 'param1': param1, 'param2': param2});
	   return false;
	 }
	 else {
	 	return true;
	 }
  },
  
  //"Виртуальная" ф-ия - навешивание js на полученный с сервера html
  prepareHTML: function() {
  	  
  },
  
  //"Виртуальная ф-ия - действия наследника после завершения запроса
  onUpdate: function() {
  	
  }
});
