var Ratchet = {
	propagate: function(reference, content, options){
		if(options.split){
			content = content.split(options.split);
		}
		
		if(!options.tag){
			options.tag = "div";
		}
		
		if(options.shuffle){
			var mark = new Array();
			
			for(marked = 0; marked < Math.floor(content.length/2); marked ++){
				var i, j;
				i = Math.round(Math.random()*(content.length-1))
				for(i = Math.round(Math.random()*(content.length-1)); mark[i]; i = Math.round(Math.random()*(content.length-1)));
				mark[i] = content[i];
				for(j = Math.round(Math.random()*(content.length-1)); mark[j]; j = Math.round(Math.random()*(content.length-1)));
				mark[j] = true;
				content[i] = content[j];
				content[j] = mark[i];	
			}
		}
		
		var all_elements = new Array();
		
		for(i=0; i<content.length; i++){
			var element = document.createElement(this.fix(options.tag, i, content.length));
			//var text = document.createTextNode(this.fix(content[i], i, content.length))
			//element.appendChild(text);
			
			element.innerHTML = this.fix(content[i], i, content.length);
			
			if(options.id){
				element.id = this.fix(options.id, i, content.length);
			}
			
			if(options.classname){
				Element.addClassName(element, this.fix(options.classname, i, content.length));
			}
			
			if(options.style){
				for(attribute in options.style){
					element.style[attribute.camelize()] = this.fix(options.style[attribute], i, content.length);
				}
			}
			
			if(options.events){
				for(action in options.events){
					Event.observe(element, action, options.events[action]);
				}
			}
			
			if(options.flipflops){
				for(j=0; j<options.flipflops.length; j++){
					if(!options.flipflops[j].off) options.flipflops[j].off = options.flipflops[j].on;
					Element.setFlipFlop(element, options.flipflops[j].on, options.flipflops[j].off, this.fix(options.flipflops[j].effect, i, content.length));
				}
			}
			
			$(reference).appendChild(element);
			
			if(options.script){
				eval(this.fix(options.script, i, content.length));
			}
			
			all_elements[i] = element;
		}	
	
		return all_elements;
	},
	
	fix: function(content, iteration, total){
		content = content.replace(/\$i/g, iteration.toString());
		content = content.replace(/\$t/g, total.toString());
		content = content.replace(/\$p/g, "element");
		
		var start, end;
		while((start = content.indexOf("$e(")) != -1){
			var balence = 1;
			start += 3;
			for(end = start; balence > 0; end++){
				if(content.charAt(end + 1) == '(') balence++;
				else if(content.charAt(end + 1) == ')') balence--;
			}
			var command = content.substring(start, end);
			content = content.replace("$e(" + command + ")", eval(command).toString());
		}
		return content;
	}
}





