/**
** PS v.1.0.0
**/

var DOMManipulator = (function () {
	
	var __$classSeparator = String.fromCharCode (32);
	
	var __$$fixClassName = function ($po_elem) {
		
		// if no class defined, then set it to separator
		if ((!$po_elem.className)) {
			$po_elem.className = __$classSeparator;
		
		} else {
			// class defined, so further testing required
			
			// if no separator at beginning, then add separator to beginning
			if (($po_elem.className.indexOf (__$classSeparator) != (0))) {
				$po_elem.className = __$classSeparator + $po_elem.className;
			}
			
			// if no separator at end, then add separator to end
			if (($po_elem.className.lastIndexOf (__$classSeparator) != ($po_elem.className.length - __$classSeparator.length))) {
				$po_elem.className = $po_elem.className + __$classSeparator;
			}
		}
	};
	
	// create object
	var __$$object = {
		getElementsByClassName : function ($ps_class, $po_elem, $ps_tag) {
			var $i, $a_elems_all, $a_elems_class = [];
			
			if ((!$po_elem)) $po_elem = document.body;
			if ((!$ps_tag)) $ps_tag = '*';
			
			// get all elements
			$a_elems_all = $po_elem.getElementsByTagName ($ps_tag);
			
			// loop through each, and check if class exists, and if so, add element to list
			for ($i = 0; $i < $a_elems_all.length; ++$i) {
				if ((__$$object.hasClassName ($ps_class, $a_elems_all [$i]))) {
					$a_elems_class [$a_elems_class.length] = $a_elems_all [$i];
				}
			}
			
			// return list of elements that has class
			return $a_elems_class;
		},
		hasClassName : function ($ps_class, $po_elem) {
			
			// fixes the class name
			__$$fixClassName ($po_elem);
			
			// returns answer
			return ($po_elem.className.indexOf ($ps_class + __$classSeparator) >= 0);
		},
		addClassName : function ($ps_class, $po_elem) {
			
			// if class don't exist, add it
			if ((!__$$object.hasClassName ($ps_class, $po_elem))) {
				$po_elem.className += $ps_class + __$classSeparator;
			}
		},
		removeClassName : function ($ps_class, $po_elem) {
			
			// if class exsists, remove it
			if ((__$$object.hasClassName ($ps_class, $po_elem))) {
				$po_elem.className = $po_elem.className.replace ($ps_class + __$classSeparator, '');
			}
		},
		getOffset : function ($po_elem) {
			var $o_offset = {left: 0, top: 0};
			
			do {
				if (($po_elem.offsetLeft)) $o_offset.left += $po_elem.offsetLeft;
				if (($po_elem.offsetTop)) $o_offset.top += $po_elem.offsetTop;
			}
			while (($po_elem = $po_elem.offsetParent));
			
			// return offset object
			return $o_offset;
		},
		getBoundingBox : function ($po_elem) {
			var $o_offset = __$$object.getOffset ($po_elem);
			var $o_bounds = {
				left: $o_offset.left,
				right: $o_offset.left + $po_elem.offsetWidth,
				top: $o_offset.top,
				bottom: $o_offset.top + $po_elem.offsetHeight
			};
			
			return $o_bounds;
		},
		getStyleObject : function ($po_elem) {
			return ($po_elem.currentStyle ? $po_elem.currentStyle : $po_elem.style);
		}
	};
	
	// return object
	return __$$object;
}) ();
