var Flow = new Class({
	initialize: function(xmlString)
	{
		this.steps = new Array();
		this.layout = "horizontal";
		this.parseXML(xmlString);
	},
	
	parseXML: function(xmlString)
	{
		if ( xmlString )
		{
			var xml = new XMLParser(xmlString);
			var flowNode = xml.root;
			if ( flowNode )
			{
				//Set flow.layout based on XML
				this.layout = flowNode.getAttribute('layout').toString() ? flowNode.getAttribute('layout').toString() : "horizontal";
	
				var stepsNode = flowNode.firstChild;
				if ( stepsNode )
				{
					var stepNodes = stepsNode.getElementsByTagName('step');
					for(var i=0;i<stepNodes.length;i++)
					{
						this.addStep(new Step({
							id: stepNodes.item(i).getAttribute("id").toString(),
							name: stepNodes.item(i).getAttribute("name").toString(),
							image_url: stepNodes.item(i).getAttribute("image_url").toString(),
							icon_url: stepNodes.item(i).getAttribute("icon_url").toString(),
							custom_image: parseInt(stepNodes.item(i).getAttribute("custom_image").toString())
						}));
					}
				}
			}
		}
	},
	
	
	addStep: function(step)
	{
		this.steps.push(step.clone());
		this.onStepsChanged();
	},
	
	onStepsChanged: function()
	{
		// Set the index attribute
		for(var i=0;i<this.steps.length;i++)
		{
			this.steps[i].index = i;
		}
	},
	
	removeStep: function(step)
	{
		var stepsAfter = new Array();
		
		
		for(var i=0;i<this.steps.length;i++)
		{
			if ( this.steps[i].index != step.index )
				stepsAfter.push(this.steps[i]);
		}
		
		this.steps = stepsAfter;
		this.onStepsChanged();
	},
	
	toXML: function()
	{
		var xml = XMLBuilder.openTag("flow", {layout: this.layout})+"\n";
		xml += XMLBuilder.openTag("steps")+"\n";
		for(var i=0;i<this.steps.length;i++)
		{
			xml += this.steps[i].toXML() + "\n";
		}
		xml += XMLBuilder.closeTag("steps")+"\n";
		xml += XMLBuilder.closeTag("flow");
		
		return xml;
	},
	
	setOrder: function(newOrder)
	{
		var newSteps = new Array();
		for(var i=0;i<newOrder.length;i++)
		{
			newSteps.push(this.steps[newOrder[i]]);
		}
		
		this.steps = newSteps;
		this.onStepsChanged();
	}
});
