function $(element) {
  return document.getElementById(element);
}

function $$(element) {
  return $(element).value;
}

var WCore_Common = {
  addEventListener: function (object, event, handler, useCapture) {
    if (object.addEventListener)
      object.addEventListener(event, handler, useCapture ? useCapture : false);
    else if (object.attachEvent)
      object.attachEvent('on' + event, handler);
    else
      alert('addEventListener is not supported');
  },
  
  removeEventListener: function (object, event, handler) {
    if (object.removeEventListener)
      object.removeEventListener(event, handler, false);
    else if (object.detachEvent)
      object.detachEvent('on' + event, handler);
    else 
      alert('removeEventListener is not supported');
  },
  
  showOperationResult: function (result) {
    if (result && result.result) {
      if (result.message)
        alert(result.message);
    }
    else {
      if (result && result.message)
        alert('Error: ' + result.message);
      else
        alert('Error: Some errors occured while trying to do request.');
    }
  },
  
  createHTMLElement: function (name, attributes) {
    var element = document.createElement(name);
    
    if (typeof attributes == 'object') {
      for (var i in attributes) {
        element.setAttribute(i, attributes[i]);
        if (i.toLowerCase() == 'class') {
          element.className = attributes[i];
        }
        else if (i.toLowerCase() == 'style') {
          element.style.cssText = attributes[i];
        }
      }
    }
    
    for (var i = 2; i < arguments.length; i++) {
      var v = arguments[i];
      if (typeof v == 'string') {
        v = document.createTextNode(v);
      }
      element.appendChild(v);
    }
    
    return element;
  },
  
  getChildElementsByTagName: function (owner, tagName) {
    var r = new Array();
    var cn = owner.childNodes;
    for (i = 0; i < cn.length; ++i)
      if (cn[i].nodeName.toUpperCase() == tagName.toUpperCase()) r.push(cn[i]);
    return r;
  }
};

var WCore_AJAX = {
  on_fault: function(){},
  
  setFaultHandler: function (on_fault) {
    this.on_fault = on_fault;
  },
  
  loadData: function (loads_list, post_data, on_fault) {
    post_data = post_data || {};
    on_fault = on_fault || this.on_fault;
    
    var data = [];
    for (i = 0; i < loads_list.length; i++) {
      if (loads_list[i].type == 'handler') {
        data.push({type: 'handler', handler: loads_list[i].handler, arguments: loads_list[i].arguments});
      }
      else if ((loads_list[i].type == 'template')) {
        data.push({type: 'template', group: loads_list[i].group, name: loads_list[i].name});
      }
    }
    
    post_data.WCore_AjaxRequestData = data;
    JsHttpRequest.query(
      location.href.replace(new RegExp('#.*$'), ''),
      post_data,
      function(result, errors) {
        if (result) {
          for (i = 0; i < result.length; i++) {
            if (typeof loads_list[i].result == 'function') {
              loads_list[i].result(result[i]);
            }
            else if (typeof loads_list[i].result == 'string') {
              document.getElementById(loads_list[i].result).innerHTML = result[i];
            }
          }
        }
        if (errors) {
          if (typeof on_fault == 'function')
            on_fault(errors);
          else if (typeof on_fault == 'string')
            document.getElementById(on_fault).innerHTML = errors;
        }
      },
      true
    );
  },
  
  loadTemplates: function (loads_list, post_data, on_fault) {
    var i = 0;
    for (i in loads_list) loads_list[i].type = 'template';
    this.loadData(loads_list, post_data, on_fault);
  },
  
  loadHandlers: function (loads_list, post_data, on_fault) {
    var i = 0;
    for (i in loads_list) loads_list[i].type = 'handler';
    this.loadData(loads_list, post_data, on_fault);
  }
};
