/**
 * Classy - classy classes for JavaScript
 *
 * :copyright: (c) 2011 by Armin Ronacher. 
 * :license: BSD.
 */
(function(a){function j(a){e=!0;var b=new a;e=!1;return b}function i(b,c){return Object.prototype.hasOwnProperty.call(b,c)?b[c]:a}function h(b,c,d){d===a?delete b[c]:b[c]=d}function g(a){return!f||/\B\$super\b/.test(a.toString())}var b="1.4",c=this,d=c.Class,e=!1,f=function(){$super()}.toString().indexOf("$super")>0,k=function(){};k.$noConflict=function(){try{h(c,"Class",d)}catch(a){c.Class=d}return k},k.$classyVersion=b,k.$extend=function(b){var d=this.prototype,f=j(this);if(b.__include__)for(var l=0,m=b.__include__.length;l!=m;++l){var n=b.__include__[l];for(var o in n){var p=i(n,o);p!==a&&(f[o]=n[o])}}b.__classvars__=b.__classvars__||{};if(f.__classvars__)for(var q in f.__classvars__)if(!b.__classvars__[q]){var p=i(f.__classvars__,q);b.__classvars__[q]=p}for(var o in b){var p=i(b,o);if(o==="__include__"||p===a)continue;f[o]=typeof p=="function"&&g(p)?function(a,b){return function(){var c=i(this,"$super");this.$super=d[b];try{return a.apply(this,arguments)}finally{h(this,"$super",c)}}}(p,o):p}var r=function(){if(!e){var a=c===this?j(arguments.callee):this;a.__init__&&a.__init__.apply(a,arguments),a.$class=r;return a}};for(var q in b.__classvars__){var p=i(b.__classvars__,q);p!==a&&(r[q]=p)}r.prototype=f,r.constructor=r,r.$extend=k.$extend,r.$withData=k.$withData;return r},k.$withData=function(b){var c=j(this);for(var d in b){var e=i(b,d);e!==a&&(c[d]=e)}return c},c.Class=k})()

/**
 *  @author Rafaël Blais Masson (iXmédia)
 */
if(!window.console){window.console={log:function(){}};}
(function() {

var DomWrapper = Class.$extend({
	
	__init__: function(element) {
		this._ = element;
		this.eventHandlers = [];
		this.eventHandlerWrappers = [];
		this.guid = $.guid();
	},
	
	parent: function(tagName) {
		if (this._ === undefined || this._ === null) return this;
		var currentParent = this._.parentNode || null;
		if (tagName)
			while (currentParent)
				if (currentParent.tagName === tagName.toUpperCase())
					break;
				else
					currentParent = currentParent.parentNode;
					
		return $(currentParent);
	},
	
	hasClass: function(className) {
		if (this._ === undefined || this._ === null) return this;
		var regexp = new RegExp('\\b' + className + '\\b');
		return regexp.test(this._.className);
	},
	
	addClass: function(className) {
		if (this._ === undefined || this._ === null) return this;
		if (!this.hasClass(className))
			this._.className += className;
		return this;
	},
	
	removeClass: function(className) {
		if (this._ === undefined || this._ === null) return this;
		var regexp = new RegExp('\\b' + className + '\\b');
		this._.className = this._.className.replace(regexp, '');
		return this;
	},
	
	children: function(tagOrClassName) {
		if (this._ === undefined || this._ === null) return this;
		var array = [], nodeList = this._.childNodes;
		
		// find by className
		if (tagOrClassName.indexOf('.') === 0)
			for (var l = nodeList.length, n = 0; n < l; n++)
				if (nodeList[n].tagName && $(nodeList[n]).hasClass(tagOrClassName))
					array.push($(nodeList[n]));
		// find by tagName
		else
			for (var l = nodeList.length, n = 0; n < l; n++)
				if (nodeList[n].tagName === tagOrClassName.toUpperCase())
					array.push($(nodeList[n]));
		
		return array;
	},
	
	get: function(prop) {
		if (this._ === undefined || this._ === null) return this;
		return this._[ prop ];
	},
	
	set: function(prop, value) {
		if (this._ === undefined || this._ === null) return this;
		this._[ prop ] = value;
		return this;
	},
	
	on: function(eventName, handler) {
		if (this._ === undefined || this._ === null) return this;
		var this_ = this;
		
		var realEventName;
		if (eventName == 'mouseenter' || eventName == 'mouseleave')
			realEventName = (eventName == 'mouseenter') ? 'mouseover' : 'mouseout';
		else
			realEventName = eventName;
		
		var addEventMethodName;
		if (this_._.addEventListener) {
			addEventMethodName = 'addEventListener';
		} else {
			addEventMethodName = 'attachEvent';
			realEventName = 'on' + realEventName;
		}
		
		var eventHandlerWrapper = function(e) {
			
			if (!e.currentTarget)
				e.currentTarget = this_._;
			
			if (!e.target)
				e.target = e.srcElement;
			
			if (!e.stopPropagation)
				e.stopPropagation = function() { e.cancelBubble = true };
			
			if (!e.preventDefault)
				e.preventDefault = function() { e.returnValue = false };
			
			if (eventName == 'mouseenter' || eventName == 'mouseleave') {
				if (!e.relatedTarget)
					e.relatedTarget = (eventName == 'mouseenter') ? e.fromElement : e.toElement;
				
				if (e.relatedTarget != this_._ && !$(e.relatedTarget).isDescendantOf(this_._))
					handler.call(this_._, e);
			} else {
				handler.call(this_._, e);
			}
			
		}
		this_.eventHandlerWrappers.push(eventHandlerWrapper);
		this_.eventHandlers.push(handler);
		
		this_._[addEventMethodName](realEventName, eventHandlerWrapper, false);
		
		return this;
	},
	
	removeEvent: function(eventName, handler) {
		if (this._ === undefined || this._ === null) return this;
		var this_ = this;
		
		var eventHandlerWrapper, eventHandlerWrapperIndex = this_.eventHandlers.indexOf(handler);
		if (eventHandlerWrapperIndex !== -1) {
			eventHandlerWrapper = this_.eventHandlerWrappers[ eventHandlerWrapperIndex ];
			
			var realEventName = eventName;
			
			var removeEventMethodName;
			if (this_._.removeEventListener) {
				removeEventMethodName = 'removeEventListener';
			} else {
				removeEventMethodName = 'detachEvent';
				realEventName = 'on' + eventName;
			}
			
			this_._[removeEventMethodName](realEventName, eventHandlerWrapper, false);
			delete this_.eventHandlers[ eventHandlerWrapperIndex ];
			delete this_.eventHandlerWrappers[ eventHandlerWrapperIndex ];
		}
	},
	
	isDescendantOf: function(possibleParent) {
		if (this._ === undefined || this._ === null) return this;
		
		var currentParent = this._.parentNode;
		while (currentParent) {
			if (currentParent == possibleParent) return true;
			currentParent = currentParent.parentNode;
		}
		return false;
	}
	
});

window.$ = function(elementOrElementId) {
	var element = (typeof elementOrElementId == 'string') ? document.getElementById(elementOrElementId) : elementOrElementId;
	var wrappedElementIndex = window.$.wrappedElements.indexOf(element);
	if (wrappedElementIndex !== -1) {
		var domWrapper = window.$.domWrappers[ wrappedElementIndex ];
		return domWrapper;
	} else {
		window.$.wrappedElements.push(element);
		var newDomWrapper = new DomWrapper(element);
		window.$.domWrappers.push(newDomWrapper);
		return newDomWrapper;
	}
}
window.$.wrappedElements = [];
window.$.domWrappers = [];

$.guid = (function() {
	var guid = 1;
	return function() { return guid++ }
})();

/* logic {{{
******************************************************************************/

(function() {
	var initialValue = $('email')._.value;
	$('email').on('focus', function() {
		if (this.value === initialValue) this.value = '';
	}).on('blur', function() {
		if (this.value === '') this.value = initialValue;
	});
})();

/* }}} */
})();

