
//   when XMLHttpRequest is predefined
if (typeof(XMLHttpRequest) == "undefined") {
  XMLHttpRequest = function() {
    try {
      return new ActiveXObject("Msxml2.XMLHTTP.6.0");
    } catch(e) { }

    try {
      return new ActiveXObject("Msxml2.XMLHTTP.3.0");
    } catch(e) { }

    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) { }

    try {
      return new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) { }

    throw new Error("This browser does not support XMLHttpRequest.");
  };
}


function addStylesheet(url) {
  var element = document.createElement('link');
  element.type = 'text/css';
  element.rel = 'stylesheet';
  element.href = url;
  element.media = 'screen';
  element.title = 'default';
  document.getElementsByTagName('head')[0].appendChild(element);
}


function addClassName(element, className) {
  if (element.className) {
    if (!hasClassName(element, className)) {
      element.className = element.className + ' ' + className;
    }
  } else {
    element.className = className;
  }
}


function removeClassName(element, className) {
  if (element.className) {
    var classNames = element.className.split(' ');
    lcClassName = className.toLowerCase()
    for (var i = 0; i < classNames.length; i++) {
      if (classNames[i].toLowerCase() == lcClassName) {
        classNames.splice(i--, 1);
      }
    }
    element.className = classNames.join(' ');
  }
}


function hasClassName(element, className) {
  if (element.className) {
    var classNames = element.className.split(' ');
    var lcClassName = className.toLowerCase();
    for (var i = 0; i < classNames.length; i++) {
      if (classNames[i].toLowerCase() == lcClassName) {
        return true;
      }
    }
  }
  return false;
}

function getElementsByClassName(root, className) {
  var matches = new Array();

  if (root == document) {
    root = document.body;
  }

  if (hasClassName(root, className)) {
    matches.push(root);
  }

  if (root.childNodes != undefined) {
    for (var i = 0; i < root.childNodes.length; i++) {
      matches = matches.concat(getElementsByClassName(root.childNodes[i], className));
    }
  }

  return matches;
}

function findAncestorByClassName(element, className) {
  for (var node = element.parentNode; node; node = node.parentNode) {
    if (hasClassName(node, className)) {
      return node;
    }
  }
  return undefined;
}


function attachInputCaption(element, caption, emptyClass, filledClass) {
  element.setAttribute('emptyClass', emptyClass);
  element.setAttribute('filledClass', filledClass);
  element.setAttribute('emptyCaption', caption);

  addEvent(element, 'focus', function(e) {
    __attachInputCaption_onfocus(e.currentTarget);
  });

  addEvent(element, 'blur', function(e) {
    __attachInputCaption_onblur(e.currentTarget);
  });

  if (element.form != undefined) {
    element.form.setAttribute('captionElement', element.id);
    addEvent(element.form, 'submit', function(e) {
      var captionElement = document.getElementById(e.currentTarget.getAttribute('captionElement'));

      if (captionElement.getAttribute('empty') == 'true') {
        captionElement.value = '';
      }
    });
  }

  __attachInputCaption_onblur(element);
}

function __attachInputCaption_onfocus(element) {
  if (element.getAttribute('empty') == 'true') {
    element.setAttribute('empty', 'false');
    element.value = '';

    if (element.getAttribute('emptyClass')) {
      removeClassName(element, element.getAttribute('emptyClass'));
    }

    if (element.getAttribute('filledClass')) {
      addClassName(element, element.getAttribute('filledClass'));
    }
  }
}

function __attachInputCaption_onblur(element) {
  if (element.value == '') {
    element.setAttribute('empty', 'true');
    element.value = element.getAttribute('emptyCaption');

    if (element.getAttribute('filledClass')) {
      removeClassName(element, element.getAttribute('filledClass'));
    }

    if (element.getAttribute('emptyClass')) {
      addClassName(element, element.getAttribute('emptyClass'));
    }
  }
}



function addEvent(element, type, fn) {
  if (element.addEventListener) {
    element.addEventListener(type, fn, false);
  } else if (element.attachEvent) {
    element['e' + type + fn] = fn;
    element[type + fn] = function() {
      var e = window.event;

      if (e.charCode == undefined) {
        e.charCode = e.keyCode;
      }

      if (e.currentTarget == undefined) {
        e.currentTarget = element;
      }

      if (e.layerX == undefined) {
        e.layerX = e.offsetX;
        e.layerY = e.offsetY;
      }

      if (e.type == 'mouseover' && e.relatedTarget == undefined) {
        e.relatedTarget = e.fromElement;
      }

      if (e.type == 'mouseout' && e.relatedTarget == undefined) {
        e.relatedTarget = e.toElement;
      }

      if (e.target == undefined) {
        e.target = e.srcElement;
      }

      if (e.preventDefault == undefined) {
        e.preventDefault = function() {
          e.returnValue = false;
        }
      }

      if (e.stopPropagation == undefined) {
        e.stopPropagation = function() {
          e.cancelBubble = true;
        }
      }

      element['e' + type + fn](e);
    }
    element.attachEvent('on' + type, element[type + fn]);
  }
}


function removeEvent(element, type, fn) {
  if (element.removeEventListener) {
    element.removeEventListener(type, fn, false);
  } else if (element.detachEvent) {
    element.detachEvent('on' + type, element[type + fn]);
    element[type + fn] = null;
    element['e' + type + fn] = null;
  }
}




function oldconfirmAction(link, text) {
  if (confirm(text)) {
    if (text.indexOf('?') > 0) {
      link.href += '&';
    } else {
      link.href += '?';
    }
    link.href += 'confirmed=1';
    return true;
  }
  return false;
}

function confirmAction(form, text) {
  if (confirm(text)) {
    form.submit();
  }
}

function confirmTeamJoin(form, team) {
  /*confirmAction(form,
    'Do you want to join ' + team + '?\n\n' +
    'Click OK to join this team.');*/
  form.submit();
  return false;
}

function confirmTeamAccept(form) {
  form.submit();
  return false;
}

function confirmTeamReject(form) {
  form.submit();
  return false;
}

function confirmTeamLeave(form, team) {
  confirmAction(form,
    'Are you sure you want to leave ' + team + '. ' +
    'If the team is invite only or changes to invite only, you won\'t be able to rejoin without another invite.\n\n' +
    'Click OK to leave this team.\n' +
    'Click Cancel to go back without leaving this team.');
  return false;
}

function confirmTeamDelete(form, team) {
  confirmAction(form,
    'Are you sure you want to delete this team (' + team + ')? ' +
    'Once you delete this team there is no way to recover it.\n\n' +
    'Click OK to delete this team.\n' +
    'Click Cancel to go back without deleting this team.');
  return false;
}


function attachHandleValidator(element, context, ignore, statusId) {
  element.setAttribute('handle-context', context);
  element.setAttribute('handle-ignore', ignore == null ? '<null>' : ignore);
  element.setAttribute('handle-statusId', statusId);

  var event = function() {
    var context = element.getAttribute('handle-context');
    var ignore = element.getAttribute('handle-ignore');
    var statusId = element.getAttribute('handle-statusId');
    __handle_change(element, context, ignore, statusId);
  };

  addEvent(element, 'change', event);
  addEvent(element, 'keyup', event);
}

var _handle_change_cache = new Array();
function __set_handle_change_status(element, context, statusId) {
  var status = document.getElementById(statusId);
  removeClassName(status, 'waiting');
  switch (_handle_change_cache[context][element.value]) {
  case 1:
    removeClassName(status, 'unavailable');
    removeClassName(status, 'invalid');
    addClassName(status, 'available');
    break;

  case 0:
    removeClassName(status, 'invalid');
    removeClassName(status, 'available');
    addClassName(status, 'unavailable');
    break;

  case -1:
  default:
    removeClassName(status, 'unavailable');
    removeClassName(status, 'available');
    addClassName(status, 'invalid');
    break;
  }
}

var _handle_change_tid = 0;
function __handle_change(element, context, ignore, statusId) {
  window.clearTimeout(_handle_change_tid);
  if (_handle_change_cache[context] == undefined) {
    _handle_change_cache[context] = new Array();
  }
  if (_handle_change_cache[context][element.value] != undefined) {
    __set_handle_change_status(element, context, statusId);
  } else if (ignore != null && element.value == ignore) {
    _handle_change_cache[context][element.value] = 1;
    __set_handle_change_status(element, context, statusId);
  } else if (!/^[A-Za-z][A-Za-z0-9_-]+[A-Za-z0-9]$/.test(element.value)) {
    _handle_change_cache[context][element.value] = -1;
    __set_handle_change_status(element, context, statusId);
  } else {
    var status = document.getElementById(statusId);
    removeClassName(status, 'available');
    removeClassName(status, 'unavailable');
    removeClassName(status, 'invalid');
    addClassName(status, 'waiting');
    _handle_change_tid = window.setTimeout(function() {
      var obj = new XMLHttpRequest();
      obj.onreadystatechange = function() {
        switch (obj.readyState) {
        case 4:
          _handle_change_cache[context][element.value] = parseInt(obj.responseText);
          __set_handle_change_status(element, context, statusId);
          break;
        }
      }
      obj.open('GET', '/do/AJAXHandleValidator?context=' + escape(context) +
                      '&handle=' + escape(element.value) +
                      '&ignore=' + escape(ignore), true);
      obj.send(null);
    }, 250);
  }
}




window.onload = function() {
  var boxes = getElementsByClassName(document, 'top-left');
  for (var i = 0; i < boxes.length; i++) {
    boxes[i].style.top = '0px';
    boxes[i].style.left = '0px';
  }
}
