function ajax(c,a,data) {
  query = data;
  query['c'] = c;
  query['a'] = a;
  
  JsHttpRequest.query(
    '../ajax.php',
    query,
    function(result, errors) {
      debug_layer = document.getElementById('debug');
      if (debug_layer && errors) {
        debug_layer.innerHTML = "<pre>"+errors+"</pre>";
      }
      eval('ajax'+result['c']+result['a']+'(result["r"])');
    },
    true
  );
}

function ajax2(c,a,data) {
  query = data;
  query['c'] = c;
  query['a'] = a;
  
  JsHttpRequest.query(
    '../../ajax.php',
    query,
    function(result, errors) {
      debug_layer = document.getElementById('debug');
      if (debug_layer && errors) {
        debug_layer.innerHTML = "<pre>"+errors+"</pre>";
      }
      eval('ajax'+result['c']+result['a']+'(result["r"])');
    },
    true
  );
}


function form2array(theForm) {
  var type;
  var arr = new Array;
  for(i=0; i<theForm.elements.length; i++){
    type = theForm.elements[i].type;
    if(type == "text" || type == "password" || type == "hidden" || type == "textarea" || type == "select-one"){
      arr[theForm.elements[i].name] = theForm.elements[i].value
    } else if(type == "checkbox" || type == "radio"){
      if ( theForm.elements[i].checked ) {
        arr[theForm.elements[i].name] = theForm.elements[i].value
      }
    }
  }
  return arr;
}

function $id(id) {
  return document.getElementById(id);
}

function List() {
  this.count = 0;
  this.items = Array();
  this.views = Array();
}

List.prototype.addView = function(view) {
  this.views[this.views.length] = view;
}

List.prototype.add = function(id, data) {
  data['id'] = id;
  this.items[id] = data;
  for ( i in this.views ) {
    this.views[i].add(id, data);
  }
}

List.prototype.addfirst = function(id, data) {
  data['id'] = id;
  this.items[id] = data;
  for ( i in this.views ) {
    this.views[i].addfirst(id, data);
  }
}

List.prototype.update = function(id, data) {
  var newData = this.items[id];
  for ( i in data ) {
    newData[i] = data[i]
  }
  this.items[id] = newData;
  
  for ( i in this.views ) {
    this.views[i].update(id, newData);
  }
}

List.prototype.remove = function(id) {
  this.items[id] = null;
  for ( i in this.views ) {
    this.views[i].remove(id);
  }
}


function ListView(name) {
  this.name = name;
  this.templateElement = $id(name + '-template');
  this.listElement = $id(name + '-list');
}

ListView.prototype.getElementId = function(id) {
  return this.name + '-' + id;
}
              
// add Element to the end of list                   
ListView.prototype.add = function(id, data) {
  var elm = this.templateElement.cloneNode(true);
  elm.id = this.getElementId(id);
  this.render(elm, data);                       
  this.listElement.appendChild(elm);
}

// add Element on the first place
ListView.prototype.addfirst = function(id, data) {
  var elm = this.templateElement.cloneNode(true);
  elm.id = this.getElementId(id);      
  this.render(elm, data);                      
  var fch = this.listElement.firstChild; 
  this.listElement.insertBefore(elm, fch);
}

ListView.prototype.update = function(id, data) {
  var elm = this.templateElement.cloneNode(true);
  elm.id = this.getElementId(id);
  this.render(elm, data);
  this.listElement.replaceChild(elm, $id(this.getElementId(id)));
}

ListView.prototype.remove = function(id) {
  var elm = $id(this.getElementId(id));
  elm.parentNode.removeChild(elm);
}

ListView.prototype.render = function(elm, data) {
  if ( elm.nodeType == 2 || elm.nodeType == 3  ) {
    var value = elm.nodeValue;
    for ( i in data ) {
      value = value.replace(new RegExp('@'+i, 'g'), data[i]);    
    }               
    elm.nodeValue = value;
  } else {
    for ( i in elm.attributes ) {
      this.render(elm.attributes[i], data);
    }
    for ( i in elm.childNodes ) {
      this.render(elm.childNodes[i], data);
    }
  }
}