/*
	Steamboat v0.1
*/

	/*
		Extentions
	*/
	Function.prototype.createDelegate = function(objOriginal) {
		var objFunction = this;
		return function(eSource) {
		  return objFunction.call(objOriginal, eSource || window.event);
		};
	};
	
	/*
		Steamboat package
	*/
	Steamboat = {
	
		/* Static Properties */
		classPrefix: 'Steamboat_', 
		debug: false, 
		errors: {
			count: 0, 
			panel: document.createElement('div')
		}, 
		packages: [], 
		querystring: [], 
		version: 0.1, 
		
		/* Static Methods */
		addClass: function(objTarget, strClass) {
			var objTarget = typeof(objTarget) == typeof('string') ? document.getElementById(objTarget) : objTarget;
			if ( !objTarget ) { return false; };
			var objRegEx = new RegExp('\\b' + strClass + '\\b');
			if ( !objTarget.className.match(objRegEx) ) {
				objTarget.className += ' ' + strClass;
			}
		},
		
		addEvent: function(objTarget, strEvent, objFunction) {
			var objTarget = typeof(objTarget) == typeof('string') ? document.getElementById(objTarget) : objTarget;
			if ( !objTarget || !strEvent || !objFunction ) { return false; };
			if ( strEvent.toLowerCase() == 'submit' ) {
				objTarget['on' + strEvent] = function() { return false; };
			}
			if ( objTarget.addEventListener ) {
				objTarget.addEventListener(strEvent, objFunction, true);
				return true;
			} else if ( objTarget.attachEvent ) {
				var bResult = objTarget.attachEvent('on' + strEvent, objFunction);
				return bResult;
			}
		},
		
		findClass: function(objTarget, strClass) {
			var objTarget = typeof(objTarget) == typeof('string') ? document.getElementById(objTarget) : objTarget;
			if ( !objTarget ) { return false; };
			var objRegEx = new RegExp('\\b' + strClass + '\\b');
			return objTarget.className.match(objRegEx);
		},
		
		getQueryString: function() {
			var strQs = window.location.search;
			if ( !strQs ) { 
				return false;
			}
			strQs = strQs.substring(1);
			var aryPairs = strQs.split('&');
			for ( var intPair = 0; intPair < aryPairs.length; intPair++ ) {
				if ( aryPairs[intPair].indexOf('=') != -1 ) {
					this.querystring.push(aryPairs[intPair].split('=')[0]);
					this.querystring[aryPairs[intPair].split('=')[0]] = aryPairs[intPair].split('=')[1];
				}
			}
		}, 
		
		importPackage: function(strPackage) {
			if ( !strPackage || !document.getElementById ) { return false; }
			var objRegEx = new RegExp('.*\/');
			var strPackageName = strPackage.replace(objRegEx, '').replace('.js', '');
			if ( this.packages[strPackageName] == null ) {
				this.packages.push(strPackageName);
				this.packages[strPackageName] = false;
				document.write('<script type="text/javascript" src="' + strPackage + '"></script>');
			}
		},
		
		registerPackage: function(strPackage) {
			if ( this.packages[strPackage] != null ) {
				this.packages[strPackage] = true;
				for ( var intPackageCount = 0; intPackageCount < this.packages.length; intPackageCount++ ) {
					if ( !this.packages[this.packages[intPackageCount]] ) {
						return false;
					}
				}
				this.getQueryString();
				this.writeErrorPanel();
				this.onload();
			}
		}, 
		
		removeNodes: function(objTarget) {
			var objTarget = typeof(objTarget) == typeof('string') ? document.getElementById(objTarget) : objTarget;
			for ( var intCount = objTarget.childNodes.length - 1; intCount >= 0; intCount-- ) {
				objTarget.removeChild(objTarget.childNodes[intCount]);
			}
		},
		
		removeClass: function(objTarget, strClass) {
			var objTarget = typeof(objTarget) == typeof('string') ? document.getElementById(objTarget) : objTarget;
			if ( !objTarget ) { return false; };
			var objRegEx = new RegExp('\\b' + strClass + '\\b');
			objTarget.className = objTarget.className.replace(objRegEx, ' ');
		},
		
		trace: function(strTrace, bError) {
			if ( !this.debug ) { return false; };
			this.errors.count++;
			
			strTrace = ( ( this.errors.count < 100 ) ? '0' : '' ) + 
				( ( this.errors.count < 10 ) ? '0' : '' ) + 
				this.errors.count + 
				': ' + 
				strTrace;
			
			var objTracing = document.createElement('div');
			if ( bError ) {
				var objWarn = document.createElement('strong');
				objWarn.innerHTML = strTrace;
				objTracing.appendChild(objWarn);
			} else {
				objTracing.innerHTML = strTrace;
			}
			
			this.errors.panel.insertBefore(objTracing, this.errors.panel.firstChild);
		}, 
		
		writeErrorPanel: function(bLoaded) {
			if ( !this.debug ) { return false; };
			var objPanel = document.createElement('div');
			objPanel.className = this.classPrefix + 'ErrorPanel';
			objPanel.link = document.createElement('a');
			objPanel.link.appendChild(document.createTextNode('Clear Debug Output'));
			objPanel.appendChild(objPanel.link);

			objPanel.link.href = '#Clear';
			this.addEvent(objPanel.link, 'click', function() {
				this.removeNodes(this.errors.panel);
				return false;
			}.createDelegate(this));
			
			objPanel.appendChild(this.errors.panel);
			if ( bLoaded ) {
				document.body.appendChild(objPanel);
			} else {
				Steamboat.addEvent(window, 'load', function() {
					document.body.appendChild(objPanel);
				}.createDelegate(this));
			}
		}, 
		
		/* Static Events */
		onerror: function(strMessage, strSource, strLine) {
			Steamboat.trace(
				'Error: ' + strMessage + '<br/>' + 
				'Source: ' + strSource + '<br/>' + 
				'Line: ' + strLine,
				true
			);
			
			return true;
		}, 
		
		onload: function() {}
		
	};
	
	window.onerror = Steamboat.onerror;
		