﻿var System = {
	//ECMAScript node types
/*	Node:{
		ELEMENT_NODE:1,
	    ATTRIBUTE_NODE:2,
	    TEXT_NODE:3,
	    CDATA_SECTION_NODE:4,
	    ENTITY_REFERENCE_NODE:5,
	    ENTITY_NODE:6,
	    PROCESSING_INSTRUCTION_NODE:7,
	    COMMENT_NODE:8,
	    DOCUMENT_NODE:9,
	    DOCUMENT_TYPE_NODE:10,
	    DOCUMENT_FRAGMENT_NODE:11,
	    NOTATION_NODE:12
	},*/
	idCount:0,
	getNewId:function(str){
		var str = str || 'asdf';
		this.idCount++;
		return str+this.idCount;
	},
	extend:function(subc, superc, overrides){
		var f=function(){};
		f.prototype=superc.prototype;
		subc.prototype=new f();
		subc.prototype.constructor=subc;
		subc.superclass=superc.prototype;
		if(superc.prototype.constructor==Object.prototype.constructor){
			superc.prototype.constructor=superc;
		}
		if(overrides)
		{
			for(var x in overrides)
			{
				subc.prototype[x]=overrides[x];
			}
		}
	},
/*	serilaizeIgnore:{onclick:true,onmouseover:true,onmouseup:true,onmouseout:true},
	serialize:function(el){
		var sb = [];
		if (el){
			var attribute;
			var i;
			sb[sb.length] = "<" + el.nodeName;

			// Add the attributes
			for (i = el.attributes.length-1; i>=0; i--){
				attribute = el.attributes.item(i);
				if(typeof this.serilaizeIgnore[attribute.nodeName] == 'undefined')
					sb[sb.length] = " " + attribute.nodeName + '="' + attribute.nodeValue+ '"';
			}
			// Run through any children
			if (el.hasChildNodes()){
				var children = el.childNodes;
				sb[sb.length] = ">";
				for (i=0; i<children.length; i++){
					switch(children.item(i).nodeType){

						case System.Node.ELEMENT_NODE://1
							sb[sb.length] = this.serialize(children.item(i));    // RECURSE!!
							break;

						case System.Node.TEXT_NODE:
							sb[sb.length] = this.escape(children.item(i).nodeValue);
							break;

						case System.Node.CDATA_SECTION_NODE:
							sb[sb.length] = "\x3c![CDATA[";       // unescaped <
							sb[sb.length] = children.item(i).nodeValue;
							sb[sb.length] = "]]\x3e";             // unescaped >
							break;
						default:
							break;
					}
				}
				sb[sb.length] = "</" + el.nodeName + ">";
			} else {
				sb[sb.length] = " />";
			}
		}
		return sb.join('');
	},*/
	escape:function(markup){
  		markup = markup.replace(/&/g, "&amp;");
  		markup = markup.replace(/</g, "&lt;");
  		markup = markup.replace(/>/g, "&gt;");
  		return markup;
	},
	Features: {
	    ActiveX: !!window.ActiveXObject,
	    ElementExtensions: !!window.HTMLElement,
		Firebug: !!(typeof window.console != 'undefined' && typeof window.console.firebug != 'undefined')
	}
}

if(!System.Features.ActiveX && System.Features.ElementExtensions){
		HTMLElement.prototype.attachEvent = function(name, func){
        		this.addEventListener(name.substring(2,name.length), func, false);
		};
		HTMLElement.prototype.innerText = function(){
			return this.textContent;
		};
		HTMLElement.prototype.insertAdjacentElement = function(where,parsedNode){
			switch (where){
				case 'beforeBegin':
					this.parentNode.insertBefore(parsedNode,this)
					break;
				case 'afterBegin':
					this.insertBefore(parsedNode,this.firstChild);
					break;
				case 'beforeEnd':
					this.appendChild(parsedNode);
					break;
				case 'afterEnd':
					if (this.nextSibling) 
						this.parentNode.insertBefore(parsedNode,this.nextSibling);
					else
						this.parentNode.appendChild(parsedNode);
					break;
				}
		}
		HTMLElement.prototype.insertAdjacentHTML = function(where, htmlStr){
			var r = this.ownerDocument.createRange();
			r.setStartBefore(this);
			var parsedHTML = r.createContextualFragment(htmlStr);
			this.insertAdjacentElement(where,parsedHTML)
		}
}
function $(element) {
	if (arguments.length > 1) {
	for (var i = 0, elements = [], length = arguments.length; i < length; i++)
		elements.push($(arguments[i]));
		return elements;
	}
	element = document.getElementById(element);
	return element;
}
/*
function trace(){
	var sb = [];
	for(var i=0,l=arguments.length;i<l;i++){
		sb[sb.length] = arguments[i];
	}
	var ref = document.getElementById('trace');
	if(ref){
		ref.insertAdjacentHTML('beforeEnd',sb.join('')+'<BR>');
	}
}*/