Element.addMethods({
	//fade out 
	fadeOut: function(element, options) {
		element = $(element);
		if(element.style.display == 'none')
			return false;
			
		if(typeof Scriptaculous != 'undefined' && Effect)
			Effect.Fade(element, options);
		else {
			var afterFinish = ((options && options.afterFinish && typeof options.afterFinish == 'function')
				? options.afterFinish
				: false
			);
			
			var speed = ((options && options.speed) ? ((options.speed <= 0) ? 10 : options.speed) : 10);
			var opNow = 9;
			(function() {
				var interval = window.setInterval(function() {
					if(opNow == 0) {
						clearInterval(interval);
						element.hide();
						if(afterFinish !== false)
							afterFinish();
					} else {
						element.setOpacity('0.' + opNow);
						opNow -= 1;
					}
				}, speed);
			}).defer();
		}
		
		return element;
	},
	
	//fade in
	fadeIn: function(element, options) {
		element = $(element);
		if(element.style.display != 'none')
			return false;
			
		if(typeof Scriptaculous != 'undefined' && Effect)
			Effect.Appear(element, options);
		else {
			var afterFinish = ((options && options.afterFinish && typeof options.afterFinish == 'function')
				? options.afterFinish
				: false
			);
			
			var speed = ((options && options.speed) ? ((options.speed <= 0) ? 10 : options.speed) : 10);
			element.setOpacity('0.0');
			element.show();
			var opNow = 1;
			(function() {
				var interval = window.setInterval(function() {
					if(opNow == 10) {
						clearInterval(interval);
						element.setOpacity('1.0');
						if(afterFinish !== false)
							afterFinish();
					} else {
						element.setOpacity('0.' + opNow);
						opNow += 1;
					}
				}, speed);
			}).defer();
		}
		
		return element;
	}, 
	
	//blink like <blink>foo</blink> but with params "count", "color" and "speed"
	blink: function(element, o, s, color) {
		var max = ((o && o > 0) ? o * 2 : -1);
		var speed = ((s && s > 0) ? s : 100);
		var oColor = element.style.color;
		element.style.visibility = 'hidden';
		if(color) element.style.color = color;
		
		if(max > 0 && max % 2 == 0) max++;
		var count = 1, interval = window.setInterval(function() {
			if(max > 0 && count == max) {
				clearInterval(interval);
				element.style.color = oColor;
				element.style.visibility = '';
			} else {
				element.style.visibility = ((element.style.visibility == 'hidden') ? '' : 'hidden');
				count += 1;
			}
		}, speed);
		
		return {
			stop: function() {
				element.style.visibility = 'visible';
				window.clearInterval(interval);
			}
		};
	},
	
	//copy element
	copyInto: function(element, parent) {
		if(element.parentNode) {
			var e = element.cloneNode(true);
			if(parent && parent.appendChild) parent.appendChild(e);
			return $(e);
		}
		
		throw 'element is not in document';
	},
	
	//cut element and copy into a other
	moveInto: function(element, parent) {
		if(element.parentNode) {
			var e = element.cloneNode(true);
			element.parentNode.removeChild(element);
			if(parent && parent.appendChild) parent.appendChild(e);
			return $(e);
		}
		
		throw 'element is not in document!';
	},
	
	//new elements now are able to extend other elements as method
	insertInto: function(element, parent) {
		if(parent && parent.appendChild) parent.appendChild(element);
		return $(element);
	},
	
	//Global needed!
	insertTime: function(element) {
		$(element).update(Global.DateTime.buildTime());
	},
	
	insertDate: function(element) {
		$(element).update(Global.DateTime.buildDate());
	},
	
	insertDateTime: function(element) {
		$(element).update(Global.DateTime.buildDateTime());
	},
	
	//element innerHTML = clock
	clock: function(element) {
		element = $(element);
		var interval = window.setInterval(function() {
			element.insertDateTime();
		}, 1000);
		
		return interval;
	},
	
	//oldelement replace newelement
	replaceWith: function(element, OldElement) {
		OldElement.parentNode.replaceChild(element, OldElement);
		return $(element);
	}
});

String.prototype.trim = String.prototype.strip;
