/* Classes */

function Notification(e, m, i)
{
	this.error = e;
	this.message = m;
	this.id = i;

	this.get_error = function()
	{
		return this.error;
	};

	this.get_message = function()
	{
		return this.message;
	};

	this.get_id = function()
	{
		return this.id;
	};
}

function AJAXResponse(xml)
{
	this.notifications = new Array();
	this.section = "";
	this.page = "";

	if(!xml)
		throw new Error("Invalid AJAX response - xml is NULL");

	var response = xml.getElementsByTagName('response');
	if(!response.length)
		throw new Error("Invalid AJAX response - must contain 'response' tag.");

	var page_elements = response[0].getElementsByTagName('page');
	if(page_elements.length > 0)
	{
		for(var i = 0; i < page_elements[0].childNodes.length; ++i)
		{
			if(page_elements[0].childNodes[i].nodeType == 3)
			{
				this.page = page_elements[0].childNodes[i].nodeValue;
				break;
			}
		}
	}

	var section_elements = response[0].getElementsByTagName('section');
	if(section_elements.length > 0)
	{
		for(var i = 0; i < section_elements[0].childNodes.length; ++i)
		{
			if(section_elements[0].childNodes[i].nodeType == 3)
			{
				this.section = section_elements[0].childNodes[i].nodeValue;
				break;
			}
		}
	}

	var notification_elements = response[0].getElementsByTagName('notification');
	for(var i = 0; i < notification_elements.length; ++i)
	{
		var id = notification_elements[i].getAttribute('id');
		var success = (notification_elements[i].getAttribute('success') == 'success') ? true : false;
		var message_text = '';

		var messages = notification_elements[i].getElementsByTagName('message');
		if(messages.length)
		{
			for(var j = 0; j < messages[0].childNodes.length; ++j)
			{
				if(messages[0].childNodes[j].nodeType == 3)
					message_text += messages[0].childNodes[j].nodeValue;
			}
		}

		this.notifications[this.notifications.length] = new Notification(success, message_text, id);
	}

	this.get_notifications = function()
	{
		return this.notifications;
	};

	this.get_page = function()
	{
		return this.page;
	};

	this.get_section = function()
	{
		return this.section;
	};
}

/* Functions */

function getElementsByClassName(obj, className)
{
	var elements = new Array();
	for(var i = 0; i < obj.childNodes.length; ++i)
	{
		if(obj.childNodes[i].nodeType == 1)
		{
			if(contains_class(obj.childNodes[i], className))
				elements[elements.length] = obj.childNodes[i];

			var child_elements = getElementsByClassName(obj.childNodes[i], className);
			elements = elements.concat(child_elements);
		}
	}

	return elements;
}

function getElementByClassName(obj, className)
{
	for(var i = 0; i < obj.childNodes.length; ++i)
	{
		if(obj.childNodes[i].nodeType == 1)
		{
			if(contains_class(obj.childNodes[i], className))
				return obj.childNodes[i];

			var child_elements = getElementByClassName(obj.childNodes[i], className);
			if(child_elements)
				return child_elements;
		}
	}

	return null;
}

function add_notification(text, error)
{
	var content = document.getElementById('content');
	if(content)
	{
		for(var i = 0; i < content.childNodes.length; ++i)
		{
			if(content.childNodes[i].nodeType == 1 && contains_class(content.childNodes[i], "title"))
			{
				var notification = document.createElement('p');
				notification.className = "notification";
				var image = document.createElement('img');
				if(error)
					image.src = "images/error.png";
				else
					image.src = "images/info.png";
				notification.appendChild(image);
				notification.appendChild(document.createTextNode(text));

				if(i + 1 < content.childNodes.length)
					content.childNodes[i].parentNode.insertBefore(notification, content.childNodes[i + 1]);
				else
					content.childNodes[i].parentNode.appendChild(notification);

				break;
			}
		}
	}
}

function clear_notifications()
{
	var content = document.getElementById('content');

	var notifications = new Array();
	for(var i = 0; i < content.childNodes.length; ++i)
	{
		if(content.childNodes[i].nodeType == 1 && contains_class(content.childNodes[i], "notification"))
		{
			notifications[notifications.length] = content.childNodes[i];
		}
	}

	// Remove notifications
	for(var i = 0; i < notifications.length; ++i)
	{
		notifications[i].parentNode.removeChild(notifications[i]);
	}
}

function get_args(url)
{
	var args = new Array();
	if(url.indexOf('?') == -1)
		return null;

	var args_string = url.substring(url.indexOf('?') + 1);
	var pairs = args_string.split('&');

	for(pair in pairs)
	{
		var split_pair = pairs[pair].split('=');
		if(split_pair.length == 2)
			args[split_pair[0]] = split_pair[1];
	}

	return args;
}

function get_args_string(args)
{
	if(!args)
		return null;

	var arg_string = "";
	for(key in args)
	{
		if(!arg_string)
			arg_string = "?";
		else
			arg_string += "&";

		arg_string += encodeURI(key) + "=" + encodeURI(args[key]);
	}

	return arg_string;
}

function get_address(url)
{
	if(url.indexOf('?') == -1)
		return url;
	else
		return url.substring(0, url.indexOf('?'));
}

function unfocus_link(event)
{
	prevent_default(event);

	var target = get_event_target(event);
	if(target)
		target.blur();
}

function contains_class(element, className)
{
	if(!element)
	{
		return false;
	}

	var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
	className = className.replace(/\-/g, "\\-");

	return (regex.test(element.className));
}

function attribute_contains_value(element, value, attribute)
{
	if(!element)
	{
		return false;
	}

	var regex = new RegExp("(^|\\s)" + value + "(\\s|$)");
	value = value.replace(/\-/g, "\\-");

	return (regex.test(element.getAttribute(attribute)));
}

function add_event(obj, type, fn)
{
	if(!obj)
	{
		return false;
	}

	if(obj.addEventListener)
	{
		obj.addEventListener(type, fn, false);
		return true;
	}
	else if(obj.attachEvent)
	{
		obj['e' + type + fn] = fn;
		obj[type + fn] = function(){obj['e' + type + fn](window.event);}
		obj.attachEvent('on' + type, obj[type + fn]);

		return true;
	}

	return false;
}

function remove_event(obj, type, fn)
{
	if(!obj)
	{
		return false;
	}

	if(obj.removeEventListener)
	{
		obj.removeEventListener(type, fn, false);
		return true;
	}
	else if(obj.detachEvent)
	{
		obj.detachEvent('on' + type, obj[type + fn]);
		obj[type + fn] = null;
		return true;
	}

	return false;
}

function fire_event(obj, type)
{
	if(document.createEvent)
	{
		var evt = document.createEvent('MouseEvents');
		evt.initEvent(type, true, false);
		obj.dispatchEvent(evt);
	}
	else if(document.createEventObject)
	{
		obj.fireEvent('on' + type);
	}
}

function prevent_default(eventObj)
{
	eventObj = eventObj || getEventObject(eventObj);

	if(eventObj.preventDefault)
	{
		eventObj.preventDefault();
	}
	else
	{
		eventObj.returnValue = false;
	}
}

function get_event_target(eventObj)
{
	eventObj = eventObj || getEventObject(eventObj);

	var target = eventObj.target || eventObj.srcElement;

	if(target.nodeType == 3 || target.nodeName == 'IMG')
	{
		target = target.parentNode;
	}

	return target;	
}


function ajax_request(source, get, address, args, fn)
{
	if(!address || !args)
		return false;

	var request = false;

	if(window.XMLHttpRequest)
	{
		var request = new window.XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{
		var request = new window.ActiveXObject('Microsoft.XMLHTTP');
	}

	if(request)
	{
		var arg_string = get_args_string(args);

		request.onreadystatechange = function() { fn(request, source) };
		if(get)
		{
			request.open('GET', address + arg_string, true);
			request.setRequestHeader('X-Request-Type', 'Ajax');
			request.send(null);
		}
		else
		{
			request.open('POST', address, true);
			request.setRequestHeader('X-Request-Type', 'Ajax');
			request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			request.setRequestHeader("Content-length", arg_string.length - 1);
			request.setRequestHeader("Connection", "close");
			request.send(arg_string.substring(1));
		}
	}
}

function findPosX(obj)
{
	var curleft = 0;
	if(obj.offsetParent)
		while(1) 
		{
			curleft += obj.offsetLeft;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	else if(obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if(obj.offsetParent)
		while(1)
		{
			curtop += obj.offsetTop;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	else if(obj.y)
		curtop += obj.y;
	return curtop;
}

