// Copyright 2009 John Heminghous
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

function ajaxTextGet(url, callback)
{
  var request = createRequest();
  if (request == null)
  {
    return false;
  }
  
  request.onreadystatechange = 
    function() { readyStateChange(request, callback); }
  request.open("GET", url, true);
  request.send(null);
  
  return true;
}

function ajaxFormPost(url, parameters, callback)
{
  var request = createRequest();
  if (request == null)
  {
    return false;
  }
  
  request.onreadystatechange =
    function() { readyStateChange(request, callback); }
  request.open("POST", url, true);
  request.setRequestHeader(
    "Content-Type", "application/x-www-form-urlencoded");
  request.setRequestHeader("Content-length", parameters.length);
  request.setRequestHeader("Connection", "close");

  request.send(parameters);

  return true;
}

function readyStateChange(request, callback)
{
  if (!callback)
  {
    setTimeout(
      function() { readyStateChange(request, callback); }, 100);
  }
  
  if (request.readyState == 4 && request.status == 200)
  {
    callback(request.responseText);
  }
}

function createRequest()
{
  try
  {
    request = new XMLHttpRequest();
  }
  catch (e)
  {
    try 
    {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      try
      {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e)
      {
        request = null;
      }
    }
  }
  
  return request;
}

function getEvent(event)
{
  if (!event)
  {
    return window.event;
  }
  else
  {
    return event;
  }
}

function getActivatedObject(event)
{
  var object = null;
  
  if (!event)
  {
    object = window.event.srcElement; // IE6-
  }
  else if (event.srcElement)
  {
    object = event.srcElement; // IE7+
  }
  else
  {
    object = event.target; // DOM L2 browsers
  }
  
  return object;
}

function addEventHandler(object, event, handler)
{
  var success = false;
  
  if (document.attachEvent)
  {
    object.attachEvent("on" + event, handler); // IE
    success = true;
  }
  else if (document.addEventListener)
  {
    object.addEventListener(event, handler, false); // DOM L2 browsers
    success = true;
  }
  
  return success;
}

function getCurrentStyle(object)
{
  var returnObj = null;
  
  if (object.currentStyle)
  {
    returnObj = object.currentStyle; // IE
  }
  else if (window.getComputedStyle)
  {
    returnObj = window.getComputedStyle(object, null); // DOM L2 browsers
  }
  
  return returnObj;
}

function getElementPosition(object)
{
  var position = new Object;
  position.x = 0;
  position.y = 0;

  if (object.offsetParent)
  {
    do
    {
      position.x += object.offsetLeft;
      position.y += object.offsetTop;
    } while (object = object.offsetParent);
  }
  
  return position;
}

function isDefined(variable)
{
  return (typeof(variable) != "undefined");
}

function getMouseButton(event)
{
  var button = "undefined";
  
  if (isDefined(event.which))
  {
    button = 
      (event.which < 2) ? 
        "left" : 
        (event.which == 2) ? 
          "middle" : 
          "right";
  }
  else if (isDefined(event.button))
  {
    button = 
      (event.button < 2) ? 
        "left" : 
        (event.button == 4) ? 
          "middle" : 
          "right";
  }
  
  return button;
}

function getElementsByClassName(element, targetClassName)
{
  var matchingElements = new Array();

  if (element && isDefined(element.getElementsByTagName))
  {
    var elements = element.getElementsByTagName("*");
    for (var i = 0; i < elements.length; ++i)
    {
      var elementClassName = elements[i].className;
      var index = elementClassName.indexOf(targetClassName);
      if (index != -1 && 
        (elementClassName.charAt(Math.max(index-1, 0)) == " " ||
        elementClassName.charAt(Math.min(index+targetClassName.length, 
          elementClassName.length-1)) == " " ||
        (index == 0 && targetClassName.length == elementClassName.length)))
      {
        matchingElements.push(elements[i]);
      }
    }
  }
  
  return matchingElements;
}

function getKeyCode(event)
{
  if (event.which)
  {
    return event.which;
  }
  else
  {
    return event.keyCode;
  }
}
