
// requires mootools compiled with: Element, Element.Dimensions, Ajax, Window.DomReady

// config
var overlayColor = 'FFFFFF'; // no names like 'blue'
var overlayOpacity = .5;
var loaderDirectory = 'pic/ajax_loaders/'; // with trailing slash
var loaderPositions = {x: 'center', y: 'top'}; // both top or center
var loaderDimensions = {width: 32, height: 32};
var errorTimeout = 4000; // in ms (don't make this too small or the error message will appear too soon)
var errorMessage = '<img src="pic/title_bullet.gif" width="11" height="34" border="0" style="position: relative; top: 26px; padding-right: 10px"><img src="pic/title_error_'+language+'.gif" border="0" style="position: relative; top: 15px"><br /><font class="main_text" style="color: red; font-weight: bold; position: relative; top: 40px">'+errorMessage+'</font>';

// privates
var currentRequestNo = -1;
var loader;
var loadedContents;
var previousContents;
var theElement;
var request;
var currentUrl;
var lastUrl;

// image preload & replace links with ajax calls after document has been loaded
window.addEvent('domready', function() {
  var img = new Image;
  img.src = ajaxGetLoaderImage();
  ajaxCreateLinks();
});

function ajaxRequest(page, element)
{

  // don't request page if it has been received successfully in previous request
  if (page == lastUrl)
  {
    return;
  }
  currentUrl = page;

  // return if element doesn't exist
  theElement = $(element);
  if (theElement == null)
  {
    alert('Error: element \''+element+'\' does not exist');
    return;
  }

  // remove old loader & add new one
  if (loader != null)
  {
    loader.remove();
  }
  coords = theElement.getCoordinates();
  loaderLeft = (loaderPositions.x == 'center') ? (coords.left+(coords.width-loaderDimensions.width)/2) : coords.left+loaderDimensions.width;
  loaderTop = (loaderPositions.y == 'center') ? (coords.top+(coords.height-loaderDimensions.height)/2) : coords.top+loaderDimensions.height;
  loader = new Element('img', {
  	styles: {
  		'position': 'absolute',
  		'width': loaderDimensions.width+'px',
  		'height': loaderDimensions.height+'px',
  		'left': loaderLeft+'px',
  		'top': loaderTop+'px'
  	}
  });
  loader.setProperty('src', ajaxGetLoaderImage());

  // add loader to document
  body = document.getElementsByTagName('body');
  $(body[0]).adopt(loader);

  // set opacity of loader & element
  loader.setOpacity(1);
  theElement.setOpacity(overlayOpacity);

  // set request options & make request
  previousContents = theElement.innerHTML;
  loadedContents = false;
  currentRequestNo++;
  options = {update:element, evalScripts:true, onComplete:function() { lastUrl = currentUrl; loadedContents = true; ajaxContentsLoaded(); } };
  if (arguments.length == 3) // post items
  {
    options.postBody = arguments[2];
  }
  page += (page.match("\\?") == null) ? '?' : '&';
	request = new Ajax(page+'ajax='+element,options).request();

	// show error after configured time
	setTimeout ('ajaxCancelRequest('+currentRequestNo+')', errorTimeout+1000); // response takes apparently allready 1000 ms with mootools

}

// private function
function ajaxCancelRequest(curRequestNo)
{
  if (curRequestNo == currentRequestNo && !loadedContents)
  {
    request.cancel();
    setTimeout('ajaxShowError('+curRequestNo+')', 100);
  }
}

// private function
function ajaxShowError(curRequestNo)
{
  if (curRequestNo == currentRequestNo && theElement.innerHTML == previousContents)
  {
    theElement.innerHTML = errorMessage;
    ajaxContentsLoaded();
  }
}

// private function
function ajaxContentsLoaded()
{
  theElement.setOpacity(1);
  loader.setOpacity(0);
}

// private function
function ajaxGetLoaderImage()
{
  return loaderDirectory+overlayColor.toLowerCase()+'_'+(overlayOpacity*100)+'.gif';
}

// replace links within a specific identifier (if specified) or whole document that point to this document with a javascript
// function when document is loaded
function ajaxCreateLinks()
{
  var a = (arguments.length == 2) ? $(arguments[1]).getElementsByTagName('a') : $$('a');
  if (a != null)
  {
    for (var i = 0; i < a.length; i++)
    {

      var url = a[i].href.split('/');
      var loc = location.href.split('/');

      // check if url isn't already a javascript link or anchor & url points to this domain (url domain is equal to site domain)
      if (a[i].href.substr(0, 11).toLowerCase() != "javascript:" && a[i].href.substr(0, 1) != "#" && url[2] == loc[2] && a[i].href.indexOf("download.php") == -1)
      {
        a[i].href = 'javascript:ajaxRequest(\''+a[i].href+'\', \'maincontent\')';
      }

    }
  }
}
