/****************************************
* CARACTERÍSTICAS.
****************************************

1. Funciones disponibles.
function getAllChildren(elt)
function findDOM(targetId, withStyle)
function hasClass(elt, clase)
function getElementsByClass(clases)
function getFirstAncestorByClass(elt, clase)
document.getElementsBySelector = function(selector)



/****************************************
(A) COLECCIONES GLOBALES.
****************************************/

// 1. Variables.
// var allTags = (document.all) ? document.all : document.getElementsByTagName("*")
// var allLinks = document.links;
// var allForms = document.forms;
var allImages = document.images;
// var allInputs = document.getElementsByTagName('input');
// var allTxtAreas = document.getElementsByTagName('textarea');
// var allLabels = document.getElementsByTagName('label');


// 2. Returns all children of element.
// function getAllChildren(elt) {
// 	return elt.all ? elt.all : elt.getElementsByTagName('*');
// }



/****************************************
(B) ACCESO MULTINAVEGADOR A UN ELEMENTO POR EL ID..
****************************************/

// 1. Detección de la forma de acceder al DOM mediante la asignación de 1+3 variables.
// var isDHTML = 0;
// var isID = 0;
// var isAll = 0;
// var isLayers = 0;
// 
// if (document.getElementById) {isID = 1; isDHTML = 1;}  // W3C DOM: MSIE 5+, Netscape 6+
// else if (document.all) {isAll = 1; isDHTML = 1;}  // MSIE 4
// else if ((navigator.appName.indexOf('Netscape') != -1) && (parseInt(navigator.appVersion) == 4)) {isLayers = 1; isDHTML = 1;}  // Netscape 4
// 
// 
// 2. Función para acceder a cualquier elemento a través del id basada en las variables anteriores.
// function findDOM(targetId, withStyle) {
// 	if (withStyle == 1) {
// 		if (isID) {return (document.getElementById(targetId).style);}
// 		else if (isAll) {return (document.all[targetId].style);}
// 		else if (isLayers) {return (document.layers[targetId]);}
// 		else {return false;}
// 	}
// 	else {
// 		if (isID) {return (document.getElementById(targetId)) ;}
// 		else if (isAll) {return (document.all[targetId]);}
// 		else if (isLayers) {return (document.layers[targetId]);}
// 		else {return false;}
// 	}
// }
// 
// 
// 
/****************************************
(C) ACCESO A ELEMENTOS POR LA CLASE.
****************************************/
// 
// 1. Determina si un elemento tiene asignada una determinada clase.
// function hasClass(elt, clase) {
// 	var pattern = new RegExp("(^|\\s)"+clase+"(\\s|$)");
// 	if (pattern.test(elt.className)) {return true;}
//     return false;
// }
// 
// 
// 2. Devuelve un array con todos los elementos que tengan al menos una de las clases pasadas por parámetro (separadas por espacios).
// Ej: 	elts = getElementsByClass('divUno divDos'); alert(elts[0].innerHTML);
// function getElementsByClass(lasClases, node) {
// 	if (node == null) {node = document;}
// 	var clases = lasClases.split(' ');
// 	var refTags = getAllChildren(node);
// 	var selTags = new Array();

// 	for (var i=0; i<refTags.length; i++) {
// 		for (var j=0; j<clases.length; j++) {
// 			if (hasClass(refTags[i],clases[j])) {
// 				selTags[selTags.length] = refTags[i];
// 				break;
// 			}
// 		}
// 	}
// 
// 	return selTags;
// }
// 
// 
 // 3. Devuelve el primer elemento padre de "elt" que tenga asignada la case "clase".
// function getFirstAncestorByClass(elt, clase) {
// 	var parent = elt;
// 	while (parent = parent.parentNode) {
// 		if (hasClass(parent,clase)) {return parent;}
// 	}
// 	return null;
// }
// 
// 
// 4. Returns an array of element objects from the current document matching the CSS selector.
// Selectors can contain element names, class names and ids, and can be nested.
// Ej: elements = document.getElementsBySelector('div#main p a.external')
// Support for CSS2 and CSS3 attribute selectors: see http://www.w3.org/TR/css3-selectors/#attribute-selectors
// DEMO: http://simon.incutio.com/js/getElementsBySelector.html.
// Version 0.4 - Simon Willison, March 25th 2003.
// Works in Phoenix 0.5, Mozilla 1.3, ¿Opera 7?, Internet Explorer 6, Internet Explorer 5 on Windows
// document.getElementsBySelector = function(selector) {
	// Attempt to fail gracefully in lesser browsers
// 	if (!document.getElementsByTagName) {
// 		return new Array();
// 	}
	// Split selector in to tokens
// 	var tokens = selector.split(' ');
// 	var currentContext = new Array(document);
// 	for (var i = 0; i < tokens.length; i++) {
// 		token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
// 		if (token.indexOf('#') > -1) {
// 			// Token is an ID selector
// 			var bits = token.split('#');
// 			var tagName = bits[0];
// 			var id = bits[1];
// 			var element = document.getElementById(id);
// 			if (tagName && element.nodeName.toLowerCase() != tagName) {
				// tag with that ID not found, return false
// 				return new Array();
// 			}
			// Set currentContext to contain just this element
// 			currentContext = new Array(element);
// 			continue; // Skip to next token
// 		}
// 		if (token.indexOf('.') > -1) {
			// Token contains a class selector
// 			var bits = token.split('.');
// 			var tagName = bits[0];
// 			var className = bits[1];
// 			if (!tagName) {
// 				tagName = '*';
// 			}
			// Get elements matching tag, filter them for class selector
// 			var found = new Array;
// 			var foundCount = 0;
// 			for (var h = 0; h < currentContext.length; h++) {
// 				var elements;
// 				if (tagName == '*') {
// 					elements = getAllChildren(currentContext[h]);
// 				}
// 				else {
// 					elements = currentContext[h].getElementsByTagName(tagName);
// 				}
// 				for (var j = 0; j < elements.length; j++) {
// 					found[foundCount++] = elements[j];
// 				}
// 			}
// 			currentContext = new Array;
// 			var currentContextIndex = 0;
// 			for (var k = 0; k < found.length; k++) {
// 				if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
// 					currentContext[currentContextIndex++] = found[k];
// 				}
// 			}
// 			continue; // Skip to next token
// 		}
		// Code to deal with attribute selectors
// 		if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
// 			var tagName = RegExp.$1;
// 			var attrName = RegExp.$2;
// 			var attrOperator = RegExp.$3;
// 			var attrValue = RegExp.$4;
// 			if (!tagName) {
// 				tagName = '*';
// 			}
			// Grab all of the tagName elements within current context
// 			var found = new Array;
// 			var foundCount = 0;
// 			for (var h = 0; h < currentContext.length; h++) {
// 				var elements;
// 				if (tagName == '*') {
// 					elements = getAllChildren(currentContext[h]);
// 				}
// 				else {
// 					elements = currentContext[h].getElementsByTagName(tagName);
// 				}
// 				for (var j = 0; j < elements.length; j++) {
// 					found[foundCount++] = elements[j];
// 				}
// 			}
// 			currentContext = new Array;
// 			var currentContextIndex = 0;
// 			var checkFunction; // This function will be used to filter the elements
// 			switch (attrOperator) {
// 				case '=': // Equality
// 					checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
// 					break;
// 				case '~': // Match one of space seperated words
// 					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); // };
// 					break;
// 				case '|': // Match start with value followed by optional hyphen
// 					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
// 					break;
// 				case '^': // Match starts with value
// 					checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
// 					break;
// 				case '$': // Match ends with value - fails with "Warning" in Opera 7
// 					checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == // // e.getAttribute(attrName).length - attrValue.length); };
// 					break;
// 				case '*': // Match ends with value
// 					checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
// 					break;
// 				default :
					// Just test for existence of attribute
// 					checkFunction = function(e) { return e.getAttribute(attrName); };
// 			}
// 			currentContext = new Array;
// 			var currentContextIndex = 0;
// 			for (var k = 0; k < found.length; k++) {
// 				if (checkFunction(found[k])) {
// 					currentContext[currentContextIndex++] = found[k];
// 				}
// 			}
			// alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
// 			continue; // Skip to next token
// 		}
		// If we get here, token is JUST an element (not a class or ID selector)
// 		tagName = token;
// 		var found = new Array;
// 		var foundCount = 0;
// 		for (var h = 0; h < currentContext.length; h++) {
// 			var elements = currentContext[h].getElementsByTagName(tagName);
// 			for (var j = 0; j < elements.length; j++) {
// 				found[foundCount++] = elements[j];
// 			}
// 		}
// 		currentContext = found;
// 	}
// 	return currentContext;
// }
