//moo.dom by Valerio Proietti (http://mad4milk.net) MIT Open Source license;
//v 1.5 (beta);

function $S() {
	var elements = [];
	$A(arguments).each(function(sel){
		if (typeof sel == 'string') {
			sel.getElements().each(function(el){
				elements.push(el);
			});
		}
		else elements.push(sel);
	});
	return $d(elements);
}

/*------------------String Prototypes----------------------*/

Object.extend(String.prototype, {
	getElements: function(filter){
		var params = $A([]);
		$A(this.split(' ')).each(function(arg, j){
			params[j] = param = $A([]);
			if (arg.indexOf('#') > -1) {
				var bits = arg.split('#');
				param['tag'] = bits[0] || '*';
				param['id'] = bits[1];
			}
			else if (arg.indexOf('.') > -1) {
				var bits = arg.split('.');
				param['tag'] = bits[0] || '*';
				param['class'] = bits[1];
			}
			else param['tag'] = arg;
		});
		var filter = filter || document;
		try {
			if (filter != document)
				filter = $d(filter);
		} catch(e) {
			printfire('error: ' + e);
		}
		try {
			filter = $d(filter.getElementsByTagName('*'));
		} catch(e) {
			printfire('error: ' + e);
		}
		params.each(function(param, k){
			if (param['tag'] != '*' && k == 0) filter = $d(filter.filterByTagName(param['tag']));
			else if (k != 0) filter = $d(filter.getElementsByTagName(param['tag']));
			if (param['id']) filter = $d(filter.filterById(param['id']));
			if (param['class']) filter = $d(filter.filterByClassName(param['class']));
		});
		return $d(filter);
	},
	
	getElementsBySelector: function(filter){
		if (!filter) filter = null;
		var elements = [];
		$A(this.split(',')).each(function(selector){
			elmnts = selector.replace(/^\s*|\s*$/g,"").getElements(filter);
			$A(elmnts).each(function(el){
				elements.push(el);
			});
		});
		return $d(elements);
	}
});


/*----------------------Array Prototypes-----------------------*/

/* -- function $c(array){
	var nArray = $A([]);
	for (i=0;el=array[i];i++) nArray.push(el);
	var returnArray = makeArrayEach(nArray);
	return makeArrayEach(nArray);
} -- */
var $A = Array.from = function(iterable) {
  if (!iterable) {
		return makeArrayEach([]);
	}
  if (iterable.toArray) {
    return makeArrayEach(iterable.toArray());
  } else {
    var results = makeArrayEach([]);
    for (var i = 0; i < iterable.length; i++)
      results.push(iterable[i]);
    return results;
  }
}
function makeArrayEach(array) {
 	array.each = function(func){
		for(var i=0;ob=this[i];i++) func(ob, i);
	}
	return array;
}
var $d = Array.from = function(array) {
	if (! array.each)
		array = $A(array);
	array.iterate = function(func){
		for(var i=0;ob=this[i];i++) func(ob, i);
	}
	array.action = function(actions){
		$A(this).each(function(el){
			if (actions.initialize) actions.initialize.apply(el);
			for(action in actions){
				if (action.slice(0,2) == 'on') el[action] = actions[action];
			}
		});
	}
	
	array.filterById = function(id){
		var found = $A([]);
		$A(this).each(function(el){
			if (el.id == id) found.push(el);
		});
		return $A(found);
	}
	array.filterByClassName = function(className){
		var found = $A([]);
		$A(this).each(function(el){
			if (Element.hasClassName(el, className)) found.push(el);
		});
		return $A(found);
	}
	array.filterByTagName = function(tagName){
		var found = $A([]);
		$A(this).each(function(el){
			if (el.tagName.toLowerCase() == tagName) found.push(el);
		});
		return $A(found);
	}
	array.getElementsByTagName = function(tagName){
		var found = $A([]);
		$A(this).each(function(el){
			$A(el.getElementsByTagName(tagName)).each(function(tn){
				found.push(tn);
			});
		});
		return $A(found);
	}
	return array;
}
//if(!Array.prototype.each) Array.prototype.each = Array.prototype.iterate;