/*global ActiveXObject, XMLHttpRequest, document, window */

addLoadEvent(doAjax);

function doAjax() {

	var prepareForm = function(formId,canvasId,service) {
	
		if (!document.getElementById) { return; }
		if (!document.getElementById(canvasId)) { return; }
		if (!document.getElementById(formId)) { return; }
	
		var theform = document.getElementById(formId);
	
		var xhr = new Ajax();
		xhr.canvas = document.getElementById(canvasId);
		xhr.url = "ajax.php?"+service;
		xhr.loading = function() {
			displayLoading(document.getElementById(canvasId));
		};
		xhr.callback = doAjax;
	
		theform.ajaxHandler = xhr;
	
		theform.onsubmit = function() {
	
			var data = "";
	
			for (var i=0; i<this.elements.length; i++) {
	
				data+= this.elements[i].name;
				data+= "=";
				data+= escape(this.elements[i].value);
				data+= "&";
	
			}
	
			this.ajaxHandler.data = data;
			return (!this.ajaxHandler.start());
	
		};

		theform = null;	// Clean up for IE
	
	};
	
	var prepareLinks = function(containerId,canvasId,service) {
	
		if (!document.getElementById) { return; }
		if (!document.getElementById(canvasId)) { return; }
		if (!document.getElementById(containerId)) { return; }
	
		var lnks = document.getElementById(containerId).getElementsByTagName("a");
	
		var xhr = new Ajax();
		xhr.canvas = document.getElementById(canvasId);
		xhr.url = "ajax.php?"+service;
		xhr.loading = function() {
			displayLoading(document.getElementById(canvasId));
		};
		xhr.callback = doAjax;
	
		for (var i=0; i<lnks.length; i++) {
	
			var thelink = lnks[i];
	
			if (thelink.getAttribute("href").indexOf("http://www.amazon.") > -1 ) { continue; }
	
			if (thelink.getAttribute("href").indexOf("?") > -1 ) {
	
				thelink.ajaxHandler = xhr;
	
				thelink.onclick = function() {
	
					this.ajaxHandler.data = this.getAttribute("href").split("?")[1].split("#")[0];
					return (!this.ajaxHandler.start());
	
				};
			}

			thelink = null;	// Clean up for IE

		}
	};

	prepareLinks(
		"flickr-begin",
		"flickr-container",
		"flickr=getFlickrAll");
	prepareLinks(
		"flickr-contacts-list",
		"flickr-container",
		"flickr=getFlickrAll");
	prepareLinks(
		"flickr-contacts-more",
		"flickr-contacts",
		"flickr=getFlickrContacts");
	prepareLinks(
		"flickr-contacts-photos-list",
		"flickr-photo-details",
		"flickr=getFlickrPhotoDetails");
	prepareLinks(
		"flickr-contacts-photos-navigation",
		"flickr-contacts-photos",
		"flickr=getFlickrContactsPhotos");
	prepareLinks(
		"flickr-navigation",
		"flickr-photos",
		"flickr=getFlickrPhotos");
	prepareLinks(
		"flickr-photos-list",
		"flickr-photo-details",
		"flickr=getFlickrPhotoDetails");
	prepareLinks(
		"flickr-photo",
		"flickr-photo",
		"flickr=getFlickrPhoto");
	prepareLinks(
		"flickr-comments",
		"flickr-container",
		"flickr=getFlickrAll");
	prepareLinks(
		"flickr-person",
		"flickr-container",
		"flickr=getFlickrAll");
	prepareLinks(
		"amazon-begin",
		"amazon-results",
		"amazon=getAmazonList");
	prepareForm(
		"amazon-form",
		"amazon-results",
		"amazon=getAmazonSearch");
	prepareLinks(
		"amazon-list",
		"amazon-item",
		"amazon=getAmazonItem");
	prepareLinks(
		"amazon-search-navigation",
		"amazon-results",
		"amazon=getAmazonSearch");
	prepareLinks(
		"amazon-list-navigation",
		"amazon-results",
		"amazon=getAmazonList");
	prepareLinks(
		"amazon-attribution",
		"amazon-results",
		"amazon=getAmazonSearch");
	prepareLinks(
		"amazon-similar",
		"amazon-item",
		"amazon=getAmazonItem");
	prepareLinks(
		"delicious-begin",
		"delicious-container",
		"delicious=getDeliciousPosts");
	prepareForm(
		"delicious-form",
		"delicious-container",
		"delicious=getDeliciousPosts");
	prepareLinks(
		"delicious-navigation",
		"delicious-container",
		"delicious=getDeliciousPosts");
	prepareLinks(
		"magnolia-begin",
		"magnolia-container",
		"magnolia=getMagnoliaPosts");
	prepareForm(
		"magnolia-form",
		"magnolia-container",
		"magnolia=getMagnoliaPosts");
	prepareLinks(
		"magnolia-navigation",
		"magnolia-container",
		"magnolia=getMagnoliaPosts");
	prepareLinks(
		"upcoming-begin",
		"upcoming-list",
		"upcoming=getUpcomingWatchlist");
	prepareLinks(
		"upcoming-list",
		"upcoming-event",
		"upcoming=getUpcomingEvent");
	prepareLinks(
		"feeds-begin",
		"feeds-letters",
		"feeds=getFeedsLetters");
	prepareLinks(
		"feeds-letters",
		"feeds-list",
		"feeds=getFeedsList");
	prepareLinks(
		"feeds-list",
		"feeds-items",
		"feeds=getFeedsRSS");
	prepareLinks(
		"feeds-items",
		"feeds-item",
		"feeds=getFeedsItem");

}

function Ajax() {

	var url,canvas,data,loading,callback,request;

	this.start = function() {

		url			= this.url;
		canvas		= this.canvas;
		data		= this.data;
		loading		= this.loading;
		callback	= this.callback;
		request		= getHTTPObject();

		if (!request || !url) {
			return false;
		} else {
			initiateRequest();
			return true;
		}
	};

	var getHTTPObject = function() {
		var xmlhttp = false;
		if (window.XMLHttpRequest) {
			xmlhttp = new XMLHttpRequest();
		} else if(window.ActiveXObject) {
			try {
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {
					xmlhttp = false;
				}
			}
		}
		return xmlhttp;
	};

	var initiateRequest = function() {
		if (loading) {
			loading();
		}
		loadData();
	};

	var loadData = function() {
		request.onreadystatechange = completeRequest;
		if (data) {
			request.open("POST", url, true);
			request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			request.send(data);
		} else {
			request.open("GET", url, true);
			request.send(null);
		}
	};

	var completeRequest = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				if (canvas) {
					canvas.innerHTML = request.responseText;
				//	canvas.tabIndex = -1;
				//	canvas.focus();
				}
				if (callback) {
					callback();
				}
			} else {
				if (canvas) {
					canvas.innerHTML = request.statusText;
				//	canvas.tabIndex = -1;
				//	canvas.focus();
				}
			}
			window.status = request.statusText;
		}
	};

}

function displayLoading(element) {
	document.emptyElement(element);
	var content = document.createElement("img");
	content.setAttribute("src","images/loading.gif");
	content.setAttribute("alt","Loading...");
	element.appendChild(content);
	window.scrollToElement(element);
}

document.emptyElement = function(element) {
	while (element.hasChildNodes()) {
		element.removeChild(element.lastChild);
	}
};


window.scrollToElement = function(element) {

	var getYpos = function() {

		var ypos = element.offsetTop; 
		var thisNode = element; 
		while (thisNode.offsetParent &&  (thisNode.offsetParent != document.body)) { 
			thisNode = thisNode.offsetParent;
			ypos += thisNode.offsetTop; 
		}
		return ypos;

	};

	var getCurrentYPos = function() {
	
		if (document.body && document.body.scrollTop) {
			return document.body.scrollTop;
		}
	
		if (document.documentElement && document.documentElement.scrollTop) {
			return document.documentElement.scrollTop;
		}
	
		if (window.pageYOffset) {
			return window.pageYOffset;
		}
	
		return 0;
	
	};

	if (element.movement) {
		window.clearTimeout(element.movement);
	}

	var final_y = getYpos();
	var ypos = getCurrentYPos();

	if (ypos == final_y) {
		return true;
	}
	if (ypos < final_y) {
		ypos += Math.ceil((final_y - ypos)/2);
	}
	if (ypos > final_y) {
		ypos -= Math.ceil((ypos - final_y)/2);
	}

	window.scrollTo(0,ypos);

	if (getCurrentYPos() != ypos) {
		return false;
	}

	element.movement = window.setTimeout("window.scrollToElement('"+element+"')",8);

};