(function($) {
	$.fn.jobBoard = function(options) {
		var $this = this.text('Loading ...');
		options = $.extend({
			render: 'table',
			container: true,
			jobs: null
		}, options || {});
		
		var render = {
			table: function(jobs) {
				var $container = this;
				if (options.container) {
					$container = $('<table></table>').appendTo(this);
				}
				$container.append('<tr><th>Country</th><th>Company</th><th>Title</th></tr>');
				$.each(jobs, function() {
					$('<tr><td/><td/><td/><td/></tr>')
						.find('td:nth(0)')
						.text(this.Country.name)
						.end()
						.find('td:nth(1)')
						.text(this.Job.company)
						.end()
						.find('td:nth(2)')
						.append($('<a/>').attr('href', this.Job.url).text(this.Job.title))
						.end()
						.appendTo($container);
				});
			},
			list: function(jobs) {
				var $container = this;
				if (options.container) {
					$container = $('<ul/>').appendTo(this);
				}
				$.each(jobs, function() {
					$('<a/>')
						.text(this.Job.title)
						.attr('href', this.Job.url)
						.wrap('<li/>')
						.parent()
						.appendTo($container);
				});
			}
		};

		var renderJobs = function(jobs) {
			$this.empty();
			if (typeof options.render == 'function') {
				return options.render.call($this, jobs);
			}
			render[options.render].call($this, jobs);
		};
		
		if (options.jobs) {
			renderJobs(options.jobs);
		} else {
			$.findJobs(options, function(jobs) {
				if (jobs.error) {
					return alert('Error: '+jobs.error);
				}
				renderJobs(jobs);
			});
		}
		return this;
	};
	
	$.findJobs = function(options, callback) {
		if (typeof options == 'function') {
			options = {callback: options};
		}
		options = $.extend({
			url: 'http://www.eliteopensourcejobs.com/jobs.js',
			useVar: '__eocJobs',
			affiliate_id: null,
			callback: callback
		}, options || {});

		options.url = options.url+'?assign=window.'+options.useVar;
		if (options.affiliate_id) {
			options.url = options.url+'&affiliate_id='+options.affiliate_id;
		}
		$.getScript(options.url, function() {
			if (!(options.useVar in window)) {
				return false;
			}
			options.callback(window[options.useVar]);
			delete window[options.useVar];
		});
	};
})(jQuery);