/*
 * Classe Controller
 */
function Controller(id) {
  this.id = id;
  this.items = new Array();
}

Controller.ajaxItemMap 
  = {"visible" : "ApecAjaxVisibleClass", "attribute" : "ApecAjaxAttributeValueClass"};

Controller.prototype.getXmlForAction = function(action) {
  var xml = '<dialogcontroller id="' + this.id + '" action="' + action + '">';
  for(var i = 0; i < this.items.length; ++i) {
    xml += this.items[i].toXml();
  }
  xml += '</dialogcontroller>';
  return xml;
}


Controller.prototype.sendActionRequest = function(action) {
var caller = this;
new Ajax.Request("/ajax", {
  method: 'post',
  parameters: 'xmlRequest=' + caller.encodeApecAjaxXmlRequest(action),
  onSuccess: function (resp) {
    caller.updateModel(resp);
    caller.refreshView();
  }
});

/*  var caller = this;
  var req = new Ajax.Request('/ajax', {
    method:'post',
    parameters: 'xmlRequest=' + this.encodeApecAjaxXmlRequest(action),
    onComplete: function (resp) {
      caller.updateModel(resp);
      caller.refreshView();
    }
  };*/
}


Controller.prototype.encodeApecAjaxXmlRequest = function(action) {
  var ajaxXmlRequest = '<?xml version="1.0" encoding="utf-8"?>' + this.getXmlForAction(action);
  var encodedAjaxXmlRequest = encodeURIComponent(ajaxXmlRequest);
  return encodedAjaxXmlRequest;
}

Controller.prototype.updateModel = function(response) {

  if(navigator.appName == "Microsoft Internet Explorer") {
    var xmlDocument = new ActiveXObject("Microsoft.XMLDOM");
    xmlDocument.loadXML(response.responseText);
  } else {
    var xmlDocument = response.responseXML;
  }

  for (var nodeName in Controller.ajaxItemMap) {
    var className = Controller.ajaxItemMap[nodeName];
    var nodes = xmlDocument.documentElement.getElementsByTagName(nodeName);
    for (var i = 0; i < nodes.length; ++i) {
      var updateInformation = eval(className).valueOf(nodes[i]);
      this.updateItem(updateInformation);
    }    
  }
}

Controller.prototype.updateItem = function(updateInformation) {
  for(var i = 0; i < this.items.length; ++i) {
    var item = this.items[i];
    if (typeof item == typeof updateInformation) {
      if (item.equals(updateInformation)) {
        item.update(updateInformation.content);
      }
    }
  }
}

Controller.prototype.refreshView = function() {

  for(var i = 0; i < this.items.length; ++i) {
    var item = this.items[i];
    item.refreshView();
  }    
}

Controller.prototype.initializeView = function() {

  for(var i = 0; i < this.items.length; ++i) {
    var item = this.items[i];
    item.initializeView();
  }    
}

var timer;

Controller.prototype.init = function(action) {
  this.sendActionRequest(action);
//  if (timer) clearInterval(timer);  
}

Controller.prototype.performAction = function(action) {
  var caller = this;
  
/*  document.addEventListener("DOMContentLoaded", function() {
    alert("init sur " + caller);  
    caller.sendActionRequest(action);
  }
  , false); // for Mozilla

  document.addEventListener("load", 
    function(action) {alert("load");}
    , false); // for other good browsers*/
  

/*  if (timer) clearInterval(timer);

  if (/WebKit/i.test(navigator.userAgent)) { // sniff
    timer = setInterval(function() {
    if (/complete/.test(document.readyState)) {
      caller.init(action); // call the onload handler
    }
  }, 1500);
  } else {*/
    caller.init(action);
//  }
    
}

Controller.prototype.addItem = function(item) {
  this.items.push(item);
}

Controller.prototype.addApecAjaxItem = function(type, name, model, count) {
  var className = Controller.ajaxItemMap[type];
  if (className) {
//    alert("this.addItem(new " + Controller.ajaxItemMap[type] + "('" + model + "', '" + name + "', '" + count + "'))");
    eval("this.addItem(new " + Controller.ajaxItemMap[type] + "('" + model + "', '" + name + "', " + count + "))");
  }
}
