(function( $ ){
	var flexchartObject = function() {
		var self = this;
		var swfloaded = false;
		var element, callback;
		var loadinterval = '';
		this.settings = { width: 725, height: 320 };
		
		this.init = function(options) {
			$.extend(true, self.settings, options);
			
			element = $(this).get(0);
			
			var errors = [];
			if (self.settings.flashUrl === undefined) errors.push('flashUrl is a required setting');
			if (self.settings.dataUrl === undefined && self.settings.data === undefined) errors.push('either data or dataUrl setting is required');
			if (!swfobject) errors.push('swfobject.js is required to run');
			
			if (errors.length) {
				alert(errors.toString());
				return false;
			}
			
			if (element.id == '') {
				var randomnumbers = [];
				for (var i = 0; i < 10; i++) randomnumbers.push(Math.round(Math.random*10))
				var uniqueid = 'chart' + randomnumber.toString().replace(',', '');
				element.id = uniqueid;
			}
			
		    swfobject.embedSWF(self.settings.flashUrl, "chart", self.settings.width, self.settings.height, "9.0.28", false, {
		        descriptor: "<chart />"
		    },{
		        bgcolor: "#ffffff",
		        wmode: "transparent"
		    });
		    swfobject.addLoadEvent(function() { element = $('#' + element.id).get(0) });
		    
		    checkloaded();
		    
		    if (!(self.settings.data === undefined)) addChartData();
		    else requestData();
		}
		
		var checkloaded = function() {
			if (element.setDescriptor) {
				clearInterval(loadinterval);
				loadinterval = '';
				swfloaded = true;
				callback();
			} else if (loadinterval == '') loadinterval = setInterval(checkloaded, 50);
		}
		
		var addChartData = function() {
			if (swfloaded) {
				
				element.setDescriptor(self.settings.data);
				
			} else callback = addChartData;
		}
		
		var requestData = function() {
			if (swfloaded) {
				
				$.ajax({
					url: self.settings.dataUrl,
					data: (self.settings.dataUrlParameters === undefined) ? '' : self.settings.dataUrlParameters,
					type: 'GET',
					success: function(returnData) {
						self.settings.data = returnData;
						addChartData();
					}
				})
				
			} else callback = requestData;
		}
	}

	$.fn.flexchart = function( options ) {
		if (options == 'api' && $(this).data('flexchart')) return $(this).data('flexchart');
		return this.each(function() {
			var element = $(this);
			if (element.data('flexchart')) return;
			var myflexchart = new flexchartObject();
			myflexchart.init.call(this, options);
			element.data('flexchart', myflexchart);
		});
	}
})( jQuery );
