(function(c){
    var a=new Array();
    var b=new Array();
    $.fn.addTag=function(f,e){
        var e=jQuery.extend({
            focus:false,
            callback:true,
            value : "",
            id    : ""
        },e);
        this.each(function(){
            id=$(this).attr("id");
            var g=$(this).val().split(a[id]);
            if(g[0]==""){
                g=new Array();
            }
            f=jQuery.trim(f);
            if(e.unique){
                skipTag=$(g).tagExist(f);
            }else{
                skipTag=false;
            }
            if(f!=""&&skipTag!=true){
                $("<span>").data("value",e.value).addClass("tag").append($("<span>").text(f).append("&nbsp;&nbsp;"),
                $("<a>",{
                    href:"#",
                    title:"Removing tag",
                    text:"x"
                }).click(function(evt){
                    evt.preventDefault();
                    return $("#"+id).removeTag(escape(f));
                })).insertBefore("#"+id+"_addTag");
                g.push(f);
                $("#"+id+"_tag").val("");
                if(e.focus){
                    $("#"+id+"_tag").focus();
                }else{
                    $("#"+id+"_tag").blur();
                }
                if(e.callback&&b[id]&&b[id]["onAddTag"]){
                    var j=b[id]["onAddTag"];
                    j(f);
                }
                if(b[id]&&b[id]["onChange"]){
                    var h=g.length;
                    var j=b[id]["onChange"];
                    j($(this),g[h]);
                }
            }
            $.fn.tagsInput.updateTagsField(this,g);
        });
        
        var nbTags = $('span.tag',$(data.holder)).length;
        if(nbTags > 2){
            if((24*Math.ceil(nbTags/2)) > $(data.holder).height()-10){
                $(data.holder).css('height', ($(data.holder).height()+24)+"px" );
            }
        }        
        return false;
    };
    
    $.fn.removeAllTag=function(e){
        $('span.tag').remove();
    };
    
    $.fn.removeTag=function(e){
        e=unescape(e);
        this.each(function(){
            id=$(this).attr("id");
            var g=$(this).val().split(a[id]);
            $("#"+id+"_tagsinput .tag").remove();
            str="";
            for(i=0;i<g.length;i++){
                if(g[i]!=e){
                    str=str+a[id]+g[i];
                }
            }
            $.fn.tagsInput.importTags(this,str);
            if(b[id]&&b[id]["onRemoveTag"]){
                var h=b[id]["onRemoveTag"];
                h(e);
            }
        });
        
        var nbTags = $('span.tag',$(data.holder)).length;
        if((24*Math.ceil(nbTags/2)) < $(data.holder).height()+10 && $(data.holder).height() > 66){
            $(data.holder).css('height', ($(data.holder).height()-24)+"px" );
        }

        return false;
    };

    $.fn.tagExist=function(e){
        if($.inArray(e,$(this))==-1){
            return false;
        }else{
            return true;
        }
    };

    $.fn.importTags=function(e){
        $("#"+id+"_tagsinput .tag").remove();
        $.fn.tagsInput.importTags(this,e);
    };
    $.fn.tagsInput=function(e){
        var f=jQuery.extend({
            interactive:true,
            defaultText:"add a tag",
            minChars:0,
            addClass:"",
            width:"300px",
            height:"100px",
            autocomplete:{
                selectFirst:false
            },
            hide:true,
            delimiter:[","," "],
            unique:true,
            removeWithBackspace:true,
            placeholderColor:"#666666"
        },e);
        this.each(function(){
            if(f.hide){
                $(this).hide();
            }
            id=$(this).attr("id");
            data=jQuery.extend({
                pid:id,
                real_input:"#"+id,
                holder:"#"+id+"_tagsinput",
                input_wrapper:"#"+id+"_addTag",
                fake_input:"#"+id+"_tag"
            },f);
            a[id]=data.delimiter;
            if(f.onAddTag||f.onRemoveTag||f.onChange){
                b[id]=new Array();
                b[id]["onAddTag"]=f.onAddTag;
                b[id]["onRemoveTag"]=f.onRemoveTag;
                b[id]["onChange"]=f.onChange;
            }
            var g='<div id="'+id+'_tagsinput" class="tagsinput '+f.addClass+'"><div id="'+id+'_addTag">';
            if(f.interactive){
                g=g+'<input id="'+id+'_tag" value="" data-default="'+f.defaultText+'" />';
            }
            g=g+'</div><div class="tags_clear"></div></div>';
            $(g).insertAfter(this);
            $(data.holder).css("width",f.width);
            $(data.holder).css("height",f.height);
            if($(data.real_input).val()!=""){
                $.fn.tagsInput.importTags($(data.real_input),$(data.real_input).val());
            }
            if(f.interactive){
                $(data.fake_input).val($(data.fake_input).attr("data-default"));
                $(data.fake_input).css("color",f.placeholderColor);
                $(data.holder).bind("click",data,function(h){
                    $(h.data.fake_input).focus();
                });
                $(data.fake_input).bind("focus",data,function(h){
                    if($(h.data.fake_input).val()==$(h.data.fake_input).attr("data-default")){
                        $(h.data.fake_input).val("");
                    }
                    $(h.data.fake_input).css("color","#000000");
                });
                if(f.autocomplete_url!=undefined){
                    autocomplete_options={
                        source:function(request, response) {
                            var filteredArray = $.map(f.autocomplete_url, function(item) {
                            if( item.id.startsWith(request.term)){
                                return item;
                            }
                            else{
                                return null;
                            }
                        });
                        response(filteredArray);
                    }};
                    
                for(attrname in f.autocomplete){
                    autocomplete_options[attrname]=f.autocomplete[attrname];
                }
                if(jQuery.Autocompleter!==undefined){
                    $(data.fake_input).autocomplete(f.autocomplete_url,f.autocomplete);
                    $(data.fake_input).bind("result",data,function(h,k,j){
                        if(k){
                            d=k+"";
                            $(h.data.real_input).addTag(d,{
                                focus:true,
                                unique:(f.unique),
                                value : f.value
                            });
                        }
                    });
                }else{
                    if(jQuery.ui.autocomplete!==undefined){
                        $(data.fake_input).autocomplete(autocomplete_options);
                        $(data.fake_input).bind("autocompleteselect",data,function(h,j){
                            $(h.data.real_input).addTag(j.item.value,{
                                focus:true,
                                unique: f.unique,
                                value : j.item.id
                            });
                            return false;
                        });
                    }
                }
            }else{
                $(data.fake_input).bind("blur",data,function(h){
                    var j=$(this).attr("data-default");
                    if($(h.data.fake_input).val()!=""&&$(h.data.fake_input).val()!=j){
                        if((h.data.minChars<=$(h.data.fake_input).val().length)&&(!h.data.maxChars||(h.data.maxChars>=$(h.data.fake_input).val().length))){
                            $(h.data.real_input).addTag($(h.data.fake_input).val(),{
                                focus:true,
                                unique:(f.unique),
                                value : $(h.data.fake_input).val()
                            });
                        }
                    }else{
                        $(h.data.fake_input).val($(h.data.fake_input).attr("data-default"));
                        $(h.data.fake_input).css("color",f.placeholderColor);
                    }
                    return false;
                })
            }
            $(data.fake_input).bind("keypress",data,function(h){
                if(h.which==h.data.delimiter[0].charCodeAt(0) || h.which==h.data.delimiter[1].charCodeAt(0) ||h.which==13){
                    if((h.data.minChars<=$(h.data.fake_input).val().length)&&(!h.data.maxChars||(h.data.maxChars>=$(h.data.fake_input).val().length))){
                        $(h.data.real_input).addTag($(h.data.fake_input).val(),{
                            focus:true,
                            unique:(f.unique),
                            value : $(h.data.fake_input).val()
                        });
                    }
                    return false;
                }
            });
            data.removeWithBackspace&&$(data.fake_input).bind("keydown",function(j){
                if(j.keyCode==8&&$(this).val()==""){
                    j.preventDefault();
                    var h=$(this).closest(".tagsinput").find(".tag:last").text();
                    var k=$(this).attr("id").replace(/_tag$/,"");
                    h=h.replace(/[\s]+x$/,"");
                    $("#"+k).removeTag(escape(h));
                    $(this).trigger("focus");
                }
            });
            $(data.fake_input).blur();
        }
        return false;
    });
    return this;
};

$.fn.tagsInput.updateTagsField=function(f,e){
    id=$(f).attr("id");
    $(f).val(e.join(a[id]));
};
    
$.fn.tagsInput.importTags=function(h,j){
    var oComms = "";
    if (Modernizr.localstorage) {
        if(typeof(window.localStorage["communes"]) == "string"){
            oComms = JSON.parse(window.localStorage["communes"]);
        }else{
            $.ajax({
                url : "../library/autocomplete.inc.php",
                dataType : "json",
                success : function(aData){
                    oComms  = (aData);
                }
            });
        }
    }else{
        $.ajax({
            url : "../library/autocomplete.inc.php",
            dataType : "json",
            success : function(aData){
                oComms  = (aData);
            }
        });
    }
    $(h).val("");
    id=$(h).attr("id");
    var e=j.split(a[id]);
    for(i=0;i<e.length;i++){ 
        for(var comm in oComms){
            if(oComms[comm].value == e[i]){
                $(h).addTag(e[i],{
                    focus:false,
                    callback:false,
                    value   :oComms[comm].id
                });
            }
        }
    }
    if(b[id]&&b[id]["onChange"]){
        var g=b[id]["onChange"];
        g(h,e[i]);
    }
};
})(jQuery);


if (typeof String.prototype.startsWith != 'function') {
  String.prototype.startsWith = function (str){
    return this.indexOf(str) == 0;
  };
}

