// Include external JS-Files
/*'/js/general/ease/json/json.js'*/
var includeFiles = [
	'/js/general/ease/ajaxslt/misc.js',					
	'/js/general/ease/ajaxslt/dom.js',					
	'/js/general/ease/ajaxslt/xpath.js',					
	'/js/general/ease/ajaxslt/xslt.js'
];

var head = document.getElementsByTagName('head')[0];
var jsTag = [];
for (var i = 0; i < includeFiles.length; i++)
{
	jsTag[i] = document.createElement('script');
	jsTag[i].setAttribute('src',includeFiles[i]);
	head.appendChild(jsTag[i]);
}

// Disable logging by Google AJAXSLT
logging__ = false;
logging = false;
xsltdebug = false;
xpathdebug = false;

/*
 * Object Ease
 * Create the Ease object, on which all following functions and classes depend
 *
 */
var Ease = (Ease && typeof Ease == 'object') ? Ease :
{
	version : '0.7',
	author : 'Tobias Mueller, Cologne, Germany',
	copyright : 'Tobias Mueller, Cologne, Germany',
	errorReporting : 1
};

/*
 *
 * Object Ease.Errors
 *
 */
Ease.Errors =
{
	create : function(msg)
	{
		if (Ease.errorReporting == 1)
		{
			throw new Error(msg);
		}
		else if (Ease.errorReporting == 2)
		{
			Ease.Errors.report(msg);
			
			return true;
		}
		else
		{
			return true;
		}
	},
	
	report : function(msg,file,line)
	{
		if (Ease.errorReporting == 1)
		{
			return false;
		}
		else if (Ease.errorReporting == 2)
		{
			var logParams = '';
			logParams += 'message=' + msg
			logParams += file ? '&file=' + file : '';
			
			var ErrorLog = new Ease.Ajax('/ease/log/ease.log.write.php',{ params:logParams, method:'POST' });
			ErrorLog.handleRequest();
			
			return true;
		}
		else
		{
			return true;
		}
	}
};

/*
 *
 * Object Ease.UA
 *
 */
Ease.UA =
{
	getSystem : navigator.platform.toLowerCase(),
	getAgent : navigator.userAgent.toLowerCase(),
	hasDOM : false,
	hasAjax : false,
	isOpera : false,
	isIE : false,
	isKHTML : false,
	isGecko : false,
	isOperaVersion : null,
	isIEVersion : null,
	isGeckoBuildDate : null,
	
	check : function()
	{
		if (this.getSystem.indexOf('mac') != -1)
			this.isSystem = 'mac';
		else if (this.getSystem.indexOf('win') != -1)
			this.isSystem = 'win';
		else
			this.isSystem = 'other';
		
		this.hasDOM = (document.getElementById && document.createElement) ? true : false;
		this.hasAjax = (this.hasDOM && (window.XMLHttpRequest || window.ActiveXObject)) ? true : false;
		
		if (this.hasDOM)
		{
			if (window.opera)
			{
				this.isOpera = true;
				this.getOperaVersion();
			}
			
			if (document.all && !this.isOpera)
			{
				this.isIE = true;
				this.isIEMac = (this.isSystem == 'mac') ? true : false;
				if (!this.isIEMac)
					this.getIEVersion();
			}
			
			this.isKHTML = (document.clientWidth) ? true : false;
			
			if (!this.isKHTML && !this.isIE && !this.isOpera && window.updateCommands)
			{
				this.isGecko = true;
				this.getGeckoBuildDate();
			}
		}
		else
		{
			Ease.Errors.create('Ease.UA.check(): This browser does not support DOM.');
		}
	},
	
	getOperaVersion : function()
	{
		this.isOperaVersion = 
			(!document.addEventListener) ? 6 :
			(document.addEventListener && !document.getElementsByTagNameNS) ? 7 : 
			(document.getElementsByTagNameNS && !document.designMode) ? 8 :
			(document.designMode) ? 9 :
			'undefined';
	},
	
	getIEVersion : function()
	{
		this.isIEVersion = 
			(!document.createEventObject) ? 5 :
			(document.createEventObject && !document.compatMode) ? 5.5 : 
			(document.compatMode && !window.XMLHttpRequest) ? 6 :
			(window.XMLHttpRequest) ? 7 :
			'undefined';
	},
	
	getGeckoBuildDate : function()
	{
		this.isGeckoBuildDate = new Number(this.getAgent.match(/.*gecko\/(\d{8}).*/)[1]);
	}
};

if (Ease.UA && Ease.Errors)
{
	window.onerror = Ease.Errors.report;
	Ease.UA.check();
}

/*
 *
 * Object Ease.DOM
 *
 */
Ease.DOM =
{
	getElems : function()
	{
		if (Ease.UA.hasDOM)
		{
			var args = arguments;
			var elems = [];
			var elem = null;
			
			for (var i = 0; i < args.length; i++)
			{
				if (typeof args[i] == 'string')
				{
					elem = document.getElementById(args[i]) || null;
				}
				else if (typeof args[i] == 'object')
				{
					if (args[i].method != null && args[i].find != null)
					{
						elem = this.getElemsBy(args[i]);
						if (elem && args[i].index != null)
						{
							elem = elem.length > args[i].index
								? elem[args[i].index]
								: null;
						}
					}
					else
						elem = args[i];
				}
				
				if (elem == null)
					Ease.Errors.create('Ease.DOM.getElems(): element not found, argument index: ' + i);
				
				if (args.length == 1)
					return elem;
				
				elems.push(elem);
			}
			
			return elems;
		}
	},
	
	getElemsBy : function(argsObj)
	{
		if (Ease.UA.hasDOM)
		{
			var elem = null;
	
			var args =
			{
				method : argsObj.method.toLowerCase() || null,
				elem : argsObj.find || null,
				parentNode : argsObj.parentNode || document
			}
			
			if (typeof args.method == 'string' && typeof args.elem == 'string')
			{
				switch (args.method)
				{
					case 'name' :
						elem = args.parentNode.getElementsByName(args.elem);
						break;
					case 'classname' :
						elem = this.getElemsByClassName(args.elem,args.parentNode);
						break;
					case 'tagname' :
						elem = args.parentNode.getElementsByTagName(args.elem);
						break;
				}
				
				if (elem == null)
					Ease.Errors.create('Ease.DOM.getElemsBy(): element not found.');
				
				return elem && elem.length >= 1
					? elem 
					: null;
			}
		}
	},
	
	getElemsByClassName : function(className,parentNode)
	{
		if (Ease.UA.hasDOM)
		{
			parentNode = typeof parentNode == 'object'
				? parentNode
				: document;
			var allElems = parentNode.getElementsByTagName('*');
			var elemsWithClass = [];
			
			for (var i = 0; i < allElems.length; i++)
			{
				if (allElems[i].className.match(new RegExp('\\b' + className + '\\b')))
					elemsWithClass.push(allElems[i]);
			}
			
			return elemsWithClass.length > 0
				? elemsWithClass
				: {};
		}
	},
	
	parseXMLFromString : function(data)
	{
		if (data && typeof data == 'string')
		{
			var domDoc = null;
			
			try
			{
				domDoc = new ActiveXObject('MSXML2.DOMDocument.3.0');
				domDoc.async = false;
				domDoc.loadXML(data);
			}
			catch (e)
			{
				try
				{
					if (Ease.UA.isGecko)
						domDoc = (new DOMParser()).parseFromString(data, 'text/xml');
					else
						domDoc = xmlParse(data);
				}
				catch (e)
				{
					Ease.Errors.create('Ease.DOM.parseXMLFromString(): XML parsing failed.');
				}
			}
			
			return domDoc;
		}
	},
	
	parseHTMLFromString : function(data)
	{
		if (data && typeof data == 'string')
		{
			var domNode = null;
			var wrapperElem = document.createElement('div');
			
			wrapperElem.innerHTML = data;
			
			if (wrapperElem.childNodes.length <= 1)
			{
				domNode = wrapperElem.firstChild;
			}
			else
			{
				domNode = [];
				
				for (var i = 0; i < wrapperElem.childNodes.length; i++)
					domNode.push(wrapperElem.childNodes[i]);
			}
			
			return domNode;
		}
			
		return data;
	},
	
	xslTransform : function(xml, xsl, retObj)
	{
		if (xml && xsl)
		{
			var output = null;
			
			xml = typeof xml == 'object' ? xml : this.parseXMLFromString(xml);
			xsl = typeof xsl == 'object' ? xsl : this.parseXMLFromString(xsl);
			
			try
			{
				var xmlDoc = null;
				var xslDoc = null;
				
				xmlDoc = new ActiveXObject('MSXML2.DOMDocument.3.0');
				xmlDoc.async = false;
				xmlDoc.load(xml);
				
				xslDoc = new ActiveXObject('MSXML2.DOMDocument.3.0');
				xslDoc.async = false;
				xslDoc.load(xsl);
				
				output = xmlDoc.transformNode(xslDoc);
				
				if (retObj == true)
					output = this.parseHTMLFromString(output);
			}
			catch (e)
			{
				try
				{
					if (Ease.UA.isGecko)
					{
						var xsltProcessor = null;
						var outputDoc = null;
						var outputXML = null;
						
						xsltProcessor = new XSLTProcessor();
						xsltProcessor.importStylesheet(xsl);
						
						output = xsltProcessor.transformToFragment(xml,document);
						
						if (retObj == false)
							output = (new XMLSerializer()).serializeToString(output);
					}
					else
					{
						output = xsltProcess(xml, xsl);
						
						if (retObj == true)
							output = this.parseHTMLFromString(output);
					}
				}
				catch (e)
				{
					Ease.Errors.create('Ease.DOM.xslTransform(): XSL transformation failed.');
				}
			}
			
			return output;
		}
	},
	
	findFirstElementNode : function(parentNode)
	{
		if (typeof parentNode == 'object')
		{
			var count = 0;
			
			while (parentNode.childNodes[count].nodeType != 1)
			{
				count++;
			}
			
			return parentNode.childNodes[count];
		}
	},
	
	removeChildNode : function(parentNode, node)
	{
		parentNode = Ease.DOM.getElems(parentNode).firstChild;
		node = Ease.DOM.getElems(node);
		parentNode.removeChild(node);
	},
	
	removeAllChildNodes : function(parentNode)
	{
		parentNode = Ease.DOM.getElems(parentNode);
		parentNode.innerHTML = '';
	},
	
	appendChild : function(elem,appendTo,insertBefore)
	{
		if (appendTo && typeof appendTo == 'object')
		{
			if (insertBefore && typeof insertBefore == 'object')
				appendTo.insertBefore(elem,insertBefore);
			else
				appendTo.appendChild(elem);
		}
	},
	
	createElement : function(element,attributes,content,appendTo,insertBefore)
	{
		var elem = document.createElement(element);
		
		if (attributes && typeof attributes == 'object')
		{
			for (var attr in attributes)
			{
				if (attr.toLowerCase() != 'class')
					elem.setAttribute(attr.toLowerCase(),attributes[attr]);
				else
					elem.className = attributes[attr];
			}
		}
		
		if (content)
		{
			if (typeof content == 'string')
				var content = document.createTextNode(content);
				
			if (content.nodeType)
				elem.appendChild(content);
		}
		
		if (appendTo && typeof appendTo == 'object')
		{
			this.appendChild(elem,appendTo,insertBefore);
		}
		else
		{
			return elem;
		}
	},
	
	getDimensions : function(obj)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);
			
			var dimensions =
			{
				width : obj.offsetWidth,
				height : obj.offsetHeight
			};
			
			return dimensions;
		}
	},
		
	getPosition : function(obj)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);
			var position =
			{ 
				x : 0,
				y : 0
			};
			
			do
			{
				position.x += obj.offsetLeft;
				position.y += obj.offsetTop;
			}
			while (obj = obj.offsetParent);
			
			return position;
		}
	}
};

/*
 *
 * Object Ease.Forms
 *
 */
Ease.Forms =
{
	getElem : function(form,element,parentNode)
	{
		if (Ease.UA.hasDOM)
		{
			parentNode = typeof parentNode == 'object' 
				? parentNode
				: document;
	
			var formElem = parentNode.forms[form].elements[element];
			
			return formElem && typeof formElem == 'object' 
				? formElem
				: null;
		}
	},
	
	createRequestStr : function(form,parentNode)
	{
		if (Ease.UA.hasDOM)
		{
			if (typeof form == 'string' || typeof form == 'number')
			{
				parentNode = typeof parentNode == 'object' 
					? parentNode
					: document;
				form = parentNode.forms[form];
			}
			
			if (typeof form != 'object')
				return '';
			
			var formElems = form.elements;
			
			var reqStr = '';
			var count = 0;
			var options;
			
			for (var i = 0; i < formElems.length; i++)
			{
				if (formElems[i].name)
				{
					if (!(formElems[i].type.toLowerCase() == 'radio') && !(formElems[i].type.toLowerCase() == 'checkbox'))
					{
						if (!formElems[i].multiple)
						{
							reqStr += count > 0 ? '&' : '?';
							reqStr += formElems[i].name;
							reqStr += '=';
							reqStr += formElems[i].value;
						}
						else
						{
							options = formElems[i].options;
							
							for (var j = 0; j < options.length; j++)
							{
								if (options[j].selected == true)
								{
									reqStr += count > 0 ? '&' : '?';
									reqStr += formElems[i].name;
									reqStr += '=';
									reqStr += options[j].value;
								}
							}
						}
					}
					else
					{
						if (formElems[i].checked == true)
						{
							reqStr += count > 0 ? '&' : '?';
							reqStr += formElems[i].name;
							reqStr += '=';
							reqStr += formElems[i].value;
						}
					}
					
					count++;
				}
			}
			
			reqStr = typeof encodeURI == 'function' ? encodeURI(reqStr) : escape(reqStr);
			
			return reqStr;
		}
	}
};

/*
 *
 * Object Ease.Ajax
 *
 */
Ease.Ajax = 
{
	postHeader : ['Content-Type','application/x-www-form-urlencoded;'],
	noCacheHeader : ['If-Modified-Since','Sat, 1 Jan 2000 00:00:00 GMT'],
	msXMLObjs : ['MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],
	
	createRequest : function()
	{
		if (Ease.UA.hasAjax)
		{
			var req = null;
			
			if (window.XMLHttpRequest)
			{
				req = new XMLHttpRequest();
			}
			else if (window.ActiveXObject)
			{
				for (var i = 0; i < Ease.Ajax.msXMLObjs.length; i++)
				{
					try
					{
						req = new ActiveXObject(Ease.Ajax.msXMLObjs[i]);
						break;
					}
					catch (e)
					{
						continue;
					}
				}
			}
			
			if (req != null)
				return req;
			
			Ease.Errors.create('Ease.Ajax.createRequest(): Could not create a XMLHttpRequest.');
		}
	},
	
	handleRequest : function(url,req,properties)
	{
		if (req != null)
		{
			var props = {
				url : url,
				method : 'GET',
				async : true,
				params : null,
				exec : function() { return true; },
				headers : null,
				useCache : false
			};
			
			if (properties && typeof properties == 'object')
			{
				for (var prop in properties)
					props[prop] = properties[prop];
			}
			
			if (req.overrideMimeType)
				req.overrideMimeType('text/xml');
			
			var self = this;
			req.onreadystatechange = function()
			{
				Ease.Ajax.doOnLoad(req,props);
			};
			
			props.method = props.method.toUpperCase();
			if (props.method == 'POST')
			{
				contentTypeIndex = null;
				contentType = null;
				postCharset = null;

				if (props.headers)
				{
					contentTypeIndex = parseInt(props.headers.contains('Content-Type'))
					if (contentTypeIndex != -1)
					{
						contentType = props.headers[parseInt(contentTypeIndex)+1]
						postCharset = contentType.slice(contentType.indexOf(';')+1);
						props.headers.splice(contentTypeIndex,2)
					}
						
					if (props.headers.contains(Ease.Ajax.postHeader[1]) == -1)
						props.headers.push(Ease.Ajax.postHeader[0],postCharset ? Ease.Ajax.postHeader[1] + ' ' + postCharset : Ease.Ajax.postHeader[1]);
				}
				else
				{
					props.headers = [Ease.Ajax.postHeader[0],Ease.Ajax.postHeader[1]];
				}
			}
			else if (props.method == 'GET' && props.params != null) 
			{
				props.url += '?' + props.params;
				props.params = null;
			}
			
			if (props.useCache == false)
			{
				if (props.headers)
					props.headers.push(Ease.Ajax.noCacheHeader[0],Ease.Ajax.noCacheHeader[1]);
				else
					props.headers = Ease.Ajax.noCacheHeader;
			}
			
			req.open(props.method, props.url, props.async);

			if (props.headers)
			{
				for (var i = 0; i < props.headers.length-1; i+=2)
				{
					req.setRequestHeader(props.headers[i],props.headers[i+1]);
					//alert('Wert: ' + props.headers[i] + '\nEigenschaft: ' + props.headers[i+1])
				}
			}
			
			req.send(props.params);
		}
		else
		{
			Ease.Errors.create('Ease.Ajax.handleRequest(): The XMLHttpRequest has failed.');
		}
	},
	
	doOnLoad : function(req,props)
	{
		if (req != null && req.readyState == 4)
		{
			if (req.status == 200 || req.status == 0)
			{
				props.exec();
			}
			else
			{
				Ease.Errors.create('Ease.Ajax.doOnLoad(): The XMLHttpRequest has failed. Error status: ' + req.status);
			}
		}
	}
}

/*
 * Class Ease.Ajax.Request
 * var Ajax = new Ease.Ajax('test.xml',{ params:'abc=true&xyz=true', method:'post', async:true });
 * 
 */
Ease.Ajax.Request = function(url,properties)
{
	this.req = null;
	if (Ease.UA.hasAjax)
	{
		this.url = url;
		this.method = 'GET';
		this.async = true;
		this.params = null;
		this.useForm = false;
		this.responseText = null;
		this.responseXML = null;
		this.responseJSON = null;
		
		if (properties && typeof properties == 'object')
		{
			for (var prop in properties)
			{
				this[prop] = properties[prop];
			}
		}
		
		if (typeof this.useForm == 'number' || this.useForm)
			this.getFormData();
		
		this.req = Ease.Ajax.createRequest();
	}
}

Ease.Ajax.Request.prototype =
{
	getFormData : function()
	{
		var form = this.useForm;
		
		if (typeof form == 'string' || typeof form == 'number')
			form = document.forms[form];
		
		this.url = form.action;
		this.params = Ease.Forms.createRequestStr(form);
	},
	
	// AjaxTest.handleRequest({ exec:function(){ alert(AjaxTest.request.responseText) }, headers:['Content-Type','application/x-www-form-urlencoded'] });
	handle : function(properties)
	{
		if (this.req != null)
		{
			var self = this;
			var props =
			{
				method : this.method,
				async : this.async,
				params : this.params,
				exec : function()
				{
					self.standardExec();
				},
				headers : null,
				useCache : false,
				json : false,
				jsonSecure : false
			}
			
			if (properties && typeof properties == 'object')
			{
				for (var prop in properties)
				{
					if (typeof properties[prop] == 'function' && prop == 'exec')
					{
						props['exec'] = function()
						{
							self.standardExec();
							properties.exec();
						}
					}
					else
					{
						props[prop] = properties[prop];
					}
				}
			}
			
			this.standardExec = function()
			{
				self.responseText = self.req.responseText;
				self.responseXML = self.req.responseXML;
				
				if (props.json)
					self.responseJSON = Ease.JSON.strToJSONObj(self.responseText);
				else if (props.jsonSecure)
					self.responseJSON = Ease.JSON.parseJSON(self.responseText);
			};
			
			Ease.Ajax.handleRequest(this.url,this.req,props);
		}
	},
	
	// AjaxTest.handleJSON({ exec:function(){alert(AjaxTest.responseJSON)} });
	handleJSON : function(properties)
	{
		if (this.req != null)
		{
			var self = this;
			var exec = properties.exec || function() { };
			
			properties = properties || {};
			properties.json = true;
			properties.exec = function()
			{
				self.responseJSON.handleJSON();
				exec();
			}
			
			this.handle(properties);
		}
	},
	
	// AjaxTest.handleXML({ xslUrl:'test.xsl', xslParams:'abc=true&xyz=true', xslApplyTo:'ShowTest', exec:function(){alert(AjaxTest.xslOutput)} headers:['Content-Type','application/x-www-form-urlencoded'] });
	handleXML : function(xslUrl,properties)
	{
		if (this.req != null)
		{
			this.headers = null;
			this.useCache = false;
			this.xslUrl = xslUrl;
			this.xslParams = null;
			this.xslMethod = 'GET';
			this.xslAsync = true;
			this.xslHeaders = null;
			this.xslUseCache = false
			this.applyMethod = 'MS';
			this.applyBefore = null;
			this.target = null;
			this.clearTarget = null;
			this.removeFromTarget = null;
			this.exec = null;
			
			this.responseXSL = null;
			this.xslOutput = null;
			this.xslReq = null;
			
			if (properties && typeof properties == 'object')
			{
				for (var prop in properties)
					this[prop] = properties[prop];
			}
			
			var self = this;
			this.handle(
			{
				useCache : this.useCache,
				headers : this.headers,
				exec : function()
				{
					self.xslReq = new Ease.Ajax.Request(self.xslUrl,{ params:self.xslParams, method:self.xslMethod, async:self.xslAsync });
					self.xslReq.handle(
					{
						useCache : self.xslUseCache,
						headers : self.xslHeaders,
						exec : function()
						{
							var retObj = self.applyMethod == 'W3C' ? true : false;
							
							self.responseXSL = self.xslReq.responseXML;
							self.xslOutput = Ease.DOM.xslTransform(self.responseXML, self.responseXSL, retObj);
							
							if (self.target)
							{
								if (self.applyMethod == 'W3C')
								{
									if (self.clearTarget)
										Ease.DOM.removeAllChildNodes(self.clearTarget);
									else if (self.removeFromTarget)
										Ease.DOM.removeChildNode(self.removeFromTarget);
									
									if (self.applyBefore && !self.clearTarget)
									{
										self.applyBefore = Ease.DOM.getElems(self.applyBefore);
										
										if (self.xslOutput.length)
										{
											for (var i = 0; i < self.xslOutput.length; i++)
												Ease.DOM.getElems(self.target).insertBefore(self.xslOutput[i], self.applyBefore);
										}
										else
										{
											Ease.DOM.getElems(self.target).insertBefore(self.xslOutput, self.applyBefore);
										}
									}
									else
									{
										if (self.xslOutput.length)
										{
											for (var i = 0; i < self.xslOutput.length; i++)
												Ease.DOM.getElems(self.target).appendChild(self.xslOutput[i]);
										}
										else
										{
											Ease.DOM.getElems(self.target).appendChild(self.xslOutput);
										}
									}
									
								}
								else
								{
									Ease.DOM.getElems(self.target).innerHTML = self.xslOutput;
								}
							}
							
							if (self.exec)
								self.exec();
						}
					});
				}
			});
		}
	}
};

/*
 *
 * Object Ease.JSON
 *
 */
Ease.JSON =
{
	objToJSONString : function(obj)
	{
		return obj.toJSONString();
	},
	
	arrToJSONString : function(arr)
	{
		return arr.toJSONString();
	},
	
	parseJSON : function(str)
	{
		return str.parseJSON();
	},
	
	strToJSONObj : function(str)
	{
		return eval('(' + str + ')');
	}
};

/*
 *
 * Object Ease.Events
 *
 */
Ease.Events =
{
	add : function(obj,handler,func,capture)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);

			if (obj.addEventListener)
				obj.addEventListener(handler,func,capture);
			else if (obj.attachEvent)
				obj.attachEvent('on' + handler,func);
			else
				obj['on' + handler] = func;
		}
	},
	
	remove : function(obj,handler,func,capture)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);
			
			if (obj.removeEventListener)
				obj.removeEventListener(handler,func,capture);
			else if (obj.detachEvent)
				obj.detachEvent('on' + handler,func);
			else
				obj['on' + handler] = null;
		}
	},
	
	preventDefault : function(e)
	{
		var e = e ? e : window.event;
		
		if (e.preventDefault)
			e.preventDefault();
		else if (Ease.UA.isIE)
			e.returnValue = false;
		else
			return false;
	},

	stopPropagation : function(e)
	{
		var e = e ? e : window.event;
		
		if (e.stopPropagation)
			e.stopPropagation();
		else if (Ease.UA.isIE)
			e.cancelBubble = true;
	},
	
	findMouse : function(e)
	{
		if (Ease.UA.hasDOM)
		{
			var xOffset, yOffset;
			var e = e ? e : window.event;
			
			if (Ease.UA.isIE)
			{
				if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
				{
					xOffset = document.documentElement.scrollLeft;
					yOffset = document.documentElement.scrollTop;
				}
				else if (document.body)
				{
					xOffset = document.body.scrollLeft;
					yOffset = document.body.scrollTop;
				}
			}
			else
			{
				xOffset = window.pageXOffset;
				yOffset = window.pageYOffset;
			}
			
			var position =
			{
				x : e.clientX,
				y : e.clientY,
				xOffset : e.clientX + xOffset,
				yOffset : e.clientY + yOffset
			}
			
			return position;
		}
	}
};

/*
 *
 * Object Ease.CSS
 *
 */
Ease.CSS =
{
	setDisplay : function()
	{
		if (Ease.UA.hasDOM)
		{
			var args = arguments;
			
			for (var i = 0; i < args.length-1; i+=2)
				Ease.DOM.getElems(args[i]).style.display = args[i+1];
		}
	},
	
	setVisibility : function()
	{
		if (Ease.UA.hasDOM)
		{
			var args = arguments;
			
			for (var i = 0; i < args.length-1; i+=2)
				Ease.DOM.getElems(args[i]).style.visibility = args[i+1];
		}
	},
	
	setPosition : function()
	{
		if (Ease.UA.hasDOM)
		{
			var args = arguments, objStyle;
			
			for (var i = 0; i < args.length-2; i+=3)
			{
				objStyle = Ease.DOM.getElems(args[i]).style;
				objStyle.left = args[i+1] + 'px';
				objStyle.top = args[i+2] + 'px';
			}
		}
	},
	
	setClip : function()
	{
		if (Ease.UA.hasDOM)
		{
			var args = arguments;
			
			for (var i = 0; i<args.length-4; i+=5)
				Ease.DOM.getElems(args[i]).style.clip = 'rect('+ args[i+1] +'px, ' + args[i+2] + 'px, ' + args[i+3] + 'px, ' + args[i+4] + 'px)';
		}
	},
	
	setOpacity : function(obj,opac)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);
			
			if (obj.filters)
			{
				obj.style.filter = 'alpha(opacity=' + opac * 100 +')';
			}
			else
			{
				obj.style.opacity = opac;
				obj.style.setProperty('-moz-opacity',opac,'');
				obj.style.setProperty('-khtml-opacity',opac,'');
			}
		}
	},
	
	addClass : function(obj,className)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);
			
			if (obj.className && !obj.className.match(new RegExp('\\b' + className + '\\b')))
				obj.className += obj.className + ' ' + className;
			else if (!obj.className)
				obj.className = className;
		}
	},
	
	setClass : function(obj,className)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);
			
			obj.className = className;
		}
	},
	
	removeClass : function(obj,className)
	{
		if (Ease.UA.hasDOM)
		{
			obj = Ease.DOM.getElems(obj);
			
			if (obj.className.match(new RegExp('\\b' + className + '\\b')))
				obj.className.replace(new RegExp('\\' + className + '\\'),'');
		}
	}
};

/*
 *
 * Object Ease.Dyn
 *
 */
Ease.Dyn = Ease.Dyn || {};

/*
 *
 * Class Ease.Dyn.Drag
 *
 */
Ease.Dyn.dragZ = 10000;
Ease.Dyn.Drag = function(dragElem,elem,properties)
{
	this.init = false;
	
	if (Ease.UA.hasDOM)
	{
		this.dragElem = Ease.DOM.getElems(dragElem);
		this.dragElem.style.cursor = 'move';
		this.elem = Ease.DOM.getElems(elem);
		this.position = Ease.DOM.getPosition(this.elem)
		this.startX = this.position.x;
		this.startY = this.position.y;
		this.startZ = null;
		this.doOnStart = null;
		this.doOnDrag = null;
		this.doOnStop = null;
		
		if (properties && typeof properties == 'object')
		{
			for (var prop in properties)
				this[prop] = properties[prop];
		}
		
		var self = this;
		Ease.Events.add(this.dragElem,'mousedown',self.startDragFunc = function(e) { self.startDrag(e); },false);
		
		this.init = true;
	}
};

Ease.Dyn.Drag.prototype =
{
	startDrag : function(e)
	{
		if (this.init)
		{
			this.elemPosX = parseInt(this.elem.style.left) || this.startX;
			this.elemPosY = parseInt(this.elem.style.top) || this.startY;
			
			this.mousePos = Ease.Events.findMouse(e);
			this.dragPosX = this.mousePos.xOffset - this.elemPosX;
			this.dragPosY = this.mousePos.yOffset - this.elemPosY;
			
			this.stopZ = this.startZ || Ease.Dyn.dragZ;
			this.elem.style.zIndex = Ease.Dyn.dragZ;
			
			var self = this;
			Ease.Events.add(document,'mousemove',self.dragFunc = function(e) { self.drag(e); },false);
			Ease.Events.add(document,'mouseup',self.stopDragFunc = function(e) { self.stopDrag(e); },false);
			
			if (this.doOnStart)
				this.doOnStart();
			
			Ease.Events.stopPropagation(e);
			Ease.Events.preventDefault(e);
		}
	},
	
	drag : function(e)
	{
		this.mousePos = Ease.Events.findMouse(e);
		this.elemPosX = this.mousePos.xOffset - this.dragPosX;
		this.elemPosY = this.mousePos.yOffset - this.dragPosY;
		this.elemPosX = (this.elemPosX > 0) ? this.elemPosX : 0;
		this.elemPosY = (this.elemPosY > 0) ? this.elemPosY : 0;
		
		Ease.CSS.setPosition(this.elem,this.elemPosX,this.elemPosY);
		
		if (this.doOnDrag)
			this.doOnDrag();
		
		Ease.Events.stopPropagation(e);
		Ease.Events.preventDefault(e);
	},
	
	stopDrag : function(e)
	{
		var self = this;
		Ease.Events.remove(document,'mousemove',self.dragFunc,false);
		Ease.Events.remove(document,'mouseup',self.stopDragFunc,false);
		
		this.elem.style.zIndex = this.stopZ;
		Ease.Dyn.dragZ++;
		
		if (this.doOnStop)
			this.doOnStop();
		
		Ease.Events.stopPropagation(e);
		Ease.Events.preventDefault(e);
	}
};

/*
 *
 * Object Ease.Dyn.Tooltip
 *
 */
Ease.Dyn.Tooltip = Ease.Dyn.Tooltip || {};
Ease.Dyn.Tooltip.init = function(autoCreate,distanceX,distanceY)
{
	if (Ease.UA.hasDOM)
	{
		Ease.Dyn.Tooltip.tipElem = document.createElement('div');
		Ease.Dyn.Tooltip.tipElem.setAttribute('id','Tooltip');
		
		var tipBody = Ease.DOM.getElems({ method:'tagname', find:'body' })[0];
		tipBody.appendChild(Ease.Dyn.Tooltip.tipElem);
		
		Ease.Dyn.Tooltip.init = true;
		
		if (autoCreate == true)
		{
			var tipArr = [];
			var tipCount = 0;
			var findElems = !Ease.UA.isIE || Ease.UA.isIEVersion > 5.5 ? '*' : 'a';
			var allElems = Ease.DOM.getElemsBy({ method:'tagname', find:findElems });
			
			distanceX = typeof distanceX == 'number' ? distanceX : 20;
			distanceY = typeof distanceY == 'number' ? distanceY : 0;
			
			for (var i = 0; i < allElems.length; i++)
			{
				if (allElems[i].title != '')
				{
					tipArr[tipCount] = new Ease.Dyn.Tooltip.Tip(allElems[i],allElems[i].title,distanceX,distanceY);
					tipCount++
				}
			}
		}
	}
};

/*
 *
 * Class Ease.Dyn.Tooltip.Tip
 *
 */
Ease.Dyn.Tooltip.Tip = function(elem,content,distanceX,distanceY)
{
	if (Ease.Dyn.Tooltip.init)
	{
		this.elem = Ease.DOM.getElems(elem);
		
		if (!this.elem)
			return false;
		
		if (!this.elem.title != '')
			this.elem.title = '';
		
		this.content = content;
		this.distanceX = distanceX;
		this.distanceY = distanceY;
		this.show = false;
		
		var self = this;
		Ease.Events.add(this.elem,'mouseover',function(e) { self.showTip(e); },false);
		Ease.Events.add(this.elem,'mousemove',function(e) { self.positionTip(e); },false);
		Ease.Events.add(this.elem,'mouseout',function() { self.hideTip(); },false);
	}
};

Ease.Dyn.Tooltip.Tip.prototype =
{
	showHide : function()
	{
		if (this.show)
		{
			Ease.CSS.setDisplay(Ease.Dyn.Tooltip.tipElem,'inline');
			Ease.CSS.setVisibility(Ease.Dyn.Tooltip.tipElem,'visible');
		}
		else
		{
			Ease.CSS.setDisplay(Ease.Dyn.Tooltip.tipElem,'none');
			Ease.CSS.setVisibility(Ease.Dyn.Tooltip.tipElem,'hidden');
		}
	},
	
	positionTip : function(e)
	{
		this.mousePos = Ease.Events.findMouse(e);
		this.posX = this.mousePos.xOffset + this.distanceX;
		this.posY = this.mousePos.yOffset + this.distanceY;
		
		Ease.CSS.setPosition(Ease.Dyn.Tooltip.tipElem,this.posX,this.posY);
		
		Ease.Events.stopPropagation(e);
		Ease.Events.preventDefault(e);
	},
	
	showTip : function(e)
	{
		Ease.Dyn.Tooltip.tipElem.innerHTML = this.content;
		this.show = true;
		this.showHide();
		
		Ease.Events.stopPropagation(e);
		Ease.Events.preventDefault(e);
	},
	
	hideTip : function()
	{
		this.show = false;
		this.showHide();
		Ease.Dyn.Tooltip.tipElem.innerHTML = '';
	}
};

/*
 *
 * Class Ease.Dyn.Slideout
 *
 */
Ease.Dyn.Slideout = function(slideElem,slideElemHeight,slideElemWidth,slideStepDivider,slideStepMin,slideTimeout,keepPlace)
{
	if (Ease.UA.hasDOM)
	{
		this.slideElem = slideElem;
		this.slideElemHeight = slideElemHeight;
		this.slideElemWidth = slideElemWidth;
		this.slideStepDivider = slideStepDivider;
		this.slideStepMin = slideStepMin;
		this.slideTimeout = slideTimeout;
		this.keepPlace = keepPlace;
		this.slideXStandard = true;
		this.slideYStandard = true;
		this.initDone = false;
	}
}

Ease.Dyn.Slideout.prototype =
{
	init : function()
	{
		if (Ease.UA.hasDOM)
		{
			this.slideElem = Ease.DOM.getElems(this.slideElem);
			this.contentElem = Ease.DOM.findFirstElementNode(this.slideElem);
			this.slideElemHeight = this.slideElem.offsetHeight;
			this.contentElemHeight = this.contentElem.offsetHeight;
			this.slideElemWidth = this.slideElem.offsetWidth;
			this.contentElemWidth = this.contentElem.offsetWidth;
			this.slidedOut = false;
			this.sliding = false;
			this.slidedOutY = false;
			this.slidingY = false;
			this.initDone = true;
		}
	},

	action : function(properties)
	{
		if (this.initDone && !this.sliding && !this.slidingY)
		{
			this.slideX = this.slideXStandard;
			this.slideY = this.slideYStandard;
			
			if (properties)
			{
				for (prop in properties)
					this[prop] = properties[prop];
			}
			
			if (this.slideX)
				this.slideHeight();
			
			if (this.slideY)
				this.slideWidth();

			if (arguments.length > 0)
				this.nextFunc = arguments[0];
			else
				this.nextFunc = null;
		}
	},

	slideHeight : function()
	{
		if (!this.sliding)
		{
			if (!this.slidedOut) 
			{
				this.slideElem.style.display = 'block';
				this.slideElem.style.visibility = 'visible';
			}
				
			this.slideElem.style.overflow = 'hidden';
			this.slideElemHeight = !this.slidedOut ? 0 : this.contentElem.offsetHeight; 
			this.contentElemHeight = !this.slidedOut ? this.contentElem.offsetHeight : this.slideElemHeight;
			this.slideSteps = Math.round(this.contentElemHeight / this.slideStepDivider);
			this.sliding = true;
		}
		
		this.slideElemHeight += !this.slidedOut ? this.slideSteps : -this.slideSteps;
		this.slideSteps -= (this.slideSteps > this.slideStepMin) ? Math.round(this.slideSteps / this.slideStepDivider) : 0;
		this.slideElem.style.height = this.slideElemHeight + 'px';
		
		if ( (!this.slidedOut 
				&& (this.slideElemHeight < this.contentElemHeight - this.slideSteps)) 
					|| (this.slidedOut
						&& (this.slideElemHeight >= this.slideSteps)) )
		{
			var self = this;
			window.setTimeout(function(){self.slideHeight();},this.slideTimeout);
		}
		else
		{
			this.slideElem.style.height = !this.slidedOut ? 'auto' : '1px';
			
			if (this.slidedOut) 
			{
				this.slideElem.style.visibility = 'hidden';
				
				if (!this.keepPlace)
					this.slideElem.style.display = 'none';
			}
			
			this.slidedOut = this.slidedOut ? false : true;
			this.sliding = false;
		}
	},

	slideWidth : function()
	{
		if (!this.slidingY)
		{
			if (!this.slidedOutY) 
			{
				this.slideElem.style.display = 'block';
				this.slideElem.style.visibility = 'visible';
			}
				
			this.slideElem.style.overflow = 'hidden';
			this.slideElemWidth = !this.slidedOutY ? 0 : this.contentElem.offsetWidth; 
			this.contentElemWidth = !this.slidedOut ? this.contentElem.offsetWidth : this.slideElemWidth;
			this.slideStepsY = Math.round(this.contentElemWidth / this.slideStepDivider);
			this.slidingY = true;
		}
		
		this.slideElemWidth += !this.slidedOutY ? this.slideStepsY : -this.slideStepsY;
		this.slideStepsY -= (this.slideStepsY > this.slideStepMin) ? Math.round(this.slideStepsY / this.slideStepDivider) : 0;
		this.slideElem.style.width = this.slideElemWidth + 'px';
		
		if ( (!this.slidedOutY 
				&& (this.slideElemWidth < this.contentElemWidth - this.slideStepsY)) 
					|| (this.slidedOutY
						&& (this.slideElemWidth >= this.slideStepsY)) )
		{
			var self = this;
			window.setTimeout(function(){self.slideWidth();},this.slideTimeout);
		}
		else
		{
			this.slideElem.style.width = !this.slidedOutY ? 'auto' : '1px';
			
			if (this.slidedOutY)
			{
				this.slideElem.style.visibility = 'hidden';
				
				if (!this.keepPlace)
					this.slideElem.style.display = 'none';
			}
			
			this.slidedOutY = this.slidedOutY ? false : true;
			this.slidingY = false;
		}
	}
};

Array.prototype.contains = function(searchStr)
{
	for(var result=[], i = 0; i < this.length; i++)
	{
		if(this[i] == searchStr)
			result[result.length] = i;
	}
	
	return result.length ? result : -1;
};
