/**
 * cog.js javascript utility library.
 * @Author Ikenna Agbasimalo
 */
(function(window) {
	var document = window.document;
	
	//ensure a global XMLHttpRequest object is available...
	//Ref: Apress Pro Javascript Techniques - John Resig.
	if(typeof window.XMLHttpRequest == "undefined") {
		XMLHttpRequest = function() {
			var o = new ActiveXObject(Microsoft.XMLHTTP || Msxml2.XMLHTTP);
			return o;
		};
	}

	//Rewriting the javascript alert function to add a small feature that enables it to accept comma-separated arguments...
	var tempAlert = window.alert; //keep reference;
	window.alert = function(args) {
		if(arguments.length == 0){
			tempAlert();
		}
		if(arguments.length == 1){
			tempAlert(arguments[0]);
		}
		if(arguments.length > 1){
			var str = "";
			for(var i=0; i<arguments.length; i++){
				str += arguments[i];
			}
			tempAlert(str);
		}
	};
	
	/*cog starts...*/

	//The cog object...
	$cog = {};

	$cog.domCollectionToArray = function(dc) {
		var arr = [];
		for(var i = 0; i < dc.length; i++) {
			arr.push(dc[i]);
		}
		return arr;
	};

	/*
	 *Ref: http://htmldog.com/reference/htmltags/
	 *Date: Feb-29-2010
	 *'doctype' tag left out in this list below.
	 **/
	var htmltags = "a abbr acronym address area base b base bdo big blockquote " +
					"body br button caption cite code col colgroup dd del dfn div " +
					"dl dt em fieldset form h1 h2 h3 h4 h5 h6 head html hr " +
					"i iframe img input ins kbd label legend li link map meta noscript " +
					"object ol optgroup option p param pre q samp script select small " +
					"span strong style sub sup table tbody td textarea tfoot th thead " +
					"title tr tt ul var";
	$cog.htmltags = htmltags.split(/\s/);

	$cog.isWindow = function(arg) {
		if(!arg) return false;
		if(arg.alert != undefined && arg.self != undefined) {
			return true;
		}
		return false;
	};

	$cog.isFrame = function(arg) {
		if(!arg) return false;
		if(arg.Document || arg.contentDocument) {
			return true;
		}
		return false;
	};

	$cog.isDocumentElement = function(arg) {
		if(!arg) return false;
		if(arg.getElementById && arg.createElement) {
			return true;
		}
		return false;
	};

	$cog.isNode = function(arg) {
		if(!arg) return false;
		if(arg.nodeName && arg.nodeType){
			return true;
		}
		return false;
	};

	$cog.isCollection = function(arg) {
		if(arg.length && !$cog.isWindow(arg) && !$cog.isFrame(arg) && arg.constructor != Function) {
			return true;
		}
		return false;
	};

	/*************************************************************************************/

	$cog.elem = function(id) {
		return document.getElementById(id);
	};

	$cog.timer = function(t) {
		var intervalId = 0;
		var delay = t && t.constructor==Number ? t : 20; //ms
		this.start = function(fn, _delay) {
			if(fn && fn.constructor == Function) {
				//function to be executed at intervals was passed.
				intervalId = setInterval(fn, (_delay || delay));
			}
		};
		this.stop = function(fn) {
			clearInterval(intervalId);
			if(fn && fn.constructor == Function) {
				fn();
			}
			this.reset();
		};
		this.reset = function() {
			intervalId = 0;
		};
		return this;
	};/*end $cog.timer()*/

	$cog.file = function(){
		var $file = {};
		$file.text = "";

		var x = {};
		x.args = arguments;

		if(x.args.length > 0) {
			x.url = $cog.util.url(x.args[0]).appendUID();
		}

//		$file.save = function(){
//			//save file to location on server; can i use a POST AJAX request?
//		};

		$file.onready = function(fn){
			var xhr = new XMLHttpRequest();
			xhr.open("GET", x.url);
			xhr.send();
			xhr.onreadystatechange = function(){
				if(xhr.readyState == 4){
					$file.text = xhr.responseText;
					fn.call($file);
				}
			};
		};
		return $file;
	};//end $cog.file

	$cog.toggler = function() {
		var tog = {};
		var val = true;
		tog.toggle = function(fnOn, fnOff) {
			if(val === true) {
				fnOff();
				val = false;
			} else if(val === false) {
				fnOn();
				val = true;
			}
		}
		return tog;
	};//end $cog.toggler()

	$cog.queue = function(len) {
		var qu = {};
		qu.prototype = Array.prototype;
		qu = [];
		len = (len.constructor!=Number || len==undefined) ? 0 : len;

		qu.add = function(val) {
			if(qu.length === len) {
				qu.shift(qu[0]);
			}
			qu.push(val);
		};

		qu.test = function(arg) {
			var flag = false;
			if(arg.constructor == Array) {
				flag = true;
				for( var i=0; i<arg.length; i++ ) {
					if(qu[i] != arg[i]){
						flag = false;
						break;
					}
				}
				return flag;
			} else if(arg.constructor == String) {
				flag = true;
				var arrArg = arg.split(/\,\s/);
				for( var j=0; j<arrArg.length; j++ ) {
					if(qu[j] != arrArg[j]) {
						flag = false;
						break;
					}
				}
				return flag;
			} else {
				return flag;
			}
		};

		qu.reset = function() {
			//qu = [];
			qu = [];
			qu.prototype = Array.prototype;
		};

		qu.isFull = function() {
			if(qu.length === len) {
				return true;
			}
			return false;
		};

		return qu;
	};//end $cog.queue();

	$cog.lengthObject = function(dim) {
		var o = {};
		o.unit = 0;
		o.value = "";
		if(dim.constructor == String) {
			//var re_cssDimension = /(\d+)(\D*)/;
			var matches = /(\d+)(\D*)/.exec(dim);
			if(matches) {
				o.value = matches[1] ? matches[1] : 0;
				o.unit = matches[2] ? matches[2] : "";
			} else {
				o.value = 0;
				o.unit = "";
			}
		}
		if(dim.constructor == Number) {
			o.value = parseInt(dim);
			o.unit = "px";
		}
		o.full = o.value + o.unit;
		return o;
	};

	$cog.util = {};

	$cog.util.getIframeDocument = function(iframe) {
		return iframe.Document || iframe.contentDocument;
	};
	
	$cog.dom = function(docElement) {
		/*arg is an expected valid document element*/

		var doc = window.document; //default initial value;
		var $dom = {}; //wrapper object;
		
		if(docElement && docElement.createElement) {
			doc = docElement;
		}

		$dom.nodeTypeMap = {
			ELEMENT : 1,
			ATTRIBUTE : 2,
			TEXT : 3,
			COMMENT : 8,
			DOCUMENT : 9
		};

		$dom.isready = function() {
			return (doc && doc.body && doc.getElementById && doc.getElementsByTagName) ? true : false;
		};

		$dom.getById = function(elemId) {
			return (doc.getElementById(elemId));
		};

		$dom.getAll = function() {
			return doc.getElementsByTagName("*");
		};

		$dom.getAllTag = function(tag) {
			return doc.getElementsByTagName(tag.toUpperCase());
		};

		$dom.getHtmlTag = function() {
			return doc.getElementsByTagName("HTML")[0];
		};

		$dom.getHeadTag = function() {
			return doc.getElementsByTagName("HEAD")[0];
		};

		$dom.getByClassName = function(targetClassName) {
			if(!targetClassName) return false;
			var all = doc.getElementsByTagName("*");
			var o, elems = [];
			for(var i = 0; i < all.length; i++) {
				o = all[i];
				if(o.className && $cog.util.string(o.className).containsSpaceDelimitedWord(targetClassName)) {
					elems.push(o);
				}
			}
			return elems;
		};

		$dom.getByClassName = function(targetClassName) {
			return $dom.getByClassName(targetClassName);
		};

		$dom.getByClassName_first = function(targetClassName) {
			var o;
			var all = doc.getElementsByTagName("*");
			for(var i = 0; i < all.length; i++) {
				o = all[i];
				if(o.className && $cog.util.string(o.className).containsSpaceDelimitedWord(targetClassName)) {
					return o;
				}
			}
			return o;
		};

		$dom.getByClassName_nth = function(targetClassName, n) {
			var o;
			var all = $dom.getAll();
			var ni = n - 1;
			for(var i = 0; i < all.length; i++) {
				o = all[i];
				if(o.className && $cog.util.string(o.className).containsSpaceDelimitedWord(targetClassName) && i == ni) {
					return o;
				}
			}
		};

		$dom.getByAttr = function(attr) {
			try {
				var o;
				var all = $dom.getAll();
				var allWithAttr = [];
				for(var i = 0; i < all.length; i++) {
					o = all[i];
					if($dom.node(o).getAttr(attr)) {
						allWithAttr.push(o);
					}
				}
				return allWithAttr;
			} catch(ex) {
				ex.show("$cog.dom().getByAttr(): ") || alert("$cog.dom().getByAttr(): " + ex.message);
				throw(ex);
			}
		};

		$dom.getByAttrVal = function(attr, attrVal) {
			try{
				var all_attr = $dom.getByAttr(attr);
				var all_attrVal = [];
				for(var i = 0; i < all_attr.length; i++) {
					if($dom.node(all_attr[i]).getAttr(attr) == attrVal) {
						all_attrVal.push(all_attr[i]);
					}
				}
				return all_attrVal;
			} catch(ex) {
				ex.show("$cog.dom().getByAttrVal") || alert("$cog.dom.getByAttrVal(): " + ex.message);
			}
		};
		//An Inner Class
		$dom.node = function(arg) {
			var $node = {};
			var node;

			if(arg === undefined) {
				return false;
			}

			if(arg.nodeType) {
				//=>a dom node
				node = arg;
			} else if(arg.constructor == String) {
				//=>a string representing the element id
				node = $dom.getById(arg);
			} else {
				return false;
			}
			var isIE = function() {
				return $cog.util.browser.isIE();
			};
			$node.getById = function(elemId) {
				//incomplete...
			};
			$node.getAll = function() {
				if($node.hasChildren()) {
					return node.getElementsByTagName("*");
				}
				return false;
			};
			$node.getAllTag = function(tag) {
				return node.getElementsByTagName( tag == "*" ? "*" : tag.toUpperCase());
			};
			$node.getByClassName = function(targetClassName) {
				if(node == null) {
					return null;
				}
				var allInElement = node.getElementsByTagName("*");
				var o, elems = [];
				for(var i = 0; i < allInElement.length; i++) {
					o = allInElement[i];
					if(o.className && $cog.util.string(o.className).containsSpaceDelimitedWord(targetClassName)) {
						elems.push(o);
					}
				}
				return elems;
			};
			$node.getByClassName_first = function(targetClassName) {
				var o;
				var allInElement = node.getElementsByTagName("*");
				for(var i = 0; i < allInElement.length; i++) {
					o = allInElement[i];
					if(o.className && $cog.util.string(o.className).containsSpaceDelimitedWord(targetClassName)) {
						return o;
					}
				}
				return o;
			};			
			$node.getByClassName_nth = function(targetClassName, n) {
				var o;
				var allInElem = node.getElementsByTagName("*");
				var ni = n - 1;
				for(var i=0; i < allInElem; i++) {
					o = allInElem[i];
					if(o.className && $cog.util.string(o.className).containsSpaceDelimitedWord(targetClassName) && i == ni) {
						return o;
					}
				}
			};			
			$node.getAttr = function(attr) {
				if(node.nodeType != $dom.nodeTypeMap.ELEMENT) {
					return undefined;
				}
				if(attr.toLowerCase() == "class"){
					return isIE() ? node.getAttribute("className") : node.getAttribute("class") ;
				} else if(attr.toLowerCase() == "style") {
					return isIE() ? node.style.getAttribute("cssText") : node.getAttribute("style");
				} else if(attr.toLowerCase() == "cellspacing") {
					return isIE()?node.getAttribute("cellSpacing"):node.getAttribute("cellspacing");
				} else if(attr.toLowerCase() == "cellpadding") {
					return isIE()?node.getAttribute("cellPadding"):node.getAtttribute("cellpadding");
				} else if(attr == "href") {
					if(node.getAttribute("href")) {
						var attrib = node.getAttribute("href");
						if(attrib.charAt(attrib.length - 1) == "#") {
							attrib = "#";
						}
						return attrib;
					}
					return node.getAttribute("href");
				}
				return node.getAttribute(attr);
			};			
			$node.setAttr = function(attr, val) {
				if(node.nodeType != $dom.nodeTypeMap.ELEMENT) {
					return;
				}
				if(attr.toLowerCase() == "class") {
					isIE() ? node.setAttribute("className", val) : node.setAttribute("class", val) ;
					return;
				} else if(attr.toLowerCase() == "style") {
					isIE() ? node.style.setAttribute("cssText", val) : node.setAttribute("style", val) ;
					return;
				} else if(attr.toLowerCase() == "cellspacing") {
					isIE() ? node.setAttribute("cellSpacing", val) : node.setAttribute("cellspacing", val);
				} else if(attr.toLowerCase() == "cellpadding") {
					isIE() ? node.setAttribute("cellPadding", val) : node.setAttribute("cellpadding", val);
				} else {
					node.setAttribute(attr, val);
				}
			};			
			$node.getByAttr = function(attr) {
				try {
					var descs = $node.getAll();
					var descs_attr = [];					
					for(var i = 0; i < descs.length; i++) {
						var nodeUtil = $dom.node(descs[i]);
						if(nodeUtil.getAttribute(attr)) {
							descs_attr.push(descs[i]);
						}
					}
					return descs_attr;
				} catch(ex) {
					ex.show();
					throw(ex);
				}
			};			
			$node.getByAttrVal = function(attr, attrVal) {
				var descs_attr = $node.getByAttr(attr);
				var descs_attrVal = [];
				for(var i = 0; i < descs_attr.length; i++) {
					var nodeUtil = $dom.node(descs_attr[i]);
					if(nodeUtil.getAttribute(attr) == attrVal) {
						descs_attrVal.push(descs_attr[i]);
					}
				}
				return descs_attrVal;
			};			
			$node.ancestorCheck = function() {
				if(!node || !node.parentNode ||
					$cog.util.string(node.nodeName.toLowerCase()).equals("html", "body") ||
					$cog.util.string(node.parentNode.nodeName.toLowerCase()).equals("#document", "html")) {
					return false;
				}
				else {
					return true;
				}
			};
			$node.getAncestorElements = function() {
				if(!$node.ancestorCheck()) {
					return 0;
				}
				var ancestors = [];
				ancestors.push(node.parentNode);

				function recur(o) {
					if($cog.util.string(o.nodeName.toLowerCase()).equals("#document", "html", "body")) {
						return;
					} else if(o.parentNode) {
						ancestors.push(o.parentNode);
						recur(o.parentNode);
					}
				}
				recur(node.parentNode);
				return ancestors;
			};
			
			$node.getClosestAncestorThatIs = function(tag) {
				/*I somehow doubt the credibility of this function*/
				if(!$node.ancestorCheck()) {
					return 0;
				}
				var ancestorElem;
				function recur(o) {
					if($cog.util.string(o.nodeName.toLowerCase()).equals("#document", "html")) {
						return;
					}
					if(o.nodeName.toLowerCase() == tag) {
						ancestorElem = o;
						return;
					} else {
						if(o.parentNode) {
							recur(o.parentNode );
						}
					}
				}
				recur(node.parentNode);
				return ancestorElem;
			};

			$node.getAncestorByClassName = function(className) {
				if(!$node.ancestorCheck()) {
					return false;
				}
				var ancestor;
				function recur(o) {
					if($cog.util.string(o.nodeName.toLowerCase()).equals("html", "body")) {
						return;
					}
					if(o.className) {
						if(o.className.equals(className)) {
							ancestor = o;
							return;
						} else {
							if(o.parentNode) {
								recur(o.parentNode);
							}
						}
					} else if(o.parentNode) {
						recur(o.parentNode);
					}
				}
				recur(node.parentNode);
				return ancestor;
			};

			$node.getNextSibling = function() {
				var ns = node.nextSibling;
				while(ns && ns.nodeType != 1) {
					ns = ns.nextSibling;
				}
				return ns;
			};

			$node.getPreviousSibling = function() {
				/*returns the previous sibling of elem*/
				var ps = node.previousSibling;
				while(ps && ps.nodeType != 1) {
					ps = ps.previousSibling;
				}
				return ps;
			};

			$node.getFirstChild = function() {
				/*returns the first child element in elem*/
				var fc = node.firstChild;
				while(fc && fc.nodeType != 1) {
					fc = fc.nextSibling;
				}
				return fc;
			};

			$node.getLastChild = function() {
				/*returns the last child element in elem*/
				var lc = node.lastChild;
				while(lc && lc.nodeType != 1) {
					lc = lc.previousSibling;
				}
				return lc;
			};

			$node.getNthChild = function(n) {
				/*returns the nth child in elem*/
				var children = node.childNodes;
				if(children.length > 0) {
					return $node.getChildren()[n-1];
				}
			};

			$node.getChildren = function() {
				if(!node || !node.childNodes) {
					return false;
				}
				var children = node.childNodes;
				var elementNodes = [];
				for(var i = 0; i < children.length; i++) {
					if(children[i].nodeType == 1) {
						elementNodes.push(children[i]);
					}
				}
				return elementNodes;
			};
			
			$node.hasChildren = function() {
				return ($node.getChildren().length > 0) ? true : false;
			};

			$node.append = function(childNode) {
				if(childNode){
					node.appendChild(childNode);
				}
			};
			
			$node.appendTo = function(receivingNode) {
				if(receivingNode){
					receivingNode.appendChild(node);
				}				
			};

			$node.prepend = function(childNode) {
				if(childNode) {
					if($node.hasChildren()) {
						node.insertBefore(childNode, $node.getFirstChild());
					}
				}
			};

			$node.prependTo = function(receivingNode) {
				if(receivingNode){
					var $receivingNode = new $dom.node(receivingNode);
					$receivingNode.prepend(node);
				}
			};

			$node.insert = function(childNode, n) {
				if(childNode) {
					if($node.hasChildren) {
						if(n > 0 && n < $node.getChildren().length) {
							node.insertBefore(childNode, $node.getNthChild(n));
						} else if(n > $node.getChildren().length) {
							node.appendChild(childNode);
						}
					} else {
						//no children just append
						node.appendChild(childNode);
					}
				}
			};
			
			return $node;
		}; //end $cog.dom.node class
		return $dom;
	};/*end $cog.dom class*/
	$cog.node = $cog.dom().node;
	
	$cog.util.element = function(el) {
		var $el = {};

		$el.getWidth = function() {
			if(!el) {
				return null;
			}
			return el.offsetWidth || el.clientWidth;
		};

		$el.getHSpan = function() {
			//returns height with border, and margin
			if(!el){
				return null;
			}
			var mL = new $cog.lengthObject(el.style.marginLeft);
			var mR = new $cog.lengthObject(el.style.marginRight);
			var boxW = parseInt(mL?mL.value:0) + parseInt(mR?mR.value:0) + $el.getWidth();
			return boxW;
		};

		$el.getHeight = function() {
			if(!el) {
				return null;
			}
			return el.offsetHeight || el.clientHeight;
		};

		$el.getVSpan = function() {
			//returns height with margin
			if(!el){
				return null;
			}
			var mT = new $cog.lengthObject(el.style.marginTop);
			var mB = new $cog.lengthObject(el.style.marginBottom);
			var boxH = parseInt(mT?mT.value:0) + parseInt(mB?mB.value:0) + $el.getHeight();
			return boxH;
		};
		
		$el.setWidth = function(newWidth) {
			var lo = new $cog.lengthObject(newWidth);
			newWidth = lo.full;
			el.style.width = newWidth;
		};

		$el.setHeight = function(newHeight) {
			var lo = $cog.lengthObject(newHeight);
			newHeight = lo.full;
			el.style.height = newHeight;
		};
		
		$el.getX = function() {
			var x;
			if(!el) {
				return null;
			}
			x = el.offsetLeft;
			function recur(el) {
				if(el.offsetParent && el.offsetParent.nodeName.toLowerCase() != "body") {
					el = el.offsetParent;
					x += el.offsetLeft;
					recur(el);
				}
			}
			recur(el);
			return x;
		};

		$el.setX = function(xval) {
			if(el){
				xval = new $cog.lengthObject(xval);
				el.style.position = el.style.position != "absolute" ? "absolute" : el.style.position;
				el.style.left = xval.full;
			}
		};

		$el.getY = function() {
			var y;
			if(!el) {
				return null;
			}
			y = el.offsetTop;
			function recur(el) {
				if(el.offsetParent && el.offsetParent.nodeName.toLowerCase() != "body") {
					el = el.offsetParent;
					y += el.offsetTop;
					recur(el);
				}
			}
			recur(el);
			return y;
		};

		$el.setY = function(yval) {
			if(el){
				yval = new $cog.lengthObject(yval);
				el.style.position = el.style.position != "absolute" ? "absolute" : el.style.position;
				el.style.top = yval.full;
			}
		};

		$el.getXInParent = function() {
			var x;
			if(el && el.parentNode) {
				x = $el.getX() - $cog.util.element(el.parentNode).getX();
			}
			return x;
		};

		$el.getYInParent = function() {
			var y;
			if(el && el.parentNode) {
				y = $el.getY() - $cog.util.element(el.parentNode).getY();
			}
			return y;
		};

		$el.getLeftSpace = function() {
			return $el.getX();
		};

		$el.getRightSpace = function() {
			return $cog.util.browser.viewport.width() - ($el.getX() + $el.getWidth());
		};

		$el.getTopSpace = function() {
			return $cog.util.element(el).getY();
		};

		$el.getBottomSpace = function() {
			return $cog.util.browser.viewport.height() - ($el.getY() + $el.getWidth());
		};

		$el.getLeftScreenOffset = function() {
			return $cog.util.browser.getLeftScreenOffset() + $el.getX();
		};

		$el.getRightScreenOffset = function() {
			//subtract the sum of the left screen offset and the width from the screen width
		};

		$el.getTopScreenOffset = function() {

		};

		$el.getBottomScreenOffset = function() {

		};

		$el.isRightClear = function(d) {
			return ($el.getRightSpace() > d) ? true : false;
		};

		$el.isLeftClear = function(d) {
			return ($el.getX() > d) ? true : false;
		};

		$el.isTopClear = function(d) {
			return ($el.getY() > d) ? true : false;
		};
		
		$el.isBottomClear = function(d) {
			return ($el.getBottomSpace() > d) ? true : false;
		};

		$el.getAlpha = function() {
			if($cog.util.browser.isIE()){
				return el.style.filter;
			}
			return el.style.opacity || el.style.filter;
		};

		$el.setAlpha = function(percentVal) {
			if(percentVal!==undefined){
				el.style.opacity = percentVal/100; //NS
				el.style.filter = "alpha(opacity=" + percentVal + ")"; //IE
			}
		};
		
		return $el;
	};/*end $cog.util.element()*/

	$cog.util.object = function(o) {
		var $ob = {}; //wrapper object

		$ob.isNull = function() {
			return (o === null) ? true : false;
		};

		$ob.isObject = function() {
			return o.constructor == Object ? true : false;
		};

		$ob.isNumber = function() {
			return o.constructor == Number ? true : false;
		};
		$ob.isBoolean = function() {
			return o.constructor == Boolean ? true : false;
		};

		$ob.isArray = function() {
			return o.constructor == Array ? true : false;
		};

		$ob.isString = function() {
			return o.constructor == String ? true : false;
		};

		$ob.isFunction = function() {
			return o.constructor == Function ? true : false;
		};

		$ob.isUserObject = function() {
			return o.constructor == User ? true : false;
		};

		$ob.isRegExp = function() {
			return o.constructor == RegExp ? true : false;
		};

		$ob.isEmptyString = function() {
			return o === "" ? true : false;
		};

		$ob.isEmpty = function() {
			if($ob.getMemberCount() === 0) {
				return true;
			}
			return false;
		};

		$ob.getMembers = function() {
			var members = [];
			for(var i in o) {
				if(o.hasOwnProperty(i)) {
					members.push(i);
				}
			}
			return members;
		};

		$ob.getMemberCount = function() {
			return $ob.getMembers(o).length;
		};

		$ob.hasMembers = function() {
			return $ob.getMemberCount(o) > 0 ? true : false;
		};

		$ob.hasProperty = function(prop) {
			for(var ob in o) {
				if(ob.toString() == prop) {
					return true;
				}
			}
			return false;
		};

		$ob.equals = function() {
			var matched;
			var expectedNumArgs = 1;
			if(arguments.length < expectedNumArgs) {
				return false;
			}
			for(var i = 0; i < arguments.length; i++) {
				if(o == arguments[i]) {
					matched = true;
					break;
				}
			}
			return matched ? true : false;
		};

		$ob.serialize = function() {
			var s = [];
			if(o.constructor==Array) {
				for(var i = 0; i < o.length; i++) {
					s.push(o[i].name + "=" + encodeURIComponent(o[i].value));
				}
			} else {
				for(var j in o) {
					if(o.hasOwnProperty(j)) {
						s.push(j + "=" + encodeURIComponent(o[j]));
					}
				}
			}
			return s.join("&");
		};

		return $ob;
	};/*end $cog.util.object()*/

	$cog.util.math = {};
	
	$cog.util.math.random = {
		r : 1,
		fr : 2,
		max : 100,
		getFresh : function() {
			this.r = Math.ceil(Math.random() * this.max);
			if(this.r == this.fr) {
				if(this.r == this.max){
					this.r--;
				} else if(this.r == 1){
					this.r++;
				} else {
					this.r++;
				}
				this.fr = this.r;
				return this.r;
			} else {
				this.fr = this.r;
				return this.r;
			}
		}
	};

	$cog.util.math.isEven = function(n){
		var quot = n/2;
		if(/(\.5)$/.test(quot.toString())){
			return false;
		}
		return true;
	};

	$cog.util.math.isOdd = function(n){
		if(!$cog.util.math.isEven(n)){
			return true;
		}
		return false;
	};

	$cog.util.math.isPrime = function(n){
		//return true if n is a prime number
		for(var i=2; i<n; i++) {
			if($cog.util.math.mod(n,i) == 0){
				return false;
			}
		}
		return true;
	};

	$cog.util.math.mod = function(a, b){
		//return the remainder of a/b.
		return a - (Math.floor(a/b) * b);
	};

	$cog.util.math.fact = function(n){
		//return n! (factorial)
		var fact = 1;
		for(var i=1; i<=n; i++){
			fact *= i;
		}
		return fact;
	};
	
	$cog.util.math.factors = function(n){
		//returns an array of numbers that n can be cleanly divided into
		var factors = [];
		for(var i=1; i<=n; i++){
			if($cog.util.math.mod(n, i) == 0){
				factors.push(i);
			}
		}
		return factors;
	};

	$cog.util.url = function(url) {
		var $url = {};
		$url.hasQuerystring = function() {
			var re_querystring = /\?((.+=.*)&)*/;
			if(url.match(re_querystring)) {
				return true;
			} else {
				return false;
			}
		};
		$url.appendQuerystring = function(qs) {
			if($url.hasQuerystring()) {
				url += qs;
			} else {
				url += "?";
				url += qs;
			}
			return url;
		};
		$url.appendUID = function(){
			var uniq = $cog.util.date().getTimeStamp();
			if(!$url.hasQuerystring()) {
				return url + "?r=" + uniq;
			}
			return url + "&r=" + uniq;
		};
		return $url;
	};/*end $cog.util.url()*/

	$cog.util.array = function(arr) {
		var $arr = {};
		
		if(arr != undefined) {
			$arr.clear = function() {
				arr = [];
				return arr;
			};
			$arr.containsString = function(stringToFind) {
				var matched;
				for(var i=0; i < arr.length; i++) {
					if(arr[i].constructor == String && arr[i] === stringToFind) {
						matched = true;
						break;
					}
				}
				return matched ? true : false;
			};
			$arr.contains = function(itemToFind) {
				var matched;
				for( var i=0; i<arr.length; i++ ) {
					if(arr[i] === itemToFind) {
						matched = true;
						break;
					}
				}
				return matched ? true : false;
			};
			$arr.toStringLn = function() {
				var s = "";
				for(var i = 0; i < arr.length; i++) {
					s += arr[i].toString();
					if(i < arr.length - 1) {
						s += "<br/>";
					}
				}
				return s;
			};
			$arr.foreach = function(fn) {
				for(var i = 0; i < arr.length; i++) {
					fn(arr[i]);
				}
			};
			$arr.indexOf = function(item) {
				for(var i = 0; i < arr.length; i++) {
					if(arr[i] == item) {
						return i;
					}
				}
			};
			$arr.removeIndex = function(index) {
				var aa2 = [];
				for(var i = 0; i < arr.length; i++) {
					if(i != index) {
						aa2.push(arr[i]);
					}
				}
				return aa2;
			};
			$arr.removeItemAt = function(index) {
				for(var i = 0; i < arr.length; i++) {
					if(i == index) {
						arr[i] = null;
					}
				}
				return arr;
			};
			$arr.removeNullIndices = function() {
				var aa2 = [];
				for(var i = 0; i < arr.length; i++) {
					if(arr[i]) {
						aa2.push(arr[i]);
					}
				}
				return aa2;
			};
		}

		$arr.getZeroArray = function(){
			return [];
		};
		
		return $arr;
	};/*end $cog.util.array()*/
	
	$cog.util.string = function(str) {
		var $str = {};
		
		if( str != undefined ) {
			$str.isEmpty = function() {
				return (str === "") ? true : false;
			};
			$str.isChar = function() {
				return (str.length === 1) ? true : false;
			};
			$str.isPunctuationOrSymbol = function() {
				return (isNaN(parseInt(str)) && !$str.isAlphabet() && str.length == 1) ? true : false;
			};
			$str.isAlphabet = function() {
				if(str.constructor != String || str.length != 1) {
					return false;
				}
				var re = /\b[a-zA-Z]\b/;
				return re.test(str);
			};
			$str.equals = function(args) {
				var matched;
				var expectedNumArgs = 1;
				if(arguments.length < expectedNumArgs) {
					return false;
				}
				for(var i = 0; i < arguments.length; i++) {
					if(str == arguments[i]) {
						matched = true;
						break;
					}
				}
				return matched ? true : false;
			};
			$str.contains = function(strToFind) {
				var matched = false;
				var expectedNumArgs = 1;
				if(str === "" || arguments.length < expectedNumArgs) {
					return false;
				}
				if(arguments.length == expectedNumArgs) {
					return str.indexOf(arguments[0]) != -1 ? true : false;
				}
				if(arguments.length > expectedNumArgs) {
					for(var i = 0; i < arguments.length; i++) {
						if(str.indexOf(arguments[i]) != -1) {
							matched = true;
							break;
						}
					}
				}
				return matched;
			};
			$str.containsSpaceDelimitedWord = function(word) {
				if(str === "" || arguments.length === 0) {
					return false;
				}
				var matched = false;
				var a = str.split(/\s+/);
				for(var i = 0; i < a.length; i++) {
					if(a[i] == word) {
						matched = true;
						break;
					}
				}
				return matched;
			};
			$str.containsWord = function(word, CASE_SENSITIVE) {
				if(str === "" || arguments.length === 0) {
					return false;
				}
				var re = new RegExp();
				if(CASE_SENSITIVE == undefined || CASE_SENSITIVE === true) {
					re.compile("\\b" + word + "\\b"); // \\b represents a word boundary in reg exp syntax
				} else if(CASE_SENSITIVE === false) {
					re.compile("\\b" + word + "\\b", "i");
				}
				return re.test(str);
			};
			$str.append = function(stringToAppend) {
				var newS = "";
				var expectedNumArgs = 1;

				if(arguments.length == expectedNumArgs) {
					newS = str + stringToAppend;
				} else if(arguments.length > expectedNumArgs) {
					for(var i = 0; i < arguments.length; i++) {
						newS += "" + arguments[i];
					}
				} else {
					newS = str;
				}
				return newS;
			};
			$str.removeAlphabets = function() {
				var newS = str.replace(/[a-zA-Z]/g, "");
				return newS;
			};
			$str.getCharFrequency = function(c) {
				var fr = 0;
				if($cog.util.string(c).isChar()) {
					for(var i=0; i < str.length; i++) {
						if(str.charAt(i) == c) {
							fr++;
						}
					}
				}
				return fr;
			};
			$str.getCharCount = function(c) {
				return $str.getCharFrequency(c);
			};
			$str.getFirstChar = function() {
				return str.charAt(0);
			};
			$str.getLastChar = function() {
				return str.charAt(str.length - 1);
			};
			$str.getNthChar = function(n) {
				return str.charAt(n);
			};
			$str.removeFirstChar = function() {
				return str.replace(/^./, "");
			};
			$str.removeLastChar = function() {
				return str.replace(/.$/, "");
			};
			$str.removeNthChar = function(n) {
				var arr = str.split("");
				arr = $cog.util.array(arr).removeIndex(n - 1);
				return arr.join("");
			};
			$str.formatForCurrency = function() {
				var charArray_original = str.split("");
				//remove everything that is not a number except period:
				var charArray_numbersAndDecimals = [];
				for(var i = 0; i < charArray_original.length; i++) {
					if(!isNaN(parseInt(charArray_original[i])) || charArray_original[i] == ".") {
						charArray_numbersAndDecimals.push(charArray_original[i]);
					}
				}
				//remove all periods except the first one:
				var decimalEncountered;
				var charArray_numbersAndTheFirstDecimal = [];
				for(var j = 0; j < charArray_numbersAndDecimals.length; j++) {
					if(!isNaN(parseInt(charArray_numbersAndDecimals[j]))) {
						charArray_numbersAndTheFirstDecimal.push(charArray_numbersAndDecimals[j]);
					} else if(charArray_numbersAndDecimals[j] == "." && !decimalEncountered) {
						charArray_numbersAndTheFirstDecimal.push(charArray_numbersAndDecimals[j]);
						decimalEncountered = true;
						continue; //i don't think this line is needed at all?...
					}
				}
				return charArray_numbersAndTheFirstDecimal.join("");
			};
			$str.hasChar = function(c) {
				if($cog.util.string(c).isChar() && str.indexOf(c) != -1) {
					return true;
				}
				return false;
			};
			$str.rtrim = function() {
				return str.replace(/(\s+)$/, "");
			};
			$str.ltrim = function() {
				return str.replace(/^(\s+)/, "");
			};
			$str.trim = function() {
				return $str.rtrim($str.ltrim(str));
			};
			$str.addPrefix = function(prefix) {
				return (prefix + str);
			};
			$str.removePrefix = function(prefix) {
				var re = new RegExp();
				re.compile("^" + prefix);
				return str.replace(re, "");
			};
			$str.removeAllPrefix = function(prefix) {
				var re = new RegExp();
				re.compile("^" + prefix + "+");
				return str.replace(re, "");
			};
			$str.addSuffix = function(suffix) {
				return (str + suffix);
			};
			$str.removeSuffix = function(suffix) {
				var re = new RegExp();
				re.compile(suffix + "$");
				return str.replace(re, "");
			};
			$str.removeAllSuffix = function(suffix) {
				var re = new RegExp();
				re.compile(suffix + "+$");
				return str.replace(re, "");
			};
			$str.escapeHtml = function(){
				//may not be complete. employ a reference to complete it.
				str = str.replace(/[\&]/g, "&amp;"); //replace '&' first so as not to replace it in other escaped sequences.
				str = str.replace(/[<]/g, "&lt;");
				str = str.replace(/[>]/g, "&gt;");
				return str;
			};
		} //end if

		$str.build = function(strArgs) {
			/*a utility method to build a string from comma-separated substrings passed as arguments*/
			var fullString = "";
			for(var i = 0; i < arguments.length; i++) {
				fullString += arguments[i];
			}
			return fullString;
		};
		$str.build_space = function(strArgs) {
			/*a utility method to build a string from comma-separated substrings passed as arguments,
			 *separating arguments with a space*/
			var full = "";
			for(var i = 0; i < arguments.length; i++) {
				full += arguments[i] + i < arguments.length ? " " : "";
			}
			return full;
		};
		$str.build_semiColon = function(strArgs) {
			/*a utility method to build a string from comma-separated substrings passed as arguments,
			 *separating arguments with a semi-colon*/
			var fullString = "";
			for(var i = 0; i < arguments.length; i++) {
				fullString += arguments[i] + i < arguments.length ? "; " : "";
			}
			return fullString;
		};
		//add an unescapeHtml() fxn?
		return $str;
	};/*end $cog.util.string()*/
	
	$cog.util.browser = {
		isIE : function() {
			return (navigator.appName == "Internet Explorer" ||
						$cog.util.string(navigator.appName).contains("Internet Explorer") ||
						$cog.util.string(navigator.userAgent).contains("MSIE")) ? true : false;
		},
		isNS : function() {
			return ( navigator.appName == "Netscape" ||
					$cog.util.string(navigator.appName).contains("Netscape")) ? true : false;
		},
		isFirefox : function() {
			return $cog.util.string(navigator.userAgent).contains("Firefox") ? true : false;
		},
		isChrome : function(){
			return $cog.util.string(navigator.userAgent).contains("Chrome") ? true : false;
		},
		alias : function() {
			if(this.isFirefox()) {
				return "Firefox";
			}
			if(this.isIE()) {
				return "Internet Explorer";
			}
			if(this.isChrome()) {
				return "Chrome";
			}
			return "Temporarily Unknown!";
		},
		name : function() {
			return navigator.appName;
		},
		userAgent : function() {
			return navigator.userAgent;
		},
		leftScreenOffset : function() {
			if(this.isIE()) {
				return window.screenLeft;/*screenLeft-8 ?*/
			}
			return window.screenX;
		},
		rightScreenOffset : function() {
			return screen.width - ($cog.util.browser.viewport.width() + $cog.util.browser.leftScreenOffset());
		},
		topScreenOffset : function() {
			if(!(this.isIE())){
				return window.screenY;
			} else {
				return "unknown"; /*still calculating*/
			}
		},
		bottomScreenOffset : function() {
			
		},
		heightOfIEChrome : function() {
			
		},
		viewport : {
			height : function() {
				/*returns the height of the browser viewport*/
				if($cog.util.browser.isIE()) {
					return document.body.clientHeight;
				}
				return window.innerHeight || document.body.clientHeight;
			},
			width : function() {
				/*returns the width of the browser viewport*/
				if($cog.util.browser.isIE()) {
					return document.body.clientWidth;
				}
				return  window.innerWidth || document.body.clientWidth;
			}
		}/*end $cog.util.browser.viewport{}*/
	};/*end $cog.util.browser{}*/

	$cog.util.page = {
		/*For the height() and width() methods, you'd need to pay attention to scroll offset values.*/
		height : function() {
			/*returns the height of the page body as represented by the total page content's height*/
			return document.body.clientHeight || document.body.offsetHeight;
		},
		width : function() {
			/*returns the height of the page body as represented by the total page content's height*/
			return document.body.clientWidth || document.body.offsetWidth;
		},
		refreshOnClick : function() {
			$(window).click(function(){
				location.href = location.href;
			});
		}
		//scroll height, width
		//content width?
	};/*end $util.page{}*/

	var Outbox = function() {
		var outbox = {};
		var div;
		var opentag = "<code>";
		var closetag = "</code>";
		var sUtil = $cog.util.string();
		var init = function() {
			function act() {
				if(!outboxIsSet()) {
					div = createOutbox();
					insertInPage(div);
				} else {
					div = $cog.elem("$cog_outputDiv");
				}
			}
			if(!$cog.dom().isready()) {
				$cog.onload(function(){
					act();
				});
			} else {
				act();
			}
		};
		var outboxIsSet = function() {
			if(document.getElementById("$cog_outputDiv")) {
				return true;
			}
			return false;
		};
		var createOutbox = function() {
			div = document.createElement("DIV");
			div.id = "$cog_outputDiv";
			div.innerHTML = "";
			//div.style.width = "96%";
			div.style.margin = "10px 10px 10px 10px";
			div.style.padding = "8px";
			div.style.border = "2px dotted #6699cc";
			div.style.backgroundColor = "white";
			div.style.fontSize = "11px";
			div.style.color = "#333333";
			return div;
		};
		var insertInPage = function(divElem) {
			//does the work of inserting the outbox into the page's markup
			var domObject = $cog.dom();
			var nodeObject = domObject.node(document.body);
			if(nodeObject.hasChildren()) {
				nodeObject.prepend(divElem);
			} else {
				document.body.appendChild(divElem);
			}
			return divElem;
		};
		outbox.clear = function() {
			div.innerHTML = "<code></code>"
		};
		outbox.remove = function() {
			document.body.removeChild(div);
		};
		function cleanMsg(msg){
			return $cog.util.string(msg).escapeHtml();
		}
		outbox.write = function(arg) {
			var x = {};
			function act() {
				if(arg!==null){
					if(arg.constructor != String && arg.constructor != Array){
						arg = arg.toString();
					}
					if(arg.constructor == String){
						x.msg = cleanMsg(arg);
					} else if(arg.constructor == Array) {
						x.msg = "";
						for(var i=0; i<arg.length; i++){
							x.msg += cleanMsg(arg[i]);
						}
					}
					div.innerHTML = sUtil.build(opentag, x.msg, closetag);
				}
			}
			if(!$cog.dom().isready()) {
				$cog.onload(function() {
					act();
				});
			} else {
				act();
			}
		};
		outbox.writeMore = function(arg) {
			var x = {};
			function act() {
				if(arg!==null){
					if(arg.constructor != String && arg.constructor != Array){
						arg += "";
					}
					//store the current div content. the already existing <code></code> tags have to be stripped.
					x.former = div.innerHTML.replace(/<code>/g, "");
					x.former = x.former.replace(/<\/code>/g, "");
					if(arg.constructor == String){
						x.msg = x.former + cleanMsg(arg);
					} else if(arg.constructor == Array){
						x.msg = x.former;
						for(var i=0; i<arg.length; i++){
							x.msg += cleanMsg(arg[i]);
						}
					}
					div.innerHTML = sUtil.build(opentag, x.msg, closetag);
				}
			}
			if(!$cog.dom().isready()) {
				$cog.onload(function() {
					act();
				});
			} else {
				act();
			}
		};
		outbox.writeLn = function(arg) {
			var x = {};
			function act() {
				if(arg!==null){
					if(arg.constructor != String && arg.constructor != Array){
						arg += "";
					}
					//store the current div content. the already existing <code></code> tags have to be stripped.
					x.former = div.innerHTML.replace(/<code>/g, "");
					x.former = x.former.replace(/<\/code>/g, "");
					x.br = "<br/>";
					if(arg.constructor == String){
						x.msg = x.former + cleanMsg(arg) + x.br;
					} else if(arg.constructor == Array){
						x.msg = x.former
						for(var i = 0; i < arg.length; i++){
							x.msg += cleanMsg(arg[i]);
						}
						x.msg += x.br;
					}
					div.innerHTML = sUtil.build(opentag, x.msg, closetag);
				}
			}
			if(!$cog.dom().isready()) {
				$cog.onload(function() {
					act();
				});
			} else {
				act();
			}
		};
		init();
		return outbox;
	};/*end $cog.Outbox()*/

	//shortcut
	$cog.out = function(msg) {
		var x = {};
		x.msg = "";
		var writer = new Outbox();
		for(var i=0; i<arguments.length; i++){
			x.msg += arguments[i];
		}
		writer.write(x.msg);
	};
	//shortcut
	$cog.outMore = function(msg) {
		var x = {};
		x.msg = "";
		var writer = new Outbox();
		for(var i=0; i<arguments.length; i++){
			x.msg += arguments[i];
		}
		writer.writeMore(x.msg);
	};
	//shortcut
	$cog.outLn = function(msg) {
		var x = {};
		x.msg = "";
		var writer = new Outbox();
		for(var i=0; i<arguments.length; i++){
			x.msg += arguments[i];
		}
		writer.writeLn(x.msg);
	};

	/*AJAX************************************************************************************************************/
	$cog.ajax = function() {
		var $ajax = {};
		var args = arguments;
		var querystringData = "";

		$ajax.settings = {
			method: 'GET',
			url: '',
			async: true,
			username: null,
			password: null,
			data: null,
			serializeData: true,
			refresh: true,
			responseType: 'text',
			contentType: 'application/x-www-form-urlencoded',
			//
			onbeforeinit: null,
			oninit: null,
			onsuccess: null,
			onfail: null,
			onfinish: null,
			//
			onsent: null,
			onprocessing: null,
			onuninit: null
		}; //default settings

		function handleUrl() {
			if( $ajax.settings.url !== '' ) {
				//check if the url has querystring data, and add or append new querystring data
				if( $ajax.settings.data !== null ) {
					if(querystringData !== '') {
						urlAppendQuerystring();
					}
				}
				urlAppendUID();
			}
		}
		function urlAppendQuerystring() {
			if($ajax.settings.url !== '') {
				$ajax.settings.url = $cog.util.url($ajax.settings.url).appendQuerystring(querystringData);
			}
		}
		function urlAppendUID() {
			if($ajax.settings.url !== '') {
				$ajax.settings.url = $cog.util.url($ajax.settings.url).appendUID();
			}
		}

		function handleData(arg) {
			if(arg.constructor == String) {
				var re_querystring = /^(.+=.*&)*(.+=.*)$/; //may be incorrect?
				if(re_querystring.test(arg)){
					querystringData = arg;
				}
			} else if(arg.constructor == Object && $cog.util.object(arg).hasMembers()) {
				if($ajax.settings.serializeData === true) {
					//serialize the data map object...
					querystringData = $cog.util.object(arg).serialize();
				}
			}
		}

		if(args.length > 0) {
			if(args[0].constructor==Object) {
				var map = args[0];
				for( var setting in $ajax.settings ) {
					if(map[setting] !== undefined) {
						$ajax.settings[setting] = map[setting];
					}
				}
				if($ajax.settings.data !== null) {
					handleData($ajax.settings.data);
				}
			} else if(args[0].constructor==String) {
				$ajax.settings.method = args[0].toUpperCase();
			}
		}

		$ajax.data = function(arg) {
			if( arg.constructor == String || (arg.constructor == Object && $cog.util.object(arg).hasMembers()) ) {
				$ajax.settings.data = arg;
				handleData(arg);
			}
			return $ajax;
		};
		
		$ajax.connect = function(url) {
			var args = arguments;

			switch( args.length ) {
				case 1:
					$ajax.settings.url = args[0];
					break;
				default:
					break;
			}//end switch

			if( $ajax.settings.url === '' || $ajax.settings.url === null ) {
				return false;
			}
			handleUrl();
			
			var xhr = new $cog.xhr();
			if( xhr ) {
				xhr.open(
					$ajax.settings.method.toUpperCase(),
					$ajax.settings.url,
					$ajax.settings.async,
					$ajax.settings.username,
					$ajax.settings.password
				);
				xhr.onreadystatechange = function() {
					if( $ajax.settings.onfinish !== null ) {
						if( xhr.readyState === $cog.xhrState.complete ) {
							$ajax.settings.onfinish.call( $ajax, xhr );
						}
					}
					if( $ajax.settings.oninit !== null ) {
						if( xhr.readyState === $cog.xhrState.initialized ) {
							$ajax.settings.oninit.call( $ajax );
						}
					}
					if( $ajax.settings.onsuccess !== null ) {
						/*what does success mean? what indicates a success?
						 *should mean: a response was returned AND the status code is 200
						 *right? do confirm.*/
					}
					if( $ajax.settings.onfail !== null ) {
						/*what does fail mean? what indicates a fail?*/
					}
					if( $ajax.settings.onsent !== null ) {
						if( xhr.readyState === $cog.xhrState.sent ) {
							$ajax.settings.onsent.call( $ajax );
						}
					}
					if( $ajax.settings.onprocessing !== null ) {
						if( xhr.readyState === $cog.xhrState.processing ) {
							$ajax.settings.onprocessing.call( $ajax );
						}
					}
					if( $ajax.settings.onuninit !== null ) {
						if( xhr.readyState === $cog.xhrState.unitialized ) {
							$ajax.settings.onuninit.call( $ajax );
						}
					}
				};
				//call the onbeforeinit callback function
				if( $ajax.settings.onbeforeinit !== null ) {
					$ajax.settings.onbeforeinit.call( $ajax );
				}
				//send the ajax request
				xhr.send( $ajax.settings.data );
				$ajax.xhr = xhr;
			}
			return $ajax;
		};
		
		$ajax.execute = function( fn ) {
			if( fn && fn.constructor==Function ) {
				fn.call( $ajax );
			}
			return $ajax;
		};
		return $ajax;
	}; //end $cog.ajax()

	$cog.xhr = function() {
		/*Ref: Ajax Complete Reference*/
		try {
			return new XMLHttpRequest();
		} catch(ex) {}
		try {
			return new ActiveXObject("Msxml2.XMLHTTP.6.0");
		} catch(ex) {}
		try {
			return new ActiveXObject("Msxml2.XMLHTTP.3.0");
		} catch(ex) {}
		try {
			return new ActiveXObject("Msxml2.XMLHTTP");
		} catch(ex) {}
		try {
			return new ActiveXObject("Microsoft.XMLHTTP");
		} catch(ex) {}
		alert("XMLHttpRequest not supported by your browser.");
		return null;
	};

	$cog.ajaxTestData = {
		name : "Ikmich",
		lastname : "Marlow",
		middlename : "Michael",
		age : 27,
		sex : "male",
		occupation : "Software Architect"
	};
	
	$cog.xhrState = {
		unitialized : 0,
		initialized : 1,
		sent : 2,
		processing : 3,
		complete : 4
	};
	
	$cog.xhrStatus = {
		ok : 200,
		created : 201,
		no_content : 204,
		reset_content : 205,
		partial_content : 206,
		bad_request : 400,
		unauthorised : 401,
		forbidden : 403,
		not_found : 404,
		method_not_allowed : 405,
		not_acceptable : 406,
		proxy_authentication_required : 407,
		request_timeout : 408,
		length_required : 411,
		requested_entity_too_large : 413,
		requested_url_too_long : 414,
		unsupported_media_type : 415,
		internal_server_error : 500,
		not_implemented : 501,
		bad_gateway : 502,
		service_unavailable : 503,
		gateway_timeout : 504,
		http_version_not_supported : 505
	};
	
	/*end:AJAX************************************************************************************************************/


//	$cog.ajaxx = {
//		response : {
//			xml : function(xmlResponse) {
//				var _xmldoc = {};
//				_xmldoc.response = xmlResponse;
//				_xmldoc.dbTable = {
//					tableNode : xmlResponse.documentElement,
//					getRowNodes : function() {
//						try {
//							var nodes = [];
//							var _childNodes = _xmldoc.dbTable.tableNode.childNodes;
//							for(var i = 0; i < _childNodes.length; i++) {
//								if(_childNodes[i].nodeType == $cog.dom().nodeTypeEnum.ELEMENT) {
//									nodes.push(_childNodes[i]);
//								}
//							}
//							return nodes;
//						} catch(ex) {
//							ex.show();
//							throw(ex);
//						}
//					},
//					getFieldNodes : function() {
//						try {
//							var fieldNodes = [];
//							var row = _xmldoc.dbTable.getRowNodes()[0];
//							var row_childNodes = row.childNodes;
//							for(var i = 0; i < row_childNodes.length; i++) {
//								if(row_childNodes[i].nodeType == $cog.dom().nodeTypeEnum.ELEMENT) {
//									fieldNodes.push(row_childNodes[i]);
//								}
//							}
//							return fieldNodes;
//						} catch(ex) {
//							ex.show();
//							throw(ex);
//						}
//					},
//					getFieldNames : function() {
//						try {
//							var names = [];
//							var fieldNodes = _xmldoc.dbTable.getFieldNodes();
//							for(var i = 0; i < fieldNodes.length; i++) {
//								names.push(fieldNodes[i].nodeName);
//							}
//							return names;
//						} catch(ex) {
//							ex.show();
//							throw(ex);
//						}
//					}
//				}
//				return _xmldoc;
//			}/*end $cog.ajax.response.xml()*/
//		}/*end $cog.ajax.response{}*/
//	};/*end $cog.ajaxx{}*/
	
	$cog.test = function() {
		if(!$cog.dom().isready()) {
			$cog.onload(function() {
				doOut();
			});
		} else {
			doOut();
		}
		function doOut() {
			$cog.out("Congratulations! cog.js is ready!");
		}
	};/*end $cog.test()*/

	/*---------------------------------------------------------------------------------------------------------------------*/
	cog = $cog; //comment out if conflict
	//$$ = $cog.util; //comment out if conflict
	//cogUtils();
})(window);
