var selectors=[' ','.','#','+','>','~',':','::','*','[',']',','];
var keywords=[];

function parse(str) {
		   
	var r    = str.split('');

	var selector = undefined;
	var elm  = undefined;
	if(r.length==1 && str=="*") return $T("*"); 

	for(var i=0,ln=r.length;i<ln;i++) {

		if(selectors.indexOf(r[i])!=-1) { 
			selector=r[i];
			
                }

		if(/[a-zA-Z0-9_-]/.test(r[i])) {

			regex='^.{'+i+'}([a-zA-Z0-9_-]+)';
			var reg=new RegExp(regex);
			var result = reg.exec(str);
		        var tag=result[1];
			var ret= getByClass(tag,i,r,selector,elm);
                        if(ret) { 
			    elm=ret;
			    i  = tag.length-1+i;
			     continue;
			}
			var ret= getId(tag,i,r,selector,elm);
			if(tag.length==r.length && ret) return ret;
                        if(ret)  { 
			     elm=ret;
			     i = tag.length-1+i;
			     continue;
			}	

			var ret= getHTMLList(tag,i,r,selector,elm);
			if(tag.length==r.length && ret) return ret;
                        if(ret) { 
			    elm=ret;
			    i  = tag.length-1+i;
			     continue;
			}
			var ret= getDirectChildOf(tag,i,r,selector,elm);
			if(tag.length==r.length && ret) return ret;
                        if(ret) { 
			    elm=ret;
			    i  = tag.length-1+i;
			     continue;
			}
			var ret= getFirstSiblingOf(tag,i,r,selector,elm);
			if(tag.length==r.length && ret) return ret;
                        if(ret) { 
			    elm=ret;
			    i  = tag.length-1+i;
			     continue;
			}
			    i  = tag.length-1+i;
               }

	}
	return elm;
}

function getId(searchTag,inLoop,aSelection,lastSelector,elms) {
     if(lastSelector=='#') return $I(searchTag);
     return false;
}
function getHTMLList(searchTag,inLoop,aSelection,lastSelector,elms) {
	if((lastSelector==' ' || !lastSelector)) return $TS(searchTag,elms);
	return false;
}

function getDirectChildOfAdaptater(base,searchTag) {
		getDirectChildOf(searchTag,'','','>',base);
}
function getDirectChildOf(searchTag,inLoop,aSelection,lastSelector,elms) {
	if(lastSelector=='>'){
		tags = $TS(searchTag,elms);
		if(!tags) return; 
		var ret=[];
		for(var i=0,ln=tags.length;i<ln;i++) { 
			var s=tags[i];
			var parent=s.parentNode;
			if(parent.nodeType==1 && parent.nodeName==elms[0].nodeName) ret.push(s);
		}
		return ret;
	}
	return false;
}
function parent(elm) {
	return elm.parentNode;
}
function next(elm) {
	if(!elm) return;
	do { elm=elm.nextSibling;} while(elm && elm.nodeType!=1);
	return elm;
}

function getDirectSiblingOf(searchTag,inLoop,aSelection,lastSelector,elms) {
	if(lastSelector=='+'){
	        searchTag=searchTag.toLowerCase();
		var ret=[];
		for(var i=0,ln=elms.length;i<ln;i++) { 
			var s=elms[i];
			    s=next(s);
			if(n && n.nodeName.toLowerCase()==searchTag) ret.push(n);
		}
		return ret;
	}
	return false;
}
function getFirstSiblingOf(searchTag,inLoop,aSelection,lastSelector,elms) {
	if(lastSelector=='~'){
	        searchTag=searchTag.toLowerCase();
		var ret=[];
		elms = (elms.constructor===Array) ? elms : [elms];
		for(var i=0,ln=elms.length;i<ln;i++) { 
			var n=elms[i];

			do {
			   n=next(n);
			} while(n && n.nodeName.toLowerCase()!=searchTag);
			if(n) ret.push(n);
		}
		return ret;
	}
	return false;
}

function getByClass(searchTag,inLoop,aSelection,lastSelector,elms) {
	if(lastSelector=='.') {
	       if(/ /.test(aSelection[inLoop-2])) elms=$TS(' ',elms);
                     return $C(searchTag,elms);
        }
	return false;
}


	function $A(attr,val,scope) {
			if(scope[attr]==val) return scope;
			if(parseInt(scope[attr])===val) return scope;
			if(parseInt(scope[attr])===parseInt(val)) return scope;
	}
	function $AS(attr,val,scope) {
		scope = (scope.constructor!==Array) ? [scope] : scope;
		var elms=[];
		for(var i=0;i<scope.length;i++) { 
			var s=scope[i];
			var r= $A(attr,val,s);
			if(r) elms.push(r);
		}
		return (elms.length>1) ? elms : elms[0];
	}

	function $C(t,s) {
		var ar=[];

		s= s || document.body.getElementsByTagName('*');
		var e;
		for(var i=0,ln=s.length;i<ln;i++) {
			e=s[i];
			if(e.className) if(e.className===t) ar.push(e);
		}
		if(ar.length==0) return;
		return (ar.length>1) ? ar : ar[0];
	}
	function $T(tag,scope) {
		if(tag=="body") return document.body;
		var elms= (scope || document).getElementsByTagName(tag);
		if(elms.length==0) return;
		var ar=[];
		for(var i=0,ln=elms.length;i<ln;i++) ar.push(elms[i]);
		return (ar.length>0) ? ar : undefined;
	}
	function $TS(tag,scope) {
		if(scope===undefined) return $T(tag);
		scope = (scope.constructor!==Array) ? [scope] : scope;
		var elms=[];
		for(var i=0;i<scope.length;i++) { 
			var s=scope[i][0] || scope[i];
			var r= $T(tag,s);
			if(r) {
			   for(var j=0;j<r.length;j++) elms.push(r[j]);
                     }
		}
		return (elms.length>1) ? elms : elms[0];
	}
	function $I(id) {
		return document.getElementById(id);
	}

if (!Array.prototype.indexOf){  
  Array.prototype.indexOf = function(elt /*, from*/)  {   
        var len = this.length;    
        var from = Number(arguments[1]) || 0;    
        from = (from < 0) ? Math.ceil(from) : Math.floor(from); 
        if (from < 0)  from += len;    
        for (; from < len; from++)    {   
              if (from in this && this[from] === elt)   
                    return from;    
        }   
        return -1;  
   };
}

Array.prototype.each=function (fn) {
	var that=this;
	for(var i=0;i < this.length ;i++) {
		(function() {
			var c=i;
			fn.call(that,that[c],c,that);
		})();
	}
}

