var jsonFeedParser = {
	
	initialize: function(options) {

		// state
		this.setParserState(0);

		// action
		for (var i in options) {
			this[i] = options[i];
		}

		// callback
		this.afterInit();
	},
	
	setUp: function() {
		// state
		this.setParserState(1);
		
		// action
		this.feedContainer = (this.feedContainer) ? $(this.feedContainer) : $('jobFeed');
		this.feedTemplate = new Template(this.templateHTML);
		this.dataURL = '/stream.cgi?i='+this.feedID;
		
		// callback
		this.afterSetup();
	},
	
	loadData: function() {
		// state
		this.setParserState(2);

		// action
		new Ajax.Request(this.dataURL,{
			method:'get',
			sanitizeJSON:'true',
			evalJSON:'true',
			onFailure: function(){
				jsonFeedParser.setParserState(5);
				return false;
			},
			onComplete: function(transport) {
				jsonFeedParser.feedData = transport.responseJSON;
				
				// callback
				jsonFeedParser.afterLoad();
			}
		});
		
	},

	parseData: function() {
		// state
		this.setParserState(3);

		// action
		this.feedContainer.update();
		for (var i=0;i<this.feedData.length;i++) {
			this.feedContainer.insert(this.feedTemplate.evaluate(this.feedData[i]));
		}

		// callback
		this.afterParse();
	},
	
	finish: function() {
		// state
		this.setParserState(4);
	},
	
	// feed states
	parserStates: [
		'initializing',
		'setting_up',
		'getting_data',
		'parsing_data',
		'successful',
		'failed'
	],
	setParserState: function(state) {
		var states = this.parserStates.clone();
		$(document.body).addClassName('parser_'+states.splice(state,1));
		for (var i=0;i<states.length;i++) {
			$(document.body).removeClassName('parser_'+states[i]);
		}
	},
	
	// default functions
	afterInit: function() {
		this.setUp();
	},
	afterSetup: function() {
		this.loadData();
	},
	afterLoad: function() {
		this.parseData();
	},
	afterParse: function() {
		this.finish();
	}
	
}
