var Campaign = Campaign || function() {
	// Set up Campaign namespace
	
	var Core = {
		addEvent: function (object,e,callback) {
			if(window.addEventListener){ // Mozilla, Netscape, Firefox
				object.addEventListener(e, callback, false);
			} else { // IE
				object.attachEvent('on' + e, callback);
			}
		},
		getTarget: function (e) {
			e = e || window.event;				// W3 || IE
			return e.target || e.srcElement;	// W3 || IE
		}
	};

	var elementList = function() { 		
		this.elements = [];

		this.getFromIds = function(els) {
			this.elements = [];
			var i = els.length;
	
			while(i--) {
				var element = els[i];
				//var element = els[i];
				if (typeof element == 'string') {
					element = document.getElementById(element);
				}
				this.elements.push(element);
			}
			
			return this;
		}
		
		this.getFromClassName = function(searchClass,node,tag) {
			// get elements by classname. If parent is set, pull subnodes from parent rathern
			// than from document.root
			this.elements = [];
			
			if (node == null) {
				node = document;
			}
			if (tag == null) {
				tag = '*';
			}
			var els = node.getElementsByTagName(tag);
			
			var i = els.length;
			var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)');
			
			while(i--) {
				if ( pattern.test(els[i].className) ) {
					this.elements.push(els[i]);
				}
			}
			return this;
		}

		this.count = function() {
			return this.elements.length;
		}
		
		this.item = function(index) {
			return this.elements[index];
		}
	
		this.each = function(f_ptr) {
			var i = this.elements.length;
			while(i--) {
				f_ptr.call(this, this.elements[i]);
			}
		}
		
		this.cancel = function() {
			this.each(function(el) { el.onclick = function() { return false; } });
		}

		this.on = function(e, f_ptr) {
			this.each(
				function(el) { 
					Campaign.Core.addEvent.call(this, el, e, 
						function(){f_ptr.call(this,el)}); 
			});
		}
	};

	window.$ = function() {
		var args = arguments;
    	var els = new elementList();
		els.getFromIds(args);
		return els;
	}

	window.$$ = function(searchClass,node,tag) {
    	var els = new elementList();
		els.getFromClassName(searchClass,node,tag);
		return els;
	}

	return {	
		Core: Core,
		toString: function() { 
			return 'Campaign';
		}
	};
}();

Campaign.Loader = function(){
	var scripts = Array();
	var callbacks = Array();
	
	function _include_file(path) {
		var script = document.createElement('script');
		script.type = 'text/javascript';
		script.src = path;
		document.getElementsByTagName('head').item(0).appendChild(script);
	}
	
	function _library_path() {
		var cur, scripts = document.getElementsByTagName('script');
		var i = scripts.length;
		while(cur = scripts[--i]) {
			if(cur.src) {
				var path = cur.src.split('/');
				var filename = path.pop();
				if(filename == 'master.js') {			
					return path.join('/') + '/';
				}
			}
		}
		return false;
	}
	
	function _file_included(path) {
		var scripts = document.getElementsByTagName('scripts');
		var i = scripts.length;
		while(i--) {
			if(scripts.src == path) {
				return true;
			}
		}
		return false;
	}
	
	return {
		Load: function(filename, callback) {
			var path = _library_path() + filename;
			if(!path) {
				return false;	
			}
			if(!_file_included(path)) {
				_include_file(path);

				scripts.push(path);
				callbacks.push(callback);

				window.setTimeout('Campaign.Loader.check(\''+path+'\');',10);
			}
		},
		
		check: function(path) {
			var i = -1;
			while(i++ < scripts.length) {
				if(scripts[i] == path) {
					if(callbacks[i]) {
						callbacks[i]();
						callbacks.splice(i,1);
					}
					scripts.splice(i,1);					
					return true;
				}
			}
			window.setTimeout(function(){Campaign.Loader.check(path)},10);
			return false;
		},
		status: function() {
			return scripts.length;
		}
	};
}();

/*Campaign.Controls = {
	is_loaded: false,
	lazy: function(callback) {
		Campaign.Loader.Load('/test/rj/js/interface.js',callback);
	},
	Swap: function() {
		var args = arguments;
		Campaign.Interface.lazy(function() { Campaign.Interface.Swap.apply(Campaign.Interface, args); });
	},
	Toggle: function() {
		var args = arguments;
		Campaign.Interface.lazy(function() { Campaign.Interface.Toggle.apply(Campaign.Interface, args); });
	}
}*/