/**
* jQuery jSelect plugin
* @requires jQuery v1.0.3+
* @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.2
* @date		2009/01/14
* @doc		http://www.rvdevsign.net/ressources/javascript/jselect-plugin-jquery.html
*/

(function($){$.fn.jselect=function(k){var l=this;var k=$.extend({},$.fn.jselect.defaults,k);var m=[];if(k.loadUrl){$.ajax({type:k.type,url:k.loadUrl,data:k.loadData,dataType:k.loadDataType,success:function(a){var b=false;if(a){b=true}if(k.data.length>0){parseData(k.data,k.dataType,!b,false)}if(b==true){parseData(a,k.loadDataType,b,false)}},error:function(){k.loadUrl=null;if($.isFunction(k.loadOnError)){k.loadOnError()}}})}else if(k.data.length>0){parseData(k.data,k.dataType,true,false)}else{jselect()}function jselect(){if(l.is("select")==true){manageSelect($(l));if($.isFunction(k.onComplete)){k.onComplete($(l))}}}function parseData(b,c,d,e){var f={oValue:"",oText:"",oSelected:"",oClass:""};var g=[];if(c=='xml'||c=='html'){$('option',b).each(function(){oValue=$(this).attr('value');oText=(c=='xml'?$(this).attr('text'):$(this).text());oSelected=($(this).attr('selected')=="true"||$(this).attr('selected')=="selected"?true:false);if(oValue!==""&&oText!==""){var a={oValue:oValue,oText:oText,oSelected:oSelected,oClass:$(this).attr('class')};a=$.extend({},f,a);if(e==false){m.push(a)}else{g.push(a)}}})}else if(c=='array'){var h=b.length;for(var i=0;i<h;i++){if(b[i].length>1){if(b[i][0]!==""&&b[i][1]!==""){var j={oValue:b[i][0],oText:b[i][1],oSelected:(typeof b[i][2]!="undefined"?b[i][2]:false),oClass:(typeof b[i][3]!="undefined"?b[i][3]:"")};j=$.extend({},f,j);if(e==false){m.push(j)}else{g.push(j)}}}}}else if(c=='json'){var h=b.select.length;for(var i=0;i<h;i++){if(b.select[i].oValue!==""&&b.select[i].oText!==""){var j=$.extend({},f,b.select[i]);if(e==false){m.push(j)}else{g.push(j)}}}}if(d==true&&e==false){jselect()}if(e==true){return g}}function manageSelect(a){var b=m;if(k.replaceAll==false){var c=parseData(a,"html",false,true);b=c.concat(b)}a.empty();if(k.addOption==true){b.push({oValue:k.addOptionValue,oText:k.addOptionText,oSelected:false,oClass:k.addOptionClass})}manageOption(a,b);a.change(function(){if(k.addOption==true){getOption(a)}if($.isFunction(k.onChange)){k.onChange($(this).val(),$(this).find("option[@value='"+$(this).val()+"']").html(),$(this))}})}function manageOption(a,b){var c=a.get(0);var d=b.length;c.options.length=d;for(var o=0;o<d;o++){createOption(c,o,b[o])}}function createOption(a,b,c){a.options[b]=new Option(c.oText,c.oValue);if(c.oSelected&&c.oSelected==true){a.options[b].selected=true}if(c.oClass){a.options[b].setAttribute("class",c.oClass)}}function getOption(a){if(a.val()==k.addOptionValue){var b=prompt(k.addOptionPrompt,"");if(b&&k.addOptionUrl){newOption(a,b)}}}function newOption(b,c){$.ajax({type:k.addOptionType,url:k.addOptionUrl,data:k.addOptionData+c,success:function(a){if(a&&a!=""){addOption(b,a,c)}else{errorOption(b,c)}},error:function(){errorOption(b,c)}})}function errorOption(a,b){k.addOptionUrl=null;a.get(0)[0].selected=true;if($.isFunction(k.addOptionOnError)){k.addOptionOnError(b,a)}}function addOption(a,b,c){var d=[];d=parseData(a,"html",false,true);if(k.addOption==true){d.pop()}d.push({oValue:b,oText:c,oSelected:k.addOptionSetSelected,oClass:k.addOptionSetClass});if(k.addOption==true){d.push({oValue:k.addOptionValue,oText:k.addOptionText,oSelected:false,oClass:k.addOptionClass})}manageOption(a,d);if($.isFunction(k.addOptionOnComplete)){k.addOptionOnComplete(b,c,a)}}};$.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);