﻿// JScript File
function cssMatch(o,sel) {
	//alert("cssMatch "+o.nodeName+" "+sel);
	if (!o) return false;
	switch(sel.substr(0,1)) {
	case ".":
		return o.className&&o.className.indexOf(sel.substr(1))!=-1;
		break;
	case "#":
		return o.id&&o.id==sel.substr(1);
		break;
	default:
		return o.nodeName==sel.toUpperCase();
	}
}

function cssTrace(o,sel,fn,chain) {//trace this element against single css selector
	if (!o) return sel=="";
	//if (typeof(o)=="undefined") return sel=="";
	/*if (sel=="") {
		alert(o.nodeName+"<->"+sel);
		if(fn) fn(o);
		return o;
	}*/
	var s=sel.split(" ");
	/*if (s.length==0) {
		if(fn) fn(o);
		return null;
	}*/
	var c=s.pop();
	if (cssMatch(o,c)) {
		if (c.length==1) return o;
		return cssTrace(o.parentNode,s.join(" "),fn,true);
	} else
		return chain?cssTrace(o.parentNode,sel,fn,true):null;
}

function cssWalk(o,sel,fn) {
	//alert("cssWalk "+o.nodeName+" class="+o.className+" sel="+sel);
	if (!o||o.nodeType==9) return;
	if (sel.indexOf(",")!=-1) {
		var mult=sel.split(",");
		for(var m in mult)
			cssWalk(o,(""+mult[m]).trim(),fn);
	} else
		domWalk(o,fn,function(o) {return cssTrace(o,sel);});//?!?!testar isto
}

//Element.prototype.cssWalk=function(sel,fn) {return cssWalk(this,sel,fn);}
document.cssWalk=function(sel,fn) {return cssWalk(document,sel,fn);}

//makes an array out of selector iterator
function cssSel(sel) {
	var r=new Array();
	cssWalk(document,sel,function(o) {r.push(o);});
	return r;
}

//cssWalk(document,"body, .myclass input",function(o) {alert(o.nodeName);});

//cssSel(".myclass form").walk( function(o) {alert(o.nodeName);} );


