
;(function($) {
$.fn.extend({
	selectdependency: function(options) {
		options = $.extend({}, $.SelectDependency.defaults, options);

		return this.each(function() {
			new $.SelectDependency(this, options);
		});
	}
});

$.SelectDependency = function(objElm, options) {

	function restrict() {
		var value = $(objElm).val();

		if(!options.feedUrl) { alert('Invalid feedUrl'); return(false); }

		var params = options.attributes;
		$.each(options.parentElements, function(key, xpath) { params[key] = $(xpath).val(); });

		// Put loading state
		if(options.loadingText) { $(objElm).find('option').remove().end().append('<option value="">' + options.loadingText + '</option>').val(''); }
		if(options.loadingClass) { $(objElm).addClass('Loading'); }

		$.getJSON(options.feedUrl, params, function(data) {
			if(data.status) {
				var htmlOptions = '<option value="">' + options.emptyText + '</option>';
				$.each(data.options, function(value, text) { htmlOptions += '<option value="' + value + '">' + text + '</option>'; });
				$(objElm).find('option').remove().end().append(htmlOptions).val();
				if(value) {
					$(objElm).val(value);
					if(options.selectedClass) { $('option:selected', objElm).addClass(options.selectedClass); }
				}
				if(options.loadingClass) { $(objElm).removeClass('Loading'); }
			}
		});
	}

	if(options.refreshOnInit) {
		var has_val = false;
		$.each(options.parentElements, function(key, xpath) {
			if($(xpath).val()) { has_val = true; }
		});
		if(has_val) { restrict(); }
	}
	$.each(options.parentElements, function(key, xpath) { $(xpath).change(restrict); });
}

$.SelectDependency.defaults = {
	'selectedClass' : 'Sel',
	'loadingClass' : 'Loading',
	'loadingText' : '',
	'refreshOnInit' : true,
	'parentElements' : {},
	'feedUrl' : '',
	'emptyText' : '',
	'attributes' : {}
}

})(jQuery);

