/**
Thu Jun  4 12:57:49 CEST 2009
*    Chained Selects for jQuery 
*    Copyright (C) 2008 Ziadin Givan www.CodeAssembly.com  
*
*    This program is free software: you can redistribute it and/or modify
*    it under the terms of the GNU General Public License as published by
*    the Free Software Foundation, either version 3 of the License, or
*    (at your option) any later version.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program.  If not, see http://www.gnu.org/licenses/
*
*    
*   settings = { usePost : true, before:function() {}, after: function() {}, default: null, parameters : { parameter1 : 'value1', parameter2 : 'value2'} }	
*   if usePost is true, then the form will use POST to pass the parameters to the target, otherwise will use GET
*   "before" function is called before the ajax request and "after" function is called after the ajax request.
*   If defaultValue is not null then the specified option will be selected.
*   You can specify additional parameters to be sent to the the server in settings.parameters.
*
*
* Code is aangepast om goed te kunnen samenwerken met patForms.
*
*/

jQuery.fn.chainSelect = function( target, url, settings ) 
{
   var settings = jQuery.extend(
		{
			after : null,
			before : null,
			endOfChain: null,
			usePost : false,
			defaultValue : null,
			autohide: true,
			firstRun: true, /* om te bepalen of dit de eerste change is. */
			autoselect: true, // indien false selecteerd niet automatisch de volgende (tenzij maar 1 optie)
			parameters : {}

        	} , settings);

    var defaults = {};

    var container;
    if(typeof jQuery(target).closest != 'undefined') { // vanaf jquery 1.3
	container = jQuery(target).closest('div');
    } else {
	container = jQuery(target).parent();
    }

    settings.parameters.name = container.attr('id'); // nodig om het data bestand te kunnen lezen

    var selects = container.find('select');

    // collecteer de defaults
    selects.each(function() {
	var name = jQuery(this).attr('name');
	defaults[name] = jQuery(this).find('option').text();

	// reset alle velden, browser kan geprobeerd hebben "onthouden" waardes terug te zetten.
	jQuery(this).val('');
    });

  return this.each( function()
  {

	jQuery(this).change( function( ) 
	{

		// voorgaande selects opzoeken en daar de waardes van opzoeken.

		var vars = [];
		var currentSelect = this;
		var nextAll = [];
		var prevAll = [];

		selects.each(function() {
				  vars.push(jQuery(this).val());
				  prevAll.push(this);
				  return (currentSelect != this); // ga door tot huidige
				});
		//vars.reverse();
		if (settings.before) { settings.before( target ); }

		var next = false;
		selects.each(function() {
			if(currentSelect == this) {
				next = true;
				return true;
			}

			if(next) {
			  nextAll.push(this);
			}
		});


		if(!jQuery(this).val()) {

			// reset alle onderliggende ook...
			jQuery(nextAll).each(function() {
				jQuery(this).html('');
				jQuery(this).val('');
				jQuery(this).attr('disabled', 'disabled').addClass('disabled');
			});

			// doe niets als dit de lege optie is
			if (settings.after) { settings.after(target); } // roep nog wel de after callback aan.
			return true;
		}

		settings.parameters.path =  vars.toString(); // jQuery(this).val(); // cumulatief doorgegeven dus: "keuken, Donderdag 2 April".. etc.

		// alles verbergen wat hierna komt en ook meteen resetten.
		if(settings.autohide) {
		  jQuery(nextAll).hide().html(''); 
		} else {
		  jQuery(nextAll).html(''); 
		}

		// disable alle select boxes.
		//$(this).parent().find('select').attr('disabled', 'disabled');
		container.find('select').attr('disabled', 'disabled').addClass('disabled');

		ajaxCallback = function(data, textStatus) 
		{
			// activeer alle select boxes
			container.find('select').removeAttr('disabled').removeClass('disabled');
			//container.find('select').removeAttr('disabled');	
			var first = true;
			jQuery(nextAll).each(function() {
				if(!first) { jQuery(this).attr('disabled', 'disabled').addClass('disabled'); }
				first = false;
			});

			//jQuery(target).html(""); //clear old options

			if(data.length == 0) {
				debug(data.length);
				jQuery(target).attr('disabled', 'disabled').addClass('disabled');

				if (settings.after) { settings.after(target); }
				if (settings.endOfChain) { settings.endOfChain(); }

			} else {

				var defaultVar = defaults[jQuery(target).attr('name')];
				if(!settings.autoselect && defaultVar) {
					jQuery(target).append('<option value="">'+ defaultVar +'</option>');
				}

				for(i=0; i < data.length; i++) {
					jQuery(target).append('<option value="'+ data[i] +'">'+ data[i] +'</option>');
				}

				if (settings.defaultValue !== null ) {
					jQuery(target).val(settings.defaultValue);//select default value
				} else {
					jQuery("option:first", target).attr( "selected", "selected" );//select first option
				}

				if (settings.after) { settings.after(target); }
	
				if(settings.autoselect) {
					jQuery(target).change(); //call next chain
				} else {

				}

			}

			settings.firstRun = false; // geef aan dat de eerst run is afgelopen
		};
		jQuery.post( url, settings.parameters, ajaxCallback, 'json' );
	});
  });
};
