/*
 * OptionLoad - jQuery plugin 1.0.0
 *
 * Copyright (c) 2009 Squins
 */

;(function($) {
	$.fn.extend({
		optionload: function(url, elementParent, options) {
			options = $.extend({
				url: url
			}, options);
			return this.each(function() {
				new $.OptionLoader($(this), elementParent, options);
			});
		}
	});

	$.OptionLoader = function (element, elementParent, options) {
		var $element = element;
		var $parent = elementParent;

		// When the value of $parent changes, the options of $element should be renewed
		$parent.change(function() {
			loadOptions($("option:selected", $(this)).val(), options);
		}).change();
		
		// Execute the ajax request when the value of $parent has changed
		function loadOptions(value, options) {
			$element.empty();
			if (value != "undefined" && value != undefined) {
				$.ajax({
					dataType: "text",
					url: options.url,
					data: $.extend({value: value}, options.extraParams),
					success: function(data) {
						setOptions(data, options.extraParams.selectedValue);
					}
				});
			}
		}
		
		// Renew the options in $element
		function setOptions(data, selectedValue) {
			data = parse(data);
			for (var i=0; i < data.length; i++) {
				elementHTML = "<option value=\""+data[i].value+"\"";
				if (data[i].value == selectedValue) {
					elementHTML += " selected=\"selected\"";
				}
				elementHTML += ">"+data[i].label+"</option>";
				$element.append(elementHTML);
			}
			$element.change();
		}
		
		// Parse the response data to a workable array
		function parse(data) {
			var parsed = [];
			var rows = data.split("\n");
			for (var i=0; i < rows.length; i++) {
				var row = $.trim(rows[i]);
				if (row) {
					row = row.split("|");
					parsed[parsed.length] = {
						label: row[1],
						value: row[0]
					};
				}
			}
			return parsed;
		};		
	}
})(jQuery);

/**
 * SQUINS
 * Find all fields with the class optionload and initialize it
 */
$(document).ready(function() {
	function addOptionLoad(context) {
		$(".optionload:not(.optionload-enabled)", context.getElement()).each(function() {
			if (this.tagName == "SELECT") {
				// Prevent multiple requests per optionload when this function is called multiple times 
				$(this).addClass("optionload-enabled");
				
				// Fetch the needed data
				entityChildName = $("object.optionload > param[name='entityChildName']", $(this).parent())[0].value;
				field = $("object.optionload > param[name='field']", $(this).parent())[0].value;
				elementParent = $("object.optionload > param[name='parent']", $(this).parent())[0].value;
				sessionId =	$("input[name='sessionId']", $(this).parents("form")[0])[0].value;
				selectedValue = $("object.optionload > param[name='value']", $(this).parent())[0].value;
				
				// Enable the optionload
				$(this).optionload("/text-request/", $("#"+elementParent), {
					extraParams: {
						action: "optionLoad",
						entityChildName: entityChildName,
						field: field,
						sessionId: sessionId,
						selectedValue: selectedValue
					}
				});
			}
		});
	}
	PageRequest.addOnPageStructureChangeEvent(addOptionLoad);
});

