/**
* jQuery jSelect plugin
* @requires	jQuery v1.2+
* @licenses	Creative Commons BY-SA [ http://creativecommons.org/licenses/by-sa/2.0/deed.fr ]
* @desc		Plugin jQuery that enable load and add Option in Select
* @author	Hervé GOUCHET [ contact(at)rvdevsign(dot)net ]
* @version	1.3.1
* @date		2009/03/17
* @doc		http://www.rvdevsign.net/ressources/javascript/jselect-plugin-jquery.html
*/

(function(d){d.fn.jselect=function(b){var n=this;var b=d.extend({},d.fn.jselect.defaults,b);var j=[];if(b.loadUrl){d.ajax({type:b.loadType,url:b.loadUrl,data:b.loadData,dataType:b.loadDataType,success:function(c){var a=false;if(c){a=true}if(b.data.length>0){k(b.data,b.dataType,!a,false)}if(a==true){k(c,b.loadDataType,a,false)}},error:function(){b.loadUrl=null;if(d.isFunction(b.loadOnError)){b.loadOnError()}}})}else if(b.data.length>0){k(b.data,b.dataType,true,false)}else{p()}function p(){if(n.is("select")==true){s(d(n));if(d.isFunction(b.onComplete)){b.onComplete(d(n))}}}function k(a,e,i,h){var m={oValue:"",oText:"",oSelected:"",oClass:""};var l=[];if(e=='xml'||e=='html'){d('option',a).each(function(){oValue=d(this).attr('value');oText=(e=='xml'?d(this).attr('text'):d(this).text());oSelected=(d(this).attr('selected')=="true"||d(this).attr('selected')=="selected"?true:false);if(oValue!==""&&oText!==""){var c={oValue:oValue,oText:oText,oSelected:oSelected,oClass:d(this).attr('class')};c=d.extend({},m,c);if(h==false){j.push(c)}else{l.push(c)}}})}else if(e=='array'){var o=a.length;for(var f=0;f<o;f++){if(a[f].constructor.toString().indexOf("Array")==-1){if(a[f]!==""){var g={oValue:a[f],oText:a[f],oSelected:false,oClass:""};g=d.extend({},m,g);if(h==false){j.push(g)}else{l.push(g)}}}else if(a[f].length>1){if(a[f][0]!==""&&a[f][1]!==""){var g={oValue:a[f][0],oText:a[f][1],oSelected:(typeof a[f][2]!="undefined"?a[f][2]:false),oClass:(typeof a[f][3]!="undefined"?a[f][3]:"")};g=d.extend({},m,g);if(h==false){j.push(g)}else{l.push(g)}}}}}else if(e=='json'){var o=a.select.length;for(var f=0;f<o;f++){if(a.select[f].oValue!==""&&a.select[f].oText!==""){var g=d.extend({},m,a.select[f]);if(h==false){j.push(g)}else{l.push(g)}}}}if(i==true&&h==false){p()}if(h==true){return l}}function s(c){var a=j;if(b.replaceAll==false){var e=k(c,"html",false,true);a=e.concat(a)}c.empty();if(b.addOption==true){a.push({oValue:b.addOptionValue,oText:b.addOptionText,oSelected:false,oClass:b.addOptionClass})}q(c,a);c.change(function(){if(b.addOption==true){t(c)}if(d.isFunction(b.onChange)){b.onChange(d(this).val(),d(this).find("option[value='"+d(this).val()+"']").html(),d(this))}})}function q(c,a){var e=c.get(0);var i=a.length;e.options.length=i;for(var h=0;h<i;h++){u(e,h,a[h])}}function u(c,a,e){c.options[a]=new Option(e.oText,e.oValue);if(e.oSelected&&e.oSelected==true){c.options[a].selected=true}if(e.oClass){c.options[a].setAttribute("class",e.oClass)}}function t(c){if(c.val()==b.addOptionValue){var a=prompt(b.addOptionPrompt,"");if(a&&b.addOptionUrl){v(c,a)}}}function v(a,e){d.ajax({type:b.addOptionType,url:b.addOptionUrl,data:b.addOptionData+e,success:function(c){if(c&&c!=""){w(a,c,e)}else{r(a,e)}},error:function(){r(a,e)}})}function r(c,a){b.addOptionUrl=null;c.get(0)[0].selected=true;if(d.isFunction(b.addOptionOnError)){b.addOptionOnError(a,c)}}function w(c,a,e){var i=[];i=k(c,"html",false,true);if(b.addOption==true){i.pop()}i.push({oValue:a,oText:e,oSelected:b.addOptionSetSelected,oClass:b.addOptionSetClass});if(b.addOption==true){i.push({oValue:b.addOptionValue,oText:b.addOptionText,oSelected:false,oClass:b.addOptionClass})}q(c,i);if(d.isFunction(b.addOptionOnComplete)){b.addOptionOnComplete(a,e,c)}}};d.fn.jselect.defaults={data:[],dataType:"array",replaceAll:true,onChange:function(){},onComplete:function(){},loadUrl:null,loadData:null,loadType:"POST",loadOnError:function(){},loadDataType:"xml",addOption:false,addOptionUrl:null,addOptionData:"newOption=",addOptionType:"POST",addOptionValue:"-1",addOptionText:"Add an option",addOptionClass:null,addOptionPrompt:"Text of the new option:",addOptionSetSelected:true,addOptionSetClass:null,addOptionOnComplete:function(){},addOptionOnError:function(){}}})(jQuery);
