//------------------------------------------
// Class: com.Schematic.Utils
// A collection of frequently used methods 
//------------------------------------------

if(typeof com == "undefined") var com = {}; 
if(typeof com.Schematic == "undefined") com.Schematic = {}; 

com.Schematic.Utils = function() {
	this.version = '0.1';
};

com.Schematic.Utils.prototype = {

	//------------------------------------------
	// Shortcuts for getElementByID() and getElementsByTagName()
	//------------------------------------------
	$: function() {
		var elements = [];
		for (var i=0, len=arguments.length; i<len; i++) {
			var element = arguments[i];
			if (typeof element == "string") {
				element = document.getElementById(element);
				if (arguments.length == 1 && element) return element;
				if(element) elements.push(element);
			}
		}
		if(elements.length) return elements;
		else return false;
	},
	
	$$: function(element) {
		if(document.getElementsByTagName(element))
			return document.getElementsByTagName(element);
		else return false;
	},

	//------------------------------------------
	// Cross browser addEvent
	//------------------------------------------
	addEvent: function( obj, type, fn ) {
		// Check for dom load events
		if(type == 'DOMContentLoaded') { DomLoaded.load(fn); return; }
			
		if (obj.addEventListener) {
			obj.addEventListener( type, fn, false );
		}
		else if (obj.attachEvent) {
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); };
			obj.attachEvent( "on"+type, obj[type+fn] );
		}
		else {
			obj["on"+type] = obj["e"+type+fn];
		}
	},
	
	preventDefault: function(e) {
		if(!e) e = window.event;
		if(e.preventDefault) {
			e.preventDefault(); 
		} else {
			e.returnValue = false;
		}
	},
	
	//------------------------------------------
	// add, check for, or remove a class to any element(s) or element ID(s)
	//------------------------------------------	
	addClass: function(el,newClass) {
		if(typeof el == "string" && typeof this.$(el) == "object") {
			el = this.$(el);
		} else if(typeof el != "object") return;
		if(el.length) {
			for(var i=0, len=el.length; i<len; i++) this.addClass(el[i],newClass)
		} else {
			if(!this.hasClass(el,newClass)) {
				if(el.className) el.className += " " + newClass;
				else el.className = newClass;
			}
		}
	},
	
	removeClass: function(el, remClass) {
		if(typeof el == "string" && typeof this.$(el) == "object") {
			el = this.$(el);
		} 
		if(el.length) {
			for(var i=0, len=el.length; i<len; i++) this.removeClass(el[i],remClass)
		} else {
			var regexp = new RegExp("(^|\\s)" + remClass + "(\\s|$)");
			el.className = el.className.replace(regexp, "$2");
		}
	},

	hasClass: function(el, chkClass) {
		if(typeof el == "string" && typeof this.$(el) == "object") {
			el = this.$(el);
		} else if(typeof el != "object") return;
		if(el.length) {
			for(var i=0, len=el.length; i<len; i++) this.hasClass(el[i],chkClass)
		} else {
			var regexp = new RegExp("(^|\\s)" + chkClass + "(\\s|$)");
			return regexp.test(el.className);
		}
	},
	
	//------------------------------------------
	// Create an element or tree of nested elements with any attributes you need as well
	//------------------------------------------
	
	createEl: function(el) {
		var options = arguments[1] || false;
		var el = document.createElement(el);

		if(options && typeof options == "object") {
			for (property in options) {
				if (property == "content") {
					if (typeof options.content == "object") {
						if (options.content.length) {
							for (var i=0; i<options .content.length; i++) {
								var content = options.content[i];
								if (typeof content == "string") {
									el.appendChild(document.createTextNode(content));
								} else if (typeof content == "object") {
									el.appendChild(content);
								}
							}
						} else {
							el.appendChild(options.content);
						}
					} else {
						el.appendChild(document.createTextNode(options.content));
					}
				} else {
					if (property == ("cssClass" || "class")) {
						if (typeof options.cssClass == "object") {
							for (var j=0; j<options.cssClass.length; j++) {
								var className = options.cssClass[j];
								S.addClass(el, className);
							}
						} else {
							S.addClass(el, options.cssClass);
						}
					} else {
						el.setAttribute(property, options[property]);
					}
				}
			}
		}

		return(el);
	},
	
	//------------------------------------------
	// Crossbrowser target of the event
	//------------------------------------------	
	getEventTarget: function(event) {
		if (event.srcElement) {
			return event.srcElement;
		} else if (event.target) {
			return event.target;
		} else {
			return;
		}
	},
	
	//------------------------------------------
	// Removes extra white space on within elements.
	// Also fixes an issue with disapearing content in IE.
	//------------------------------------------	
	tidyWhiteSpace: function(el) {
		if (typeof el == 'string') el = this.$(el);
		if (el.length) {
			for(var i=0, len=el.length; i<len; i++) {
				el[i].innerHTML = el[i].innerHTML.replace("  "," ");
			}
		} else el.innerHTML = el.innerHTML.replace("  "," ");
	},

	//------------------------------------------
	// Insert an element directly after a target element.
	//------------------------------------------
	insertAfter: function(el,target) {
		var parent = target.parentNode;
		if (parent.lastChild == target) {
			parent.appendChild(el);
		} else {
			parent.insertBefore(el,target.nextSibling);
		}
	}
};

// Add Array.push for ie 5
if(typeof new Array().push == "undefined") {
	Array.prototype.push = function (element) {
    	this[this.length] = element;
    	return this.length;
	};
}

var DomLoaded = {
	onload: [],
	loaded: function() {
		if (arguments.callee.done) return;
		arguments.callee.done = true;
		
		for (i = 0;i < DomLoaded.onload.length;i++) {
			DomLoaded.onload[i]();
		}
	},
	
	load: function(fireThis) {
		this.onload.push(fireThis);
		if (document.addEventListener) document.addEventListener("DOMContentLoaded", DomLoaded.loaded, null);
		if (/KHTML|WebKit/i.test(navigator.userAgent)) { 
			var _timer = setInterval(function() {
				if (/loaded|complete/.test(document.readyState)) {
					clearInterval(_timer);
					delete _timer;
					DomLoaded.loaded();
				}
			}, 10);
		}
		/*@cc_on @*/
		/*@if (@_win32)
		var proto = "javascript:void(0)";
		if (location.protocol == "https:") proto = "src=//0";
		document.write("<scr"+"ipt id=__ie_onload defer src=" + proto + "><\/scr"+"ipt>");
		var script = document.getElementById("__ie_onload");
		script.onreadystatechange = function() {
		    if (this.readyState == "complete") {
		        setTimeout(function() {
					 // Added timeout because IE wasn't able to handle all events at once producing unexpected results 
					DomLoaded.loaded();
				},2000);
		    }
		};
		/*@end @*/
	   window.onload = DomLoaded.loaded;
	}
};

var S = new com.Schematic.Utils();