/*
 * HTML Parser By John Resig (ejohn.org)
 * Original code by Erik Arvidsson, Mozilla Public License
 * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
 *
 * // Use like so:
 * HTMLParser(htmlString, {
 *     start: function(tag, attrs, unary) {},
 *     end: function(tag) {},
 *     chars: function(text) {},
 *     comment: function(text) {}
 * });
 *
 * // or to get an XML string:
 * HTMLtoXML(htmlString);
 *
 * // or to get an XML DOM Document
 * HTMLtoDOM(htmlString);
 *
 * // or to inject into an existing document/DOM node
 * HTMLtoDOM(htmlString, document);
 * HTMLtoDOM(htmlString, document.body);
 *
 */

function lag(lagnavn) // IE4+
{
if (document.all[lagnavn].style.display == 'none') {
    document.all[lagnavn].style.display = 'block';
   
} else {
    document.all[lagnavn].style.display = 'none';
   
}
}

(function(){

	// Regular Expressions for parsing tags and attributes
	var startTag = /^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
		endTag = /^<\/(\w+)[^>]*>/,
		attr = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
		
	// Empty Elements - HTML 4.01
	var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed");

	// Block Elements - HTML 4.01
	var block = makeMap("address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul");

	// Inline Elements - HTML 4.01
	var inline = makeMap("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");

	// Elements that you can, intentionally, leave open
	// (and which close themselves)
	var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");

	// Attributes that have their values filled in disabled="disabled"
	var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected");

	// Special Elements (can contain anything)
	var special = makeMap("script,style");

	var HTMLParser = this.HTMLParser = function( html, handler ) {
		var index, chars, match, stack = [], last = html;
		stack.last = function(){
			return this[ this.length - 1 ];
		};

		while ( html ) {
			chars = true;

			// Make sure we're not in a script or style element
			if ( !stack.last() || !special[ stack.last() ] ) {

				// Comment
				if ( html.indexOf("<!--") == 0 ) {
					index = html.indexOf("-->");
	
					if ( index >= 0 ) {
						if ( handler.comment )
							handler.comment( html.substring( 4, index ) );
						html = html.substring( index + 3 );
						chars = false;
					}
	
				// end tag
				} else if ( html.indexOf("</") == 0 ) {
					match = html.match( endTag );
	
					if ( match ) {
						html = html.substring( match[0].length );
						match[0].replace( endTag, parseEndTag );
						chars = false;
					}
	
				// start tag
				} else if ( html.indexOf("<") == 0 ) {
					match = html.match( startTag );
	
					if ( match ) {
						html = html.substring( match[0].length );
						match[0].replace( startTag, parseStartTag );
						chars = false;
					}
				}

				if ( chars ) {
					index = html.indexOf("<");
					
					var text = index < 0 ? html : html.substring( 0, index );
					html = index < 0 ? "" : html.substring( index );
					
					if ( handler.chars )
						handler.chars( text );
				}

			} else {
				html = html.replace(new RegExp("(.*)<\/" + stack.last() + "[^>]*>"), function(all, text){
					text = text.replace(/<!--(.*?)-->/g, "$1")
						.replace(/<!\[CDATA\[(.*?)]]>/g, "$1");

					if ( handler.chars )
						handler.chars( text );

					return "";
				});

				parseEndTag( "", stack.last() );
			}

			if ( html == last )
				throw "Parse Error: " + html;
			last = html;
		}
		
		// Clean up any remaining tags
		parseEndTag();

		function parseStartTag( tag, tagName, rest, unary ) {
			if ( block[ tagName ] ) {
				while ( stack.last() && inline[ stack.last() ] ) {
					parseEndTag( "", stack.last() );
				}
			}

			if ( closeSelf[ tagName ] && stack.last() == tagName ) {
				parseEndTag( "", tagName );
			}

			unary = empty[ tagName ] || !!unary;

			if ( !unary )
				stack.push( tagName );
			
			if ( handler.start ) {
				var attrs = [];
	
				rest.replace(attr, function(match, name) {
					var value = arguments[2] ? arguments[2] :
						arguments[3] ? arguments[3] :
						arguments[4] ? arguments[4] :
						fillAttrs[name] ? name : "";
					
					attrs.push({
						name: name,
						value: value,
						escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //"
					});
				});
	
				if ( handler.start )
					handler.start( tagName, attrs, unary );
			}
		}

		function parseEndTag( tag, tagName ) {
			// If no tag name is provided, clean shop
			if ( !tagName )
				var pos = 0;
				
			// Find the closest opened tag of the same type
			else
				for ( var pos = stack.length - 1; pos >= 0; pos-- )
					if ( stack[ pos ] == tagName )
						break;
			
			if ( pos >= 0 ) {
				// Close all the open elements, up the stack
				for ( var i = stack.length - 1; i >= pos; i-- )
					if ( handler.end )
						handler.end( stack[ i ] );
				
				// Remove the open elements from the stack
				stack.length = pos;
			}
		}
	};
	
	this.HTMLtoXML = function( html ) {
		var results = "";
		
		HTMLParser(html, {
			start: function( tag, attrs, unary ) {
				results += "<" + tag;
		
				for ( var i = 0; i < attrs.length; i++ )
					results += " " + attrs[i].name + '="' + attrs[i].escaped + '"';
		
				results += (unary ? "/" : "") + ">";
			},
			end: function( tag ) {
				results += "</" + tag + ">";
			},
			chars: function( text ) {
				results += text;
			},
			comment: function( text ) {
				results += "<!--" + text + "-->";
			}
		});
		
		return results;
	};
	
	this.HTMLtoDOM = function( html, doc ) {
		// There can be only one of these elements
		var one = makeMap("html,head,body,title");
		
		// Enforce a structure for the document
		var structure = {
			link: "head",
			base: "head"
		};
	
		if ( !doc ) {
			if ( typeof DOMDocument != "undefined" )
				doc = new DOMDocument();
			else if ( typeof document != "undefined" && document.implementation && document.implementation.createDocument )
				doc = document.implementation.createDocument("", "", null);
			else if ( typeof ActiveX != "undefined" )
				doc = new ActiveXObject("Msxml.DOMDocument");
			
		} else
			doc = doc.ownerDocument ||
				doc.getOwnerDocument && doc.getOwnerDocument() ||
				doc;
		
		var elems = [],
			documentElement = doc.documentElement ||
				doc.getDocumentElement && doc.getDocumentElement();
				
		// If we're dealing with an empty document then we
		// need to pre-populate it with the HTML document structure
		if ( !documentElement && doc.createElement ) (function(){
			var html = doc.createElement("html");
			var head = doc.createElement("head");
			head.appendChild( doc.createElement("title") );
			html.appendChild( head );
			html.appendChild( doc.createElement("body") );
			doc.appendChild( html );
		})();
		
		// Find all the unique elements
		if ( doc.getElementsByTagName )
			for ( var i in one )
				one[ i ] = doc.getElementsByTagName( i )[0];
		
		// If we're working with a document, inject contents into
		// the body element
		var curParentNode = doc.createDocumentFragment();
		var result = curParentNode;
		
		HTMLParser( html, {
			start: function( tagName, attrs, unary ) {
				// If it's a pre-built element, then we can ignore
				// its construction
				if ( one[ tagName ] ) {
					curParentNode = one[ tagName ];
					return;
				}
			
				var elem = doc.createElement( tagName );
				
				for ( var attr in attrs ) {
					if (attrs[attr].name == 'style') {
						setStyle(elem, attrs[attr].value);
					} else if (attrs[attr].name == 'class') {
						elem.className = attrs[attr].value.decode();
					} else {
						elem.setAttribute( attrs[ attr ].name, attrs[ attr ].value.decode() );
					}
				}
				
				if ( structure[ tagName ] && typeof one[ structure[ tagName ] ] != "boolean" )

					one[ structure[ tagName ] ].appendChild( elem );
				
				else if ( curParentNode && curParentNode.appendChild )
					curParentNode.appendChild( elem );
					
				if ( !unary ) {
					elems.push( elem );
					curParentNode = elem;
				}
			},
			end: function( tag ) {
				elems.length -= 1;
				
				// Init the new parentNode
				curParentNode = elems[ elems.length - 1 ];
			},
			chars: function( text ) {
				if (!text.match(/^\s+$/))
					curParentNode.appendChild( doc.createTextNode( text.decode() ) );
			},
			comment: function( text ) {
				// create comment node
			}
		});
		
		return result;
	};

	function makeMap(str){
		var obj = {}, items = str.split(",");
		for ( var i = 0; i < items.length; i++ )
			obj[ items[i] ] = true;
		return obj;
	}

	var camelCase = (function(){
		var reg = /\-([a-z])/g;
		function f(a, l) {
			return l.toUpperCase();
		}
		return function(s) {
			if (s == 'float')
				s = 'cssFloat';
			else
				s = s.replace(reg, f);
			return s;
		};
	})();

	function setStyle(elm, style) {
		style = style.split(/\s*;\s*/);
		var reg = /^([^\s:]+)\s*:\s*(.*)$/, s;
		for (var i = 0; i < style.length; i++) {
			s = style[i].match(reg);
			if (s) {
				elm.style[camelCase(s[1])] = s[2];
			}
		}
	}
})();
/**
 * End of HTML Parser
 */





(function() {
	if (typeof window.XMLHttpRequest === 'undefined') {
		window.XMLHttpRequest = function() {
			var t = [
				'Msxml2.XMLHTTP.6.0',
				'Msxml2.XMLHTTP.3.0',
				'Msxml2.XMLHTTP',
				'Microsoft.XMLHTTP'
			];
			var result = null;
			for (var i = 0; i < t.length && !result; i++) {
				try {
					result = new ActiveXObject(t[i]);
				} catch (e) {}
			}
			if (!result) {
				throw new Error('XMLHttpRequest not supported');
			}
			return result;
		};
	}

	if (!window.getComputedStyle) {
		window.getComputedStyle = function(el, pseudo) {
			return {
				getPropertyValue: function (prop) {
					var re = /(-([a-z]){1})/g;
					if (prop == 'float') prop = 'styleFloat';
					if (re.test(prop)) {
						prop = prop.replace(re, function () {
							return arguments[2].toUpperCase();
						});
					}
					var result = el.currentStyle[prop] ? el.currentStyle[prop] : null;
					switch (prop) {
						case 'opacity':
							if (result === null)
								result = 1;
							break;
						case 'height':
							if (result === 'auto') {
								result = el.clientHeight;
							}
							break;
						case 'width':
							if (result === 'auto') {
								result = el.clientWidth;
							}
							break;
					}
					return result;
				}
			};
		}
	}

}());

/**
 * @param object Object with following attributes
 *   id:       string   Id of element to affect, or the element it self
 *   from:     int      Start value
 *   to:       int      End value
 *   style:    string   Which style to affect
 *   duration: int      Effect duration in seconds [optional]
 *   type:     string   A valid effect from the effect-library or a callback-function [optional]
 *   callback: function Userdefined callback instead of the default "setToPosition" [optional]
 *   finish:   string   Final value for the effect, can also be a callback-function [optional]
 */
window.Effect = function(object) {
	this.from = typeof object.from === 'number' ? object.from : 0;
	this.to = typeof object.to === 'number' ? object.to : 1;
	this.duration = typeof object.duration === 'number' ? object.duration : 2;
	this.style = object.style.replace(/\-([a-z])/, function(l, a){
		return a.toUpperCase();
	});
	this.prefix = this.style === 'opacity' ? '' : 'px';
	if (typeof this.prefix === 'undefined')
		this.prefix = '';
	this.element = typeof object.id === 'string' ? document.getElementById(object.id) : object.id;
	this.type = typeof object.type === 'string' ? window.Effect[object.type] : object.type;
	if (typeof this.type !== 'function')
		this.type = window.Effect.linear;
	this.callback = typeof object.callback === 'function' ? object.callback : this.setToPosition;
	this.finish = typeof object.finish === 'function' ? object.finish : (typeof object.finish === 'string' ? function(){
		this.element.style[this.style] = object.finish;
	} : function(){});
};

window.Effect.prototype = {

	setToPosition: function(x) {
		this.element.style[this.style] = x + this.prefix;
		if (this.style === 'opacity') {
			this.element.style.filter = 'alpha(opacity='+Math.round(x*100)+')';
		}
	},

	calc: function(step, steps) {
		return this.from - this.type(step / steps) * (this.from - this.to);
	},

	start: function() {
		if (this.duration <= 0) {
			this.duration = 0.04;
		}
		var steps = Math.floor(this.duration/0.04), step = 1;
		this.setToPosition(this.from);
		var me = this;
		var interval = setInterval(function(){
			if (step < steps) {
				me.callback(me.calc(step++, steps));
			} else {
				clearInterval(interval);
				me.callback(me.calc(1, 1));
				me.finish();
			}
		}, 40);
	}

};

window.Effect.power = function (a, b) {
	if (!b) {
		b = 3;
	}
	b = b - b % 2 + 1;
	return a < 0.5 ? Math.pow(a * 2, b) / 2 : Math.pow((a - 1) * 2, b) / 2 + 1;
};
window.Effect.root = function (a, b) {
	if (!b) {
		b = 2;
	}
	return Math.pow(a, 1 / b);
};
window.Effect.circle = function (a) {
	return Math.sqrt(1 - Math.pow(a - 1, 2));
};
window.Effect.circle2 = function (a) {
	return 1 - Math.sqrt(1 - Math.pow(a, 2));
};
window.Effect.linear = function (a) {
	return a;
};
window.Effect.sinoidal = function (a) {
	return - Math.cos(a * Math.PI) / 2 + 0.5;
};
window.Effect.sine = window.Effect.sinoidal; // stupid name
window.Effect.reverse = function (a) {
	return 1 - a;
};
window.Effect.flicker = function (a) {
	a = - Math.cos(a * Math.PI) / 4 + 0.75 + Math.random() / 4;
	return a > 1 ? 1 : a;
};
window.Effect.wobble = function (a) {
	return - Math.cos(a * Math.PI * (9 * a)) / 2 + 0.5;
};
window.Effect.pulse = function (a, b) {
	b = b || 5;
	return Math.round(a % (1 / b) * b) == 0 ? a * b * 2 - Math.floor(a * b * 2) : 1 - (a * b * 2 - Math.floor(a * b * 2));
};
window.Effect.spring = function (a) {
	return 1 - Math.cos(a * 4.5 * Math.PI) * Math.exp(- a * 6);
};
window.Effect.none = function (a) {
	return 0;
};
window.Effect.full = function (a) {
	return 1;
};

window.Ajax = (function(){
	function makeRequest(type, url) {
		var request = new XMLHttpRequest();
		request.open(type, url, true);
		if (type == 'POST') {
			request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		return request;
	};
	function preparePostData(data) {
        if (data && typeof data === 'object') {
            var list = [];
            for (var i in data) {
                list.push(encodeURIComponent(i)+'='+encodeURIComponent(data[i]));
            }
            data = list.join('&');
        } else {
            data = null;
        }
		return data;
	};
	var specialTags = /^\s*<(li|tr|td|tbody|thead|tfoot|th|caption|colgroup|col|dd|dt)(?:\s|>)/i;
	var specialTops = {
		li: 'ul',
		tr: 'tbody',
		tbody: 'table',
		thead: 'table',
		tfoot: 'table',
		th: 'tr',
		td: 'tr',
		caption: 'table',
		colgroup: 'table',
		col: 'colgroup',
		dd: 'dl',
		dt: 'dl'
	};
	function createFragment(content) {
		/*
		var absoluteTop;
		var tags = [];
		var top;
		var fragment = document.createDocumentFragment();
		var tag = content.match(specialTags);
		if (tag) {
			tag = tag[1].toLowerCase();
			tag = specialTops[tag];
			while (specialTops[tag]) {
				tags.push(tag);
				tag = specialTops[tag];
			}
			top = absoluteTop = document.createElement(tag);
			for (var i = tags.length -1; i >= 0; i--) {
				top = top.appendChild(document.createElement(tags[i]));
			}
		} else {
			top = document.createElement('div');
		}*/
		content = content.trim();
		var fragment;
		if (!{tr:1,td:1,tbody:1,thead:1,tfoot:1,li:1,dd:1,dt:1}[(content.match(/<([a-z]+)/) || [,'br'])[1]]) {
			var div = document.createElement('div');
			var scripts = [];
			content = content.replace(/<script[^>]*>((?:.|[\r\n])*?)<\/script>/gm, function(l, s){
				scripts.push(s);
				return '';
			});
			div.innerHTML = content;
			fragment = document.createDocumentFragment();
			while (div.firstChild) {
				fragment.appendChild(div.firstChild);
			}
			setTimeout(function(){
				for (var i = 0; i < scripts.length; i++) {
					(new Function(scripts[i])).call(window);
				}
			}, 1);
		} else {
			fragment = HTMLtoDOM(content, document);
		}
		return fragment
		// return fragment;
	};

	function getStyle(element, style) {
		return window.getComputedStyle(element, null).getPropertyValue(style);
	};
	var insertType = /^(before|after|append|insert[0-9]*|replace)\s+([^\s]+)(?:\s+remove\s*(.*))?$/;
	/**
	 * before id
	 *   Indsætter indholdet før elementet med det id.
	 * after id
	 *   Indsætter indholdet efter elementet med det id.
	 * append id
	 *   Indsætter indholdet inde i elementet som det sidste
	 * insert[tal] id
	 *   Indsætter indholdet på [tal]'s position, eller først i elementet
	 * replace id
	 *   Erstatter hele elementet med indholdet
	 * Efter strengen kan der skrives "remove id".
	 * Hvis id undlades fjernes linket som aktiverede ajax, ellers fjernes elementet med det id.
	 */
	function handleResult(id, html, sender) {
		var type = id.match(insertType);
		var index, remove = null;
		if (type) {
			id = type[2];
			if (typeof type[3] == 'string')
				remove = type[3] == '' ? sender : document.getElementById(type[3]);
			type = type[1];
			index = type.match(/^insert([0-9]*)/);
			if (index) {
				index = index[1];
				if (!index)
					index = 0;
				type = 'insert';
			}
		}
		id = document.getElementById(id);
		if (id) {
			html = createFragment(html);
			function execute() {
				var result = html.firstChild;
				while (result && result.nodeType != 1 || result.tagName == 'script')
					result = result.nextSibling;
				switch (type) {
					case 'before':
						id.parentNode.insertBefore(html, id);
						break;
					case 'after':
						id.parentNode.insertBefore(html, id.nextSibling);
						break;
					case 'append':
						id.appendChild(html);
						break;
					case 'insert':
						index = id.childNodes[index];
						if (!index)
							index = null;
						id.insertBefore(html, index);
						break;
					case 'replace':
						id.parentNode.replaceChild(html, id);
						break;
					default:
						while (id.firstChild)
							id.removeChild(id.firstChild);
						id.appendChild(html);
						break;
				}
				return result;
			}
			
			var m = sender.className.match(/\s+effect(?:_([a-z\-]+))?/);
			if (m) {
				var style = m[1] || 'height';
				var element = id;
				var from = parseInt(getStyle(element, style), 10), to;
				switch (type) {
					case 'before':
					case 'after':
						element = id.parentNode;
					case 'append':
					case 'insert':
						if (style == 'opacity')
							from = 0;
						element.style.overflow = 'hidden';
						execute();
						to = parseInt(getStyle(element, style), 10);
						(new window.Effect({
							id: element,
							from: from,
							to: to,
							duration: 1,
							style: style,
							type: 'sine',
							finish: ''
						})).start();
						break;
					case 'replace':
						element = id.parentNode;
					default:
						element.style.overflow = 'hidden';
						(new window.Effect({
							id: element,
							from: from,
							to: 0,
							duration: (id.childNodes.length > 1 || (id.firstChild && (id.firstChild.nodeType == 1 || !id.firstChild.nodeValue.match(/^\s*$/)))) ? 1 : 0,
							style: style,
							type: 'sine',
							finish: function() {
								var result = execute();
								if (type == 'replace') {
									element = result;
									element.style.overflow = 'hidden';
								} else {
									element.style[style] = '';
								}
								to = parseInt(getStyle(element, style), 10);
								(new window.Effect({
									id: element,
									from: 0,
									to: to,
									duration: 1,
									style: style,
									type: 'sine',
									finish: ''
								})).start();
							}
						})).start();
						break;
				}
			} else {
				execute();
			}
		}
		if (remove) {
			remove.parentNode.removeChild(remove);
		}
	};
	function setCallback(request, id, sender) {
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				switch (request.status) {
					case 200:
						handleResult(id, request.responseText, sender);
						break;
					case 500:
						alert('Der skete en fejl. Der er sendt en e-mail til udviklerne med problemet.');
						break;
					default:
						alert('Noget gik ikke som det skulle...');
						break;
				}
			}
		};
	};
	return {
		/**
		 * Accepted parameters:
		 * url: Url to request
		 * id: Puts the response of the request into the element with this id
		 */
		get: function(object) {
			var request = null;
			if (typeof object.url === 'string') {
				request = makeRequest('GET', object.url);
				if (object.id) {
					setCallback(request, object.id, object.sender);
				}
				request.send(null);
			}
			return request;
		},
		/**
		 * Accepted parameters:
		 * url: Url to request
		 * id: Puts the response of the request into the element with this id,
		 * data: Object with attributes (ex. {search: 'string', type: 15})
		 */
		post: function(object) {
			var request = null;
			if (typeof object.url === 'string') {
				request = makeRequest('POST', object.url);
				if (object.id) {
					setCallback(request, object.id);
				}
				request.send(preparePostData(object.data));
			}
			return request;
		}
	}
})();

if (!document.addEventListener) {
	document.addEventListener = function(type, listener, useCapture) {
		document.attachEvent('on'+type, function(){
			listener.call(document, window.event);
		});
	};
}

document.addEventListener('click', function(event) {
	var elm, result=true;
	if (elm = (event.target || event.srcElement)) {
		while (elm && elm.tagName != 'A') {
			elm = elm.parentNode;
		}
		if (elm && elm.className.match(/(?:^|\s+)ajax(?:\s+|$)/)) {
			var object = {
				url: elm.getAttribute('href'),
				id: elm.getAttribute('rel'),
				sender: elm
			};
			if (object.id && object.url) {
				if (event.preventDefault)
					event.preventDefault();
				result = false;
				Ajax.get(object);
			}
		}
	}
	return event.returnValue = result;
}, false);

(function(){
	var timeout = 0, request;

	function getValue(input) {
		var result = [], i;
		switch (input.tagName) {
			case 'INPUT':
				switch (input.type) {
					case 'text':
					case 'hidden':
					case 'file':
					case 'password':
						result = [input.name, input.value];
						break;
					case 'checkbox':
					case 'radio':
						if (input.checked)
							result = [input.name, input.value];
						break;
					case 'image':
					case 'submit':
						break;
				}
				break;
			case 'TEXTAREA':
				result = [input.name, input.value];
				break;
			case 'SELECT':
				for (var i = 0; i < input.options.length; i++) {
					if (input.options[i].selected) {
						result.push(input.name);
						result.push(input.options[i].value);
					}
				}
				break;
			case 'OBJECT':
			case 'BUTTON':
				break;
		}
		return result;
	}

	function search(form) {
		var elements = form.elements, data = [], value, i, j, url = form.action;
		for (i = 0; i < elements.length; i++) {
			var value = getValue(elements[i]);
			for (j = 0; j < value.length; j += 2) {
				data.push(encodeURIComponent(value[j])+'='+encodeURIComponent(value[j+1]));
			}
		}
		if (url == '') {
			url = window.location.href;
		}
		if (url.match(/\?.+/)) {
			url += '&';
		} else if (url[url.length-1] != '?') {
			url += '?';
		}
		if (request && request.readyState != 4) {
			request.abort();
		}
		request = Ajax.get({
			url: url + data.join('&'),
			id: (form.className.match(/ajax\s(\S+)/) || [null,null])[1],
			sender:	form
		});
	};

	function run(event) {
		var target = event.target || event.srcElement, form, valid = false;
		switch (target.tagName) {
			case 'INPUT':
				valid = (({text:1,file:1,password:1})[target.type] && event.type == 'keyup') ||
					(({radio:1,checkbox:1})[target.type] && ({click:1,change:1})[event.type]);
				break;
			case 'SELECT':
				valid = ({select:1,change:1})[event.type];
				break;
			case 'TEXTAREA':
				valid = event.type == 'keyup';
				break;
		}
		if (valid) {
			form = target.form;
			if (form && form.method == 'get' && form.className.match(/(?:^|\s+)ajax(?:\s+|$)/)) {
				clearTimeout(timeout);
				valid = !(target.tagName == 'INPUT' && ({text:1,file:1,password:1})[target.type] && target.value == '');
				if (valid) {
					timeout = setTimeout(function(){
						search(form);
					}, 350);
				}
			}
		}
	};

	document.addEventListener('keyup', run, false);
	document.addEventListener('change', run, false);
	document.addEventListener('click', run, false);
	document.addEventListener('select', run, false);
}());

window.goas = {
	openDeltager: function(event, anchor) {
		event = event || window.event;
		var tr = anchor.parentNode.parentNode;
		if (event.preventDefault)
			event.preventDefault();
		if (event.stopPropagation)
			event.stopPropagation();
		if (anchor.className == 'open') {
			anchor.className = 'closed';
			anchor.firstChild.src = '/images/green/menu_elementer/plus.gif';
			var next = tr.nextSibling;
			while (next && next.nodeType != 1)
				next = next.nextSibling;
			if (next && next.id == '') {
				tr.parentNode.removeChild(next);
			}
		} else {
			anchor.className = 'open';
			anchor.firstChild.src = '/images/green/menu_elementer/minus.gif';
			Ajax.get({
				url: anchor.href,
				id: 'after '+tr.id,
				sender: anchor
			});
		}
		return false;
	}
};

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, "");
};

String.prototype.decode = (function () {
	var entities = {
		AElig: "\xC6",
		Oslash: "\xD8",
		Aring: "\xC5",
		aelig: "\xE6",
		oslash: "\xF8",
		aring: "\xE5",
		eacute: "\xE9",

		Eacute: "C9",
		amp: "&",
		quot: '"',
		apos: "'",
		lt: "<",
		gt: ">",
		nbsp: "\xA0"
	},
	reg = /&((\w|#)+);/g,
	func = function (a, entity) {
		var result;
		if (entities[entity]) {
			result = entities[entity];
		} else {
			if (result = entity.match(/#([0-9]+)/)) {
				result = String.fromCharCode(parseInt(result[1]))
			} else {
				result = entity;
			}
		}
		return result;
	};
	return function () {
		return this.replace(reg, func);
	}
})();

//<input type="text" onblur="goas.datoCheck(this);" />

goas.datoCheck = function(input) {
	var value = input.value;
	if (value == '') return;
	var run = false;
	value = value.replace(/^([0-9]{2})[^0-9]*([0-9]{2})[^0-9]*([0-9]{2,4})$/, function(all, date, month, year){
		run = month >= 1 && month <= 12 && date >= 1 && date <= 31;
		var now = new Date();
		if (year < 100) {
			year = parseInt(year, 10);
			now = now.getYear() - 100;
			if (year <= now)
				year += 2000;
			else
				year += 1900;
		}
		return date + '-' + month + '-' + year;
	});
	if (!run) {
		alert("Fejl i dato\nSkal skrives: dd-mm-åååå");
	}
	input.value = value;
};
