/*
 * jQuery related selects plug-in 0.2
 *
 * http://www.erichynds.com
 *
 * Copyright (c) 2009 Eric Hynds
 *
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

(function($){var opts={};$.fn.relatedSelects=function(options){opts=$.extend({},$.fn.relatedSelects.options,options);return this.each(function(){var $this=$(this);var selects=[];if($.isArray(opts.selects)){var arrSelects=opts.selects;opts.selects={};for(var i=0;i<arrSelects.length;i++){opts.selects[arrSelects[i]]={};};};for(key in opts.selects)selects.push(key);$this.data('selects',selects);saveDefaults($this);$.each(opts.selects,function(elem,o){var $select=$("select[name='"+elem+"']",$this);var $next=next(elem,$this);var selectedValue=$select.find('option:selected').attr('value');o=$.extend({defaultOptionText:opts.defaultOptionText||$select.data('defaultOption')},opts,o);$select.data('defaultOption',o.defaultOptionText);$select.change(function(){o.onChange.call($select);process($select,$next,elem,o,$this);});if(selectedValue&&selectedValue.length>0&&isPopulated($next))return;process($select,$next,elem,o,$this);});});};function saveDefaults(context){$.each(opts.selects,function(elem,o){var $elem=$("select[name='"+elem+"']",context);$elem.data('defaultOption',$elem.find('option[value=""]').text());});};function process($select,$next,elem,o,context){if($next.length===0)return;var value=$.trim($select.find('option:selected').attr('value'));if(value.length>0&&value!==o.loadingMessage&&$next){resetAfter(elem,context);populate($select,$next,o,context);}else if($next){resetAfter(elem,context);};};function populate($callerSelect,$select,o,context){var selects=context.data('selects'),selectors=[],params=[];for(var x=0;x<selects.length;x++){selectors.push('select[name="'+selects[x]+'"]');};params=$(selectors.join(','),context).serialize();$select.attr("disabled","disabled").html('<option value="">'+o.loadingMessage+'</option>');$.ajax({beforeSend:function(){o.onLoadingStart.call($select);},complete:function(){o.onLoadingEnd.call($select);},dataType:'json',data:params,url:o.onChangeLoad,success:function(data){var html='<option value="" selected="selected">'+$select.data('defaultOption')+'</option>';if(typeof(data)==='object'&&data){$.each(data,function(i,item){html+='<option value="'+i+'">'+item+'</option>';});$select.html(html).removeAttr('disabled');}else{$select.html(html);if(!o.disableIfEmpty){$select.removeAttr('disabled');};o.onEmptyResult.call($callerSelect);};}});};function isPopulated($select){var options=$select.find('option');return(options.length===0||(options.length===1&&options.filter(':first').attr('value').length===0))?false:true;};function resetAfter(elem,context){var thispos=getPosition(elem,context),selects=context.data('selects');for(var x=thispos+1;x<selects.length;x++){$("select[name='"+selects[x]+"']",context).attr("disabled","disabled").find("option:first").attr("selected","selected");};};function next(elem,context){return $("select[name='"+context.data('selects')[getPosition(elem,context)+1]+"']",context);};function getPosition(elem,context){var selects=context.data('selects');for(var i=0;i<selects.length;i++){if(selects[i]===elem){return i;};};};$.fn.relatedSelects.options={selects:{},loadingMessage:'Loading, please wait...',disableIfEmpty:false,onChangeLoad:'',onLoadingStart:function(){},onLoadingEnd:function(){},onChange:function(){},onEmptyResult:function(){}};})(jQuery);
