var Solveo = {
	version: '1.0'
};

Solveo.apply = function(){
	
	var args = arguments;
	if (!args[1]) args = [this, args[0]];
	for (var property in args[1]) args[0][property] = args[1][property];
	return args[0];
};

Solveo.apply(Solveo, {
	 override: function(){
		var args = arguments;
		if (!args[1]) return Solveo.apply(this, args[0]);
		else return Solveo.apply(args[0].prototype, args[1]); 
	}
	,extend: function(subclass, superclass, overrides){
		
		var oc = Object.prototype.constructor;
		
		if(typeof superclass == 'object'){
			overrides = superclass;
			superclass = subclass;
			subclass = overrides.constructor != oc ? overrides.constructor : function() { superclass.apply(this, arguments); };
		}
	
		var F = function(){}, sbp, spp = superclass.prototype;
		F.prototype = spp;
		sbp = subclass.prototype = new F();
		sbp.constructor = subclass;
		subclass.superclass = spp;
		if(spp.constructor == oc){
			spp.constructor = superclass;
		}
		subclass.override = Solveo.override;
		Solveo.override(subclass, overrides);
		subclass.extend = function(o){ return Solveo.extend(subclass, o); };
		return subclass;
	}

	,isArray : function(v){
		return v && typeof v.pop == 'function';
	}
});


Solveo.Element = function(element) {
	this.dom = typeof element == 'string' ? document.getElementById(element) : element;
	if(!this.dom) return null;
}

Solveo.Element.prototype = {

	 addClass : function(className){
		if(Solveo.isArray(className)){
			for(var i = 0, len = className.length; i < len; i++) {
				this.addClass(className[i]);
			}
		}else{
			if(className && !this.hasClass(className)){
				this.dom.className = this.dom.className + " " + className;
			}
		}
		return this;
	}

	,removeClass : function(className){
		if(!className || !this.dom.className){
			return this;
		}
		if(Solveo.isArray(className)){
			for(var i = 0, len = className.length; i < len; i++) {
				this.removeClass(className[i]);
			}
		}else{
			if(this.hasClass(className)){
				var re = this.classReCache[className];
				if (!re) {
				   re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g");
				   this.classReCache[className] = re;
				}
				this.dom.className =
					this.dom.className.replace(re, " ");
			}
		}
		return this;
	}
	
    // private
    ,classReCache: {}
	
	,toggleClass : function(className){
		if(this.hasClass(className)){
			this.removeClass(className);
		}else{
			this.addClass(className);
		}
		return this;
	}
	
	,parent: function() {
		return new Solveo.Element(this.dom.parentNode);
	}

	,hasClass : function(className){
		return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
	}

	,replaceClass : function(oldClassName, newClassName){
		this.removeClass(oldClassName);
		this.addClass(newClassName);
		return this;
	}
}

Solveo.Element.get = function(element) {
	return new Solveo.Element(element);
}


Solveo.apply(Function.prototype, {
	
	createCallback : function(){
		return this.createDelegate(window, arguments);
	},
	
	createDelegate : function(obj, args){
		var method = this;
		return function() {
			return method.apply(obj, args || new Array());
		};
	}
});

