//Place at the bottom of page only please
var CBC = {
	UTIL : {
		createCookie : function(name,value,days) {
			if (days) {
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = "; expires="+date.toGMTString();
			}
			else var expires = "";
			document.cookie = name+"="+value+expires+"; path=/";
		},
		readCookie : function(name) {
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for (var i=0;i < ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
			}
			return null;
		},
		eraseCookie : function(name) {
			this.createCookie(name,"",-1);
		},
		debug : function(str) {
			if (typeof console == 'undefined') { } else { console.log(str) };
		},
		ucfirst : function(str) {
			var first_letter = str.toString().substr(0,1).toUpperCase();
			return first_letter + str.substr(1);
		},
		concatArray: function(arr) {
			var ret_arr = [];
			for (var i=0; i<arr.length; i++) {
				ret_arr = ret_arr.concat(arr[i]);
			}
			return ret_arr;
		},
		getElementsById : function() {
			var els = new Array();
			for (var i = 0; i < arguments.length; i++) {
				var el = arguments[i];
				if (typeof el == 'string') el = document.getElementById(el);
				if (arguments.length == 1) return el;
				els.push(el);
			}
			return els;
		},
		getElementsByClassName : function(_classname, parent_el, tag) {
			if (typeof parent_el == 'string') parent_el = document.getElementById(parent_el);
			if (!!document.evaluate) {
				var q = ".//*[contains(concat(' ', @class, ' '), ' " + _classname + " ')]";
				return this.getElementsByXPath(q, parent_el);
			} else {
				var class_els = new Array();
				if (parent_el == null) parent_el = document;
				if (tag == null) tag = '*';
				var els = parent_el.getElementsByTagName(tag);
				var pattern = new RegExp("(^|\\s)"+_classname+"(\\s|$)");
				for (i=0,j=0; i<els.length; i++) {
					if (pattern.test(els[i].className) ) {
						class_els[j] = els[i];
						j++;
					}
				}
				return class_els;
			}
		},
		getElementsByXPath : function(expression, parent_el) {
			if (typeof parent_el == 'string') parent_el = document.getElementById(parent_el);
		  var results = [];
		  var query = document.evaluate(expression, parent_el || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		  for (var i = 0, _length = query.snapshotLength; i < _length; i++) {
		  	results.push(query.snapshotItem(i));
		  }
		  return results;
		},
		makeRequest : function(_url,_events,_o) {
			var XMLHttpFactories = [
				function () {return new XMLHttpRequest()},
				function () {return new ActiveXObject("Msxml2.XMLHTTP")},
				function () {return new ActiveXObject("Msxml3.XMLHTTP")},
				function () {return new ActiveXObject("Microsoft.XMLHTTP")}
			];
			var createReqObj = function() {
				var xmlhttp = false;
				for (var i=0;i<XMLHttpFactories.length;i++) {
					try {
						xmlhttp = XMLHttpFactories[i]();
					} catch(e) {
						continue;
					}
					break;
				}
				return xmlhttp;
			}

			var req = createReqObj();
			if (!req) return;
			var _method = (_o.postData) ? "POST" : "GET";

			req.open(_method,_url,true);
			req.setRequestHeader('User-Agent','XMLHTTP/1.0');
			if (_o.postData) req.setRequestHeader('Content-type','application/x-www-form-urlencoded');

			req.onreadystatechange = function () {
				if (req.readyState != 4) return;
				if (req.status != 200 && req.status != 304) {
					_events.failure.call(_events.context,[req,_o.params]);
					return;
				}
				_events.success.call(_events.context,[req,_o.params]);
			}
			if (req.readyState == 4) return;
			req.send(_o.postData);
		},
		Template : function(_string) {
			this.sourceString = _string;
			this.evaluate = function(_valueSet,_valueLogic) {
				var s = this.sourceString;

				//trying to avoid eval!
				try {
					if (_valueLogic) {
						for (var key in _valueLogic) {
							var regex = new RegExp("\\["+key+": \\{(.*?)\\}\\]","i");
							var set = regex.exec(s);

							if (!set) continue;

							var fullset = set[0];
							var replaceStr = set[1].split('||');
							var strArr = [];
							for (var i=0; i<replaceStr.length; i++) {
								if (replaceStr[i].match(_valueLogic[key]+':')) {
									s = s.replace('#'+fullset,replaceStr[i].substr(replaceStr[i].indexOf(':')+1,replaceStr[i].length));
								}
							}
						}
					}
					if (_valueSet != null) {
						for (var key in _valueSet) {
							var pattern	= '#\{('+key+')\}';
							var regex 	= new RegExp(pattern,'gm');
							s = s.replace(regex,_valueSet[key]);
						}
					}
					return s;
				} catch(e) {
					return 'Difficulty rendering data:'+e+'<br />';
				}
			}
		}
	},

	SETTINGS : {},
	APP : {},
	DOM : YAHOO.util.Dom,
	EVENT : YAHOO.util.Event,
	register : function(_o) {

		try {
			if (_o._nameSpace[_o._name]) return;
			_o._nameSpace[_o._name] = new _o._class();
			if (_o._nameSpace[_o._name].init) _o._nameSpace[_o._name].init(_o._params);
		} catch(e) {
			this.UTIL.debug("Error caught in: \n  file: '/includes/objects/core-v2/core.js' \n  function: CBC.register() \nError thrown is:\n" + e);
		}
	},
	loadAssets : function(_o) {
		var head = document.getElementsByTagName('head')[0];
		var script = document.createElement('script');
		if (_o._id) script.id = _o._id;
		script.type = 'text/javascript';
		script.src = _o._src;
		head.appendChild(script);
	}
}
CBC.SETTINGS = function() {
	var $config = [];
	return{
		getVal : function(_settingName) {
			return $config[_settingName];
		},
		setVal : function(_settingName,_settingValue) {
			$config[_settingName] = _settingValue;
		}
	}
}();
