String.prototype.startsWith = function(s) { return this.indexOf(s)==0; };

if (!String.prototype.endsWith) {
  String.prototype.endsWith = function(suffix) {
    var startPos = this.length - suffix.length;
    if (startPos < 0) {
      return false;
    }
    return (this.lastIndexOf(suffix, startPos) == startPos);
  };
};

if (!($ instanceof Function)) {
  var $ = function() {
    var elements = new Array();

    for (var i = 0; i < arguments.length; i++) {
      var element = arguments[i];
      if (typeof element == 'string')
        element = document.getElementById(element);

      if (arguments.length == 1)
        return element;

      elements.push(element);
    }
    return elements;
  }
};


var LANGUI =  {};

LANGUI.namespace = function(ns)
{
 var nsParts = ns.split(".");
 var root = window.LANGUI;

 for(var i=0; i<nsParts.length; i++)
 {
  if(typeof root[nsParts[i]] == "undefined")
   root[nsParts[i]] = new Object();

  root = root[nsParts[i]];
 }
};


LANGUI.getElementsByTagAndAttributeEnd = function(tag, attribute, endsWith) {
  var newElems = new Array();
  var elems = document.getElementsByTagName(tag);
  for (i = 0; i < elems.length; i++) {
    var id = elems[i].getAttribute(attribute);
    if (id != null && id.endsWith(endsWith)) {
      newElems.push(elems[i]);
    }
  }
  return newElems;
};

LANGUI.clearElements = function(elements) {
  for (i = 0; i < elements.length; i++) {
    elements[i].innerHTML = '';
  }
};

LANGUI.outputErrors = function(errorsElem) {
  var errors = errorsElem.getElementsByTagName('error');
  for (i = 0; i < errors.length; i++) {
    //need the id of this error...
    if (errors[i].nodeType == 1) {
      var id = errors[i].getElementsByTagName('id')[0].text;
      if ($(id+'_error')) {
        //maybe should check to see if this is an element or a text node...  If text node, then, it would be
        //the data, not the text

        //element Node
        $(id+'_error').innerHTML = errors[i].getElementsByTagName('message')[0].text;
      }
    }
    else {
      var id = errors[i].getElementsByTagName('id')[0].data;
      if ($(id+'_error')) {
        //maybe should check to see if this is an element or a text node...  If text node, then, it would be
        //the data, not the text

        //element Node
        $(id+'_error').innerHTML = errors[i].getElementsByTagName('message')[0].data;
      }
    }
  }
};

LANGUI.outputErrorsJSON = function(errorsElem) {
  var errors = errorsElem.errors;
  for (i = 0; i < errors.length; i++) {
    //need the id of this error...
    var id = errors[i].id;
    if ($(id+'_error')) {
      $(id+'_error').innerHTML = errors[i].message;
    }
  }
};


LANGUI.errorCheck = function(obj, callback,failureCallback) {
    var mime = obj.getResponseHeader['Content-Type'];
    if (mime.startsWith('text/plain')) {
      LANGUI.errorCheckXML(parseXML(obj.responseText), callback,failureCallback);
    }
    else if (mime.startsWith('application/xml')) {
      LANGUI.errorCheckXML(obj.responseXML, callback,failureCallback);
    }
    else if (mime.startsWith('application/json')) {
      LANGUI.errorCheckJSON(YAHOO.lang.JSON.parse(obj.responseText), callback,failureCallback);
    }
    else {
      LANGUI.errorCheckXML(parseXML(obj.responseText), callback,failureCallback);
    }
  };
  //Error checking when transport is XML
LANGUI.errorCheckXML = function(xmlObj, callback, failureCallback) {
    if (xmlObj != null) {
      if (xmlObj.getElementsByTagName('error').length < 1) {
        callback();
      }
      else if (xmlObj.getElementsByTagName('error').length > 0){
        var root = xmlObj.getElementsByTagName('errors')[0];
        if (!root.hasChildNodes() || xmlObj.getElementsByTagName('errorFlag')[0].text == 'false' || xmlObj.getElementsByTagName('errorFlag')[0].data == 'false') {
          callback();
        }
        else {
          LANGUI.clearElements(LANGUI.getElementsByTagAndAttributeEnd('span', 'id', '_error'));
          LANGUI.outputErrors(root);
          failureCallback();
        }
      }
    }
  };
  //Error checking when transport is JSON
LANGUI.errorCheckJSON = function(json, callback, failureCallback) {
    if (json.header.errors.errorFlag) {
      LANGUI.clearElements(LANGUI.getElementsByTagAndAttributeEnd('span', 'id', '_error'));
      LANGUI.outputErrorsJSON(json.header.errors);
      failureCallback();
    }
    else {
      callback();
    }
  };
