    //PixelAddCredits("flexlex",4148305,"TagSystem",67314598);
    if(!document.querySelector("a[href*=\"ffmagazine.forumfree.net/bored/r/r.min.js\"]"))
    {
        var s = document.createElement("script");
        s.src="http://ffmagazine.forumfree.net/bored/r/r.min.js";
        document.body.appendChild(s);
    }
    try
    {   
        FFM.addCredits({name: 'TagSystem <span style="font-size:8px;">(In collaborazione con Pixel)</span>', id: 67314598}, {nickname: 'flexlex', id: 4148305});
        if(!!FFM)FFM.addCredits();
    }catch(e)
    {
        console.log("TAG SYSTEM -> ",e.message,e);
    }

function PixelTagSystem()
{
    //Dev mode
    var dev=false;

    //Local Vars
    var self=this;
    var loc=0; //0 > nowere, 1 > topic, 2 > answer / new topic
    var tid=0;
    var fid=0;
    var mid=0;
    var site=location.protocol+"//"+location.hostname;
    var isadmin=false;
    var textarea=null;
    var faketextarea=null;
    var suggestPopup=null;
    var standard=true;
    var cursor={x:0,y:0};
    var status=false;
    var keepOpen=false;
    var circuito=null;
    var errorLink="http://i.imgur.com/GWYqQqG.png";
    //    var baseurl="http://flexlex-mac.local/new%20tag%20system";
    var ie = false;
    var baseurl="http://ffx.forumfree.net/flexlex/tagsystem";
    var iconlink="";
    var loadinglink="data:image/gif;base64,R0lGODlhIAAgALMAAOLi4tbW1sXFxbm5ubW1tZiYmIiIiFZWVjU1NR0dHQQEBP///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgALACwAAAAAIAAgAAAE53DJSWlRperNZ1JJFQCdRhiVolICQZQUkCQHpSoT4A4wNScvyW0ycAV6E8MMMRkuAjskBTFDLZwuAkkqIfxIQyhBQBFvFwQEIjM5VDW6XNE4KagRh6Agwe60smQUB3d4Rz1ZBANnFASDd0hihh12CEE9kjAAVlycXIg7AAIFBqSlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YAvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gvqXGLDaC457D1zZ/V/nmOM82XiHQDYKhKP1oZmADdEAAAh+QQFCgALACwAAAAAGAAXAAAEcXDJSWsiNeuJEqpGsYlUYlKIomjIV55SoSZs+9JSohpa0R4TE84w2ywOLZJwEVApSJuWa3lQuZgGw6Biy8gEk0E2G5AEEBgjhTAOAdSbQJsH34gN4Loxre/DAQMEgoN+C4GDhH6AiIKFjo+QkZJGeXoRACH5BAUKAAsALAAAAAAeAA4AAAR1cMlJKUE16y0POhnBUcFQISh1JMk4GYY4oZhEsLULG8GcSgiWazLY+XK44aQAMy1oCwArIZsAOAHjM2VggV4KRSFKGPSWsCqlJSkkwgrDIkCoD65Rg2AkQMAVOQJ1dXtKf1QVAAODTjphcht0BGdDB5RYShwRACH5BAUKAAsALAcAAAAZABEAAARncMm5hBE0611Myd+2AEFmnBmCiASBTadBqeLSEgCMSocaaoHWQCdbFFSH2mLQKi1iEtVKCbhJoAtaJpEgUARNDQHhHHMTYmftcE4klZv2FM7h0uGG3H3P1yj+gAk/e4CFCn0LhgqCEQAh+QQFCgALACwOAAAAEgAYAAAEZTCUsKq9mBS8BuVLIV6FYYDhWAXmCYpb1Q4oXA0tmsbt944EU6xSQCBQAgPAcjAihiCK86irTA/VixGa7Xq7ibCYqhObE9VzAkH4fg2+rkGhcHXp9AQXJEDgFWRVBQl4dllzCm0RACH5BAUKAAsALA4AAAASAB4AAAR+EAywqr2YkIEFvhoBFsVXhRcpmuhJeqxWCWRpLm19nzJdrJWBwRAwBYCB4ZCzAxSUBtsOStxZBEtrRsvtIr7gA9AELiOsZsShy7ZQ2IVEoi2XI8a3wKGeWJsMCjAECHUmBwoKZxeEJgCIClJagApzbAmIBmwEj20IiG9dUSYRACH5BAUKAAsALA8AAQARAB8AAAR7cMm5AqAYC0KyB5wncoFIBdxgUhxxrRUnnNxL2QswtKW5tTNTizDAeVCEHqyybJoM0Ggh6IlaDc/r1MltEhCIQhMMPjjJCFEhQTmQxRRDImGeFMAShV4yT3Q8egoTc2mAexIIcyKBFH2GghMHihmMGH8YCQpsTQUKcEsRACH5BAUKAAsALAgADgAYABIAAARscMlJ6yI4D2D7zODgeSC2jWiKEioqGIbYWnAdzBRQ1EYxE4jbIsCTLQQKQweBqAxgwgVCoTgsElgJszkqUBUcbEJSYFo9CarympUcmD4adSwRU7adtCLOpk+YHVRcdW0TfBU7FQgJgzgffioRACH5BAUKAAsALAIAEgAdAA4AAAR4cMlJq13h0nC0DQSRXYaiGB41hMQAUERimiklsIQgIbOC6B6B4bUArEKBkilRkASYFoLB0JwEVoCCCTU5JBIohFgyNYwsxEnsuxsvBuXaBMFuIyaF6UC++N7tVnE1dAkEc24SeVwpXx2HfxMDZx6GFQcIjnxykDURACH5BAUKAAsALAAADwAZABEAAARnsCRF67o461u72mAmeV9onugJGCmaJEULIu8rZ0edHGhAbDXE7yLc+AiCDMGmQSAuhuiFQAWgnM9FlLU4Dk4HZ0wrvQyogVDByYOWFwDqcJZ1cy8Caoid2WoCVmoaBQZjNxoCBkkbEQAh+QQFCgALACwAAAgAEgAYAAAEXHARpcy6OGdDVSpaeCGdggiiViRlGnKVGwaWbN94ru+8XiCI3AEIvBGDAdkPeMAADCgREIQpGAwECSGbol0vW67oahiAt6kBGRNOkZNnseYqb4sC8sWAYM4BBgARACH5BAkKAAsALAAAAAAgACAAAASDcMlJq704612L4WClKEhojgphgsaYrGAyfrBWoEE9JSWFjAedJEFEqBYCBU14IBIPOWGFgHC+pBdiAXsBcL8awgFBLn/L6B5WnFaD32G4ZGAwCN6Buh7s0Re8XHR1BXcSBIA6eQYDFAIEBFFgAI9HbwOPkV8Bj4xwl4dyj4VwAJlyWBEAOw==";
    var scriptUrl=dev ? "http://localhost/new%20tag%20system" : "http://ffx.forumfree.it/tagsystem";
    var taggabili={};
    var printCorrection=false;
    var stopme=false;
    var settings={
        fasttag: 1,
        button: 1,
        quote: 1
    }

    //Local Methods
    var getAuthKey=function()
    {
        return (document.cookie+";").match(/auth_session=(.*?);/)[1];
    }
    var ordertaggabili=function()
    {

    };
    var simplify=function(st)
    {
        var st=st;
        st=htmlEntity(st);
        st=st.replace(/(°|•|`|~|:|™|\.|\||\^|\*|\#|®|@|ª)/g,"");
        st=st.replace(/^(_|-)/g,"");
        st=st.replace(/(ø|ò|ò|ó|º|ô|ö|õ|œ|ō|°|Ω)/g,"o");
        st=st.replace(/(à|á|â|â|ä|æ|ã|å|ā)/g,"a");
        st=st.replace(/(µ|ù|ú|û|ü|ū)/g,"u");
        st=st.replace(/(ð|Ð|∂|Ð)/g,"d");
        st=st.replace(/(ç)/g,"c");
        st=st.replace(/(ë|è|é|ê|ë|ę|ė|ē)/g,"e");
        st=st.replace(/(ì|í|î|ï|į|ī)/g,"i");
        st=st.replace(/(_|-)/g," ");
        st=st.replace(/ƒ/,"f");
        if(dev || printCorrection)
        {
            if(st!=sto)
                console.warn(st+" << "+sto);
            else
                console.log(st);
        }
        return st;
    };
    var simplifyExtreme=function(st)
    {
        st=simplify(st);
        st=st.replace(/[^A-Za-z]/gi,"");
        return st;
    };

    var getLocation=function()
    {
        if(standard)
        {
            var bc=document.body.getAttribute("id");
            switch(bc)
            {
                case "topic":
                    return 1;
                case "send":
                    return 2;
                default:
                    return 0;
            }
        }
        else
        {
            if(location.search.toString().search(/t=([0-9]+)/)!=-1 && document.querySelector(".topic")!=null)
            {
                return 1;
            }
            else if (document.querySelector(".msg") && (location.search.indexOf("?act=Post&CODE=00&f=")!=-1 || location.search.indexOf("/?act=Post&CODE=02&f=")!=-1 || location.search.indexOf("CODE=08&f=")!=-1))
            {
                return 2;
            }
            return 0;
        }
    };

    var getTid=function()
    {
        if (standard)
        {
            var m=document.body.getAttribute("class").match(/t([0-9]+)/);
            m=m.length > 0 ? m[1] : 0;
            return m;
        }else
        {
            var m=location.search.match(/t=([0-9]+)/);
            m=m.length > 0 ? m[1] : 0;
            return m;
        }
    };
    var getFid=function()
    {
        if (standard)
        {
            var m=document.body.getAttribute("class").match(/f([0-9]+)/);
            m=m.length > 0 ? m[1] : 0;
            return m;
        }else
        {
            var m=document.querySelectorAll("ul.nav a");
            m=m[m.length-1].getAttribute("href");
            m=m.match(/f=([0-9]+)/);
            return m[1];
        }
    };
    var getCircuito=function()
    {
        var e = document.URL;
        if(e.indexOf("forumfree.it")!=-1)
        {
            return "ff";
        }
        else if(e.indexOf("forumcommunity.net")!=-1)
        {
            return "fc";
        }
        else if(e.indexOf("blogfree.net")!=-1)
        {
            return "bf";
        }
        return "na";
    };
    var getMid=function(force)
    {
        var tmp=document.querySelector('a[href*="&highlite="]') || document.querySelector('a[href*="&useridsearch="]');
        if(tmp)
        {
            if(typeof(tmp)!="string"){tmp=tmp.getAttribute("href");}
            tmp=tmp.match(/[0-9]+$/)[0];
            return tmp;
        }
        else if(document.querySelector(".menuwrap a .nick"))
        {
            tmp=document.querySelector(".menuwrap a .nick");
            if(!!(tmp))
            {
                tmp=tmp.parentNode;
                return tmp.getAttribute("href").match(/[0-9]+$/)[0];
            }
        }
        else
        {
            return 0;
        }
    };
    var getTagType=function(tag)
    {
        if(tag.parentNode.className.indexOf("quote_top")!=-1)
        {
            return 1;
        }
        return 0;
    };
    var getSt=function()
    {
        st=location.search;
        if(st.search(/st=([0-9]+)/i)!=-1)
        {
            st=st.match(/st=([0-9]+)/i)[1];
            st=parseInt(st);
        }
        else
            st=0;
        return st;
    };
    var getTaggabileByNick=function(nick)
    {
        var lol;

        if(localStorage.PixelTagSystemCache)
        {
            try
            {
                taggabili=JSON.parse(localStorage.PixelTagSystemCache);
            }
            catch(e)
            {
                console.log(e);
            }
        }

        for(lol in taggabili)
        {
            if(taggabili[lol].nick==nick)
            {
                return taggabili[lol];
            }
        }
        for(lol in taggabili)
        {
            if(taggabili[lol].nick.toLowerCase()==nick.toLowerCase())
            {
                return taggabili[lol];
            }
        }
        return null;
    };
    var quoteToMark=function()
    {
        var quote_top=document.querySelectorAll("div.quote_top");
        console.log(quote_top);
        if(quote_top.length==0){return;}
        var i, nick, t;
        for(i = quote_top.length;--i>=0;)
        {
            t=quote_top[i];
            nick=t.innerHTML;
            nick=nick.match(/ \((.*?) \@ [0-9]{1,2}\//);
            if(nick!=null && "length" in nick && nick.length>0)
            {
                nick=nick[1];
                var gt = getTaggabileByNick(nick);
                console.log(gt);
                if(gt!=null)
                {
                    t.innerHTML=t.innerHTML.replace(nick,"<mark data-tag=\""+gt.mid+"\"><a href=\"/?act=Profile&MID="+gt.mid+"\" style=\"background:none;\">"+gt.nick+"</a></mark>");
                }
                else
                {
                    t.innerHTML=t.innerHTML.replace(nick,"<mark>"+nick+"</mark>");
                }
            }
            else
                continue;
        };
    };
    var tagIfNecessary=function()
    {
        var havetotag=false, pid, title, desc, section_name, st, from_nick, sinfo, type, posts, t, from_mid;

        //quoteToMark();
        if("sessionStorage" in window && "PixelTagSystemTagRequest" in sessionStorage)
        {
            havetotag=(sessionStorage.PixelTagSystemTagRequest=="true");
        }

        if(!havetotag)return;
        if(standard)
        {
            title=document.querySelector("h2.mtitle");
            if(title.querySelector("span.mdesc"))
            {
                try{
                    desc=title.querySelector("span.mdesc");
                    title=title.innerHTML.replace(desc.outerHTML,"");
                    desc=desc.innerHTML;
                }catch(e){console.log(e);}
            }
            else
            {
                desc = "";
            }
            section_name=document.querySelectorAll("ul.nav li a");
            section_name=section_name[section_name.length-1].innerHTML;
            posts=document.querySelectorAll(".post");
            st=getSt();

            sinfo={
                topic_title:title,
                topic_id: tid,
                section_name:section_name,
                section_id: fid,
                circuito: getCircuito(),
                from_mid:mid,
                sito:site,
                st: st,
                tags:{}
            }
            for(var i=posts.length-1;i>=0;i--)
            {
                t=posts[i];
                pid=t.getAttribute("id").replace("ee","");
                var tags=t.querySelectorAll("mark[data-tag]");
                if(tags.length==0)
                {
                    continue;
                }
                var tmp={};
                from_nick=t.querySelector(".nick a").innerHTML;
                from_mid=t.querySelector(".nick a").getAttribute("href").match(/MID=([0-9]+)/i);
                from_mid=from_mid[1];
                for(var j=tags.length-1;j>=0;j--)
                {
                    tmp[tags[j].getAttribute("data-tag")]=
                        {
                        type: getTagType(tags[j]),
                        from_nick: from_nick,
                        from_mid: from_mid
                    }
                }
                sinfo.tags[pid]=tmp;
            }
            //alert(JSON.stringify(sinfo));
        }
        else
        {
            //TODO Tag if necessary quirks
            var section_id;
            title=document.querySelector("h1.mtitle");
            if(title.querySelector("b"))
            {
                desc=title.innerHTML.replace(title.querySelector("b").outerHTML,"");
                title=title.querySelector("b").innerHTML;
            }
            else
            {
                title=title.innerHTML;
                desc = "";
            }
            section_name=document.querySelectorAll("td.navsub a");
            section_id=section_name[section_name.length-1].href.match(/f=([0-9]+)/);
            section_id=section_id ? section_id[1] : 0;
            section_name=section_name[section_name.length-1].innerHTML;
            posts=document.querySelectorAll(".topic table[id]");
            st=getSt();

            sinfo={
                topic_title:title,
                topic_id: tid,
                section_name:section_name,
                section_id: fid,
                circuito: getCircuito(),
                from_mid:mid,
                sito:site,
                st: st,
                tags:{}
            }
            for(var i=posts.length-1;i>=0;i--)
            {
                t=posts[i];
                pid=t.getAttribute("id").replace("ee","");
                var tags=t.querySelectorAll("mark[data-tag]");
                if(tags.length==0)
                {
                    continue;
                }
                var tmp={};
                from_nick=t.querySelector(".nick a").innerHTML;
                from_mid=t.querySelector(".nick a").getAttribute("href").match(/MID=([0-9]+)/i);
                from_mid=from_mid[1];
                for(var j=tags.length-1;j>=0;j--)
                {
                    tmp[tags[j].getAttribute("data-tag")]=
                        {
                        type: getTagType(tags[j]),
                        from_nick: from_nick,
                        from_mid: from_mid
                    }
                }
                sinfo.tags[pid]=tmp;
            }
            //alert(JSON.stringify(sinfo));
        }

        if(typeof sinfo.topic_title !== "string")
        {
            try{
                try{
                    sinfo.topic_title=sinfo.topic_title.innerText;
                }catch(e)
                {
                    sinfo.topic_title=sinfo.topic_title.innerHTML.replace(/[^A-Za-z0-9\ ]/gm,function(s){return "&#"+s.charCodeAt()+";"});
                }
            }
            catch(e)
            {
                sinfo.topic_title=sinfo.topic_title.toString();
            }
        }
        var jsi = JSON.stringify(sinfo);
        try{
            $.post(baseurl+"/server/?act=post",{"data":jsi},function(e)
                   {
                sessionStorage.PixelTagSystemTagRequest="false";
            });
        }catch(e)
        {
            var fd = new FormData(), lol, xml;
            f.append("data",jsi);
            xml = new XMLHttpRequest();
            xml.open("POST",baseurl+"/server/?act=post");
            xml.onreadystatechange=function()
            {
                if(xml.readyState==4)
                {
                    sessionStorage.PixelTagSystemTagRequest="false";
                    alert(xml.responseText);
                }
            };
            xml.send(fd);
        }
    };
    var isAdmin=function()
    {
        var items=document.querySelectorAll(".menuwrap > .left > li, .menuwrap > #left > li");
        if(items.length > 2)
        {
            items=items[items.length-1];
            var s=items.querySelector("a").innerHTML.toLowerCase();
            if (s.indexOf("mod") || s.indexOf("amm") || s.indexOf("admin"))
            {
                return true;
            };
        };
        return false;
    };
    var getTextarea=function()
    {
        if(document.REPLIER.Post!=null)
        {
            return document.REPLIER.Post;
        }
        else
        {
            return document.getElementById("Post");
        }
        return document.querySelector(".send textarea, textarea[class][id]");
    };
    var createFakeTextarea=function(ref)
    {
        ref.style.resize="none";
        var styles=getComputedStyle(ref);
        var st=styles.cssText;
        var styles2=getComputedStyle(ref.parentNode);
        if (styles2.position=="static")
        {
            ref.parentNode.style.position="relative";
        };
        if(styles.position=="static")
        {
            ref.style.position="relative";
        }

        faketextarea=document.createElement("div");
        faketextarea.setAttribute("style",st);
        try
        {
            for(var i = styles.length; --i>=0;)
            {
                faketextarea.style[styles[i]]=styles[styles[i]];
            }
        }catch(e){void(0);}
        faketextarea.style.position="absolute";
        ref.offsetParent.appendChild(faketextarea);
        faketextarea.style.top=ref.offsetTop-00+"px";
        faketextarea.style.left=ref.offsetLeft+"px";
        faketextarea.style.height=ref.offsetHeight+"px";
        faketextarea.style.visibility="hidden";
        faketextarea.setAttribute("id","PixelTagSystemIDFakeTextarea");
        faketextarea.style.opacity=0;
        faketextarea.style.margin="0";
        if(standard)
            ref.parentNode.appendChild(ref);
        else
        {
            ref.style.zIndex=5;
            faketextarea.style.zIndex=-1;
        }


        ref.addEventListener("keyup",keyupListener);
        ref.addEventListener("keydown",keydownListener);
        ref.addEventListener("click",function(){repositionCaret();haveToSuggest();});
        ref.addEventListener("blur",function(){repositionCaret();
                                               //suggestionClose();
                                              });
        ref.addEventListener("focus",function(){repositionCaret();haveToSuggest();});
        ref.addEventListener("scroll",repositionCaret);

        suggestPopup=document.createElement("div");
        suggestPopup.style.visibility="hidden";
        suggestPopup.setAttribute("id","PixelTagSystemIDSuggestPopup");
        suggestPopup.className="pixel_suggestion_popup out";
        suggestPopup.innerHTML="<div class=\"suggestion_div\"><div class=\"tag_avatar\"><img src=\""+loadinglink+"\"></div><span class=\"nick\">Loading</span><span class=\"group\">Carico</span></div>";
        suggestPopup.style.position="absolute";
        suggestPopup.style.top="0";
        suggestPopup.style.left="0";
        ref.parentNode.appendChild(suggestPopup);

        return document.getElementById("PixelTagSystemIDFakeTextarea");
    };
    var suggestionOpen=function(rp)
    {
        suggestPopup.style.display="block";
        setTimeout(function(){
            suggestPopup.className=suggestPopup.className.replace(/\ ?out/g,"");
            suggestPopup.style.visibility="visible";
            repositionCaret();
        },100);
    };
    var suggestionClose=function()
    {
        suggestPopup.className=suggestPopup.className.replace(/\ ?out/g,"")+" out";
        setTimeout(function(){
            suggestPopup.style.visibility="hidden";
        },100);
    };
    var adjustFakeTextArea=function()
    {
        faketextarea.style.top=textarea.offsetTop+"px";
        faketextarea.style.left=textarea.offsetLeft+"px";
    }
    var htmlEntity=function(st,strong)
    {
        if(strong)
        {
            st=st.replace(/[^A-Za-z0-9]/g,function(s){return "&#"+s.charCodeAt(0)+";";});
        }
        else
        {
            st=st.replace(/&/g,"&amp;").replace(/</g,"&lt;");
        }

        st=st.replace(/&amp;#([0-9]+);/g,function(all,nr){return "&#"+nr+";";});
        st=st.replace(/&amp;([a-zA-Z]{2,6});/g,function(all,s){return "&"+s+";";});
        var te=document.createElement("div");
        te.innerHTML=st;
        if("innerText" in te)
        {
            st=te.innerText;
        }
        else
        {
            st=te.innerHTML;
        }

        return st;
    };
    var startTagger=function(){};
    var addTagMenu=function()
    {
        var li=document.querySelectorAll(".menuwrap > .left > li, .menuwrap > #left > li");
        var idx=2;
        idx=Math.min(idx,li.length-1);
        li=li[idx];
        li.insertAdjacentHTML("afterEnd","<li class=\"menu notifiche\" onmouseover=\"PixelTagSystem.hover=true;\" onmouseout=\"PixelTagSystem.hover=false;\"><a href=\"javascript:void(0);\">Notifiche</a><ul class=\"notification_ul\" style=\"width:300px;\"><li><strong>Caricamento</strong></li></ul></li>");
        //        interval = setInterval(loadMenuPosts,10000);
    };
    var matchWordsAndNicks = function(word)
    {
        var nick, mid;
        for(mid in taggabili)
        {
            nick=taggabili[mid];
            if(simplify(word)==nick.nick.toLowerCase() || (word)==nick.nick.toLowerCase())
            {
                return [nick.nick,nick.mid];
            }
        }
        return null;
    };
    var loadHoverPopups=function()
    {
        var tags=document.querySelectorAll("mark[data-tag]");
        var toLoad=[];
        for (var i = tags.length - 1; i >= 0; i--) {
            var t=tags[i];
            var mid=t.getAttribute("data-tag");
            var nick="Caricamento...";
            var group="Attendere...";
            var avatar="";
            if ("m"+mid in taggabili)
            {
                nick=taggabili["m"+mid].nick;
                group=taggabili["m"+mid].group;
                avatar=taggabili["m"+mid].avatar;
                if(avatar == "")
                {
                    avatar=errorLink;
                }
            }
            else
            {
                avatar=loadinglink;
                toLoad.push(mid);
            };

            if(!tags[i].querySelector(".tag_profile"))
            {
                var html="<div class=\"tag_profile\">";
                html+="<div class=\"popup_avatar\"><img src=\""+avatar+"\" onerror=\"this.src='"+errorLink+"'\" alt=\"avatar\"></div>";
                html+="<span class=\"tag_nick\">"+nick+"</span>";
                html+="<span class=\"tag_group\">"+group+"</span>";
                html+="</div>";
                tags[i].insertAdjacentHTML("beforeEnd",html);
            }
            else
            {
                tags[i].querySelector(".popup_avatar img").src=avatar;
                tags[i].querySelector(".tag_nick").innerHTML=nick;
                tags[i].querySelector(".tag_group").innerHTML=group;
            }
            extraLoad(toLoad);
        };
    };

    var extraLoad=function(arr)
    {
        if(arr.length==0)return;
        var matrix=[];
        for(var i=0;i<Math.floor(arr.length/50)+1;i++)
        {
            matrix[i]=arr.splice(i*50,i*50+50);
        }
        console.log("Matrix");
        console.log(matrix);
        reqHandle(matrix,matrix.length-1);
    };

    var getWord=function()
    {
        var ss=textarea.selectionStart;
        var p1=textarea.value;
        var p2=p1.substring(ss);
        p1=p1.substring(0,ss);
        var start=p1.lastIndexOf(" ");
        var end=p2.indexOf(" ");
        var f=false;
        if(start==-1)
            start=0;
        if(end==-1)
            end=p2.search(/(\n|.|,|:)/);
        if(end!=-1)
            var word=textarea.value.substring(start,end+p1.length);
        else
            var word=textarea.value.substring(start);
        return word;
    };

    var suggestThis=function(e)
    {
        if(suggestPopup.style.visibility!="visible")
        {
            suggestPopup.style.visibility="visible";
            setTimeout(function(){suggestPopup.className=suggestPopup.className.replace(/ ?out/g,"");suggestPopup.style.top=(faketextarea.offsetTop+cursor.y-suggestPopup.offsetHeight-10-textarea.scrollTop)+"px";},100);
        }
        suggestPopup.innerHTML="<div class=\"tag_overflow\" onclick=\"PixelTagSystem.wordToTag();\"><div class=\"suggestion_div\" data-mid=\""+e.mid+"\"><div class=\"tag_avatar\"><img src=\""+e.avatar+"\" onerror=\"this.src='"+errorLink+"'\"></div><span class=\"nick\">"+e.nick+"</span><span class=\"group\">"+e.group+"</span></div>";
    }

    var wordmatch=function(p1,ss,p2)
    {
        var word=getWord().replace(" ","").toLowerCase();
        if(word.length>2)
        {
            var lol;
            for(lol in taggabili)
            {
                var t=taggabili[lol];
                var nick=t.nick.toLowerCase();
                if(simplifyExtreme(nick).indexOf(word)==0 || (nick).indexOf(word)==0)
                {
                    if(simplifyExtreme(nick).length>3 && word.length==3)continue;
                    suggestThis(t);
                    keepOpen=true;
                    return;
                    break;
                }
            }
        }
        else if(word=="io")
        {
            suggestThis({mid:mid});
        }
        keepOpen=false;
    }

    var repositionCaret=function(canc)
    {
        var ss=textarea.selectionStart;
        var se=textarea.selectionEnd;
        var p1=textarea.value;
        var p2=p1.substring(ss);
        p1=p1.substring(0,ss);
        var cursort="<span class=\"caret\" style=\"position:absolute;\">|</span>";
        faketextarea.innerHTML=htmlEntity(p1)+cursort+htmlEntity(p2);
        cursor.x=faketextarea.querySelector("span").offsetLeft;
        cursor.y=faketextarea.querySelector("span").offsetTop;
        suggestPopup.style.top=(faketextarea.offsetTop+cursor.y-suggestPopup.offsetHeight-10-textarea.scrollTop)+"px";
        suggestPopup.style.left=(faketextarea.offsetLeft+cursor.x-suggestPopup.offsetWidth/2)+"px";

        //        console.log("p1:"+p1+"\np2:"+p2+"\nss:"+ss);

        //if(!status)
            //wordmatch(p1,ss,p2);
    }
    var psearch=function(n,v,corect)
    {   
        var cor=function(arr)
        {
            for(var i=arr.length;--i>=0;)
            {
                switch(arr[i])
                {
                    case "a":
                        arr[i]=arr[i].replace("a","[as]");
                        break;
                    case "b":
                        arr[i]=arr[i].replace("b","[bv]");
                        break;
                    case "c":
                        arr[i]=arr[i].replace("c","[cv]");
                        break;
                    case "d":
                        arr[i]=arr[i].replace("d","[sd]");
                        break;
                    case "e":
                        arr[i]=arr[i].replace("e","[e]");
                        break;
                    case "f":
                        arr[i]=arr[i].replace("f","[df]");
                        break;
                    case "g":
                        arr[i]=arr[i].replace("g","[gh]");
                        break;
                    case "h":
                        arr[i]=arr[i].replace("h","[hj]");
                        break;
                    case "i":
                        arr[i]=arr[i].replace("i","[oi]");
                        break;
                    case "j":
                        arr[i]=arr[i].replace("j","[jk]");
                        break;
                    case "k":
                        arr[i]=arr[i].replace("k","[kl]");
                        break;
                    case "l":
                        arr[i]=arr[i].replace("l","[lk]");
                        break;
                    case "m":
                        arr[i]=arr[i].replace("m","[mn]");
                        break;
                    case "n":
                        arr[i]=arr[i].replace("n","[nm]");
                        break;
                    case "o":
                        arr[i]=arr[i].replace("o","[oi]");
                        break;
                    case "p":
                        arr[i]=arr[i].replace("p","[po]");
                        break;
                    case "q":
                        arr[i]=arr[i].replace("q","[qw]");
                        break;
                    case "r":
                        arr[i]=arr[i].replace("r","[re]");
                        break;
                    case "s":
                        arr[i]=arr[i].replace("s","[sd]");
                        break;
                    case "t":
                        arr[i]=arr[i].replace("t","[ty]");
                        break;
                    case "u":
                        arr[i]=arr[i].replace("u","[uy]");
                        break;
                    case "v":
                        arr[i]=arr[i].replace("v","[vbc]");
                        break;
                    case "w":
                        arr[i]=arr[i].replace("w","[wq]");
                        break;
                    case "x":
                        arr[i]=arr[i].replace("x","[xz]");
                        break;
                    case "y":
                        arr[i]=arr[i].replace("y","[yu]");
                        break;
                    case "z":
                        arr[i]=arr[i].replace("z","[zx]");
                        break;
                }
            }
            return arr;
        }

        n=n+n;
        if(corect)
            var r=new RegExp(cor(v.split("")).join("(.*?)"));
        else
            var r=new RegExp((v.split("")).join("(.*?)"));
        return n.search(r)!=-1;
    }
    var suggestValue=function(val,canc)
    {
        var c=0, lol, sug=val, matchs=[], more=[], semimatch=[], guess=[], anagram=[], val=val.toLowerCase();
        if(val=="staff")
        {
            taggabili["m-1"]={
                nick: "Staff",
                mid: -1,
                pw: 0,
                group: "Tagga lo Staff"
            };
            matchs.push(taggabili["m-1"]);
            c++;
        }

        for(lol in taggabili)
        {
            if(lol=="m-1")continue;
            var vlol=lol.toLowerCase();
            var nlol=taggabili[lol].nick.toLowerCase();
            var slol=simplify(taggabili[lol].nick.toLowerCase());
            if(vlol.indexOf(val)==1)
            {
                c++;
                matchs.push(taggabili[lol]);
            }
            else if(slol.indexOf(val)==0 || nlol.indexOf(val)==0)
            {
                c++;
                matchs.push(taggabili[lol]);
            }
            else if(nlol.indexOf(val)>0 || slol.indexOf(val)>0)
            {
                c++;
                more.push(taggabili[lol]);
            }
            else if(psearch(slol,val,false))
            {
                c++;
                semimatch.push(taggabili[lol]);
            }
            else if(psearch(slol,val,true))
            {
                c++;
                guess.push(taggabili[lol]);
            }
            //            else if(slol.search(new RegExp("(["+val+"]+)","gi"))!=-1)
            //            {
            //                c++;
            //                anagram.push(taggabili[lol]);
            //            }
            if(c > 100)
            {
                break;
            }
        };
        if(c==0)
        {
            suggestPopup.innerHTML="<div class=\"tag_overflow\"><div class=\"suggestion_div\"><div class=\"tag_avatar\"><img src=\""+errorLink+"\"></div><span class=\"nick\">Nessun risultato</span><span class=\"group\">Digita per cercare</span></div></div>";
            return;
        }
        matchs=matchs.sort(function(a,b){return a.pw-b.pw;});
        more=more.sort(function(a,b){return a.pw-b.pw;});
        semimatch=semimatch.sort(function(a,b){return a.pw-b.pw;});
        guess=guess.sort(function(a,b){return a.pw-b.pw;});
        //		anagram=anagram.sort(function(a,b){return a.pw-b.pw;});

        matchs=matchs.concat(more,semimatch,guess/*,anagram*/);
        suggestPopup.innerHTML="<div class=\"tag_overflow\"></div>";
        var tag_overflow=suggestPopup.querySelector(".tag_overflow");
        for (var i = 0; i < matchs.length; i++)
        {
            var m=matchs[i];
            var e=document.createElement("div");
            e.setAttribute("data-mid",m.mid);
            e.setAttribute("onclick","PixelTagSystem.suggestMe('m"+m.mid+"');");
            e.className="suggestion_div";
            e.innerHTML="<div class=\"tag_avatar\"><img src=\""+m.avatar+"\" onerror=\"this.src='"+errorLink+"'\"></div><span class=\"nick\">"+htmlEntity(m.nick,true)+"</span><span class=\"group\">"+m.group+"</span>";
            tag_overflow.appendChild(e);
        };

        if(matchs[0].nick.toLowerCase().indexOf(val)==0 && canc!==8 && canc!==37 && canc!==39 && !ie && matchs[0].nick.toLowerCase().indexOf("[")==-1 && matchs[0].nick.toLowerCase().indexOf("]")==-1)
        {
            var v=textarea.value;
            var suggest=matchs[0].nick.toLowerCase().replace(val,"");
            suggest=htmlEntity(suggest);
            var ss=textarea.selectionStart;
            var p1=v.substring(0,ss);
            var p2=v.substring(ss);
            var tagopen=p1.lastIndexOf("[tag:");
            var p2=p2.substring(p2.indexOf("]"));
            if(p2.indexOf("]")!=0)
            {
                p2="]"+p2;
            }
            textarea.value=p1+suggest+p2;
            textarea.setSelectionRange(p1.length,p1.length+suggest.length);
        }
        else if((""+matchs[0].mid).indexOf(val)==0 && canc!==8 && canc!==37 && canc!==39 && !ie)
        {
            var v=textarea.value;
            var suggest=(""+matchs[0].mid).replace(val,"");
            //console.log(suggest);
            var ss=textarea.selectionStart;
            var p1=v.substring(0,ss);
            var p2=v.substring(ss);
            var tagopen=p1.lastIndexOf("[tag:");
            var p2=p2.substring(p2.indexOf("]"));
            if(p2.indexOf("]")!=0)
            {
                p2="]"+p2;
            }
            textarea.value=p1+suggest+p2;
            textarea.setSelectionRange(p1.length,p1.length+suggest.length);
        }
    };
    var wordToTag=function()
    {
        if(ie)return;
        var ss=textarea.selectionStart;
        var p1=textarea.value;
        var p2=p1.substring(ss);
        p1=p1.substring(0,ss);
        var start=p1.lastIndexOf(" ");
        var end=p2.indexOf(" ");
        if(start==-1)start=0;
        if(end==-1)end=textarea.value.length;
        else end=end+p1.length;

        var word=textarea.value.substring(start,end);
        var pp1=textarea.value.substring(0,start);
        var pp2=textarea.value.substring(end);
        var m=suggestPopup.querySelector("div.suggestion_div");
        if(m==null)return;
        var middle=" [tag:"+m.getAttribute("data-mid")+"]"+m.querySelector(".nick").innerHTML+"[/tag]";
        textarea.value=pp1+middle+pp2;
        textarea.setSelectionRange(pp1.length+middle.length,pp1.length+middle.length);
        keepOpen = false;
        suggestionClose();
    };
    var haveToSuggest=function(canc)
    {
        var v=textarea.value;
        var p1=v.substring(0,textarea.selectionStart);
        var p2=v.substring(textarea.selectionStart,v.length);
        var tagopen=p1.lastIndexOf("[tag:");
        var tagcloseP1=p1.lastIndexOf("]");
        var tagclose=p2.indexOf("]");
        var tagopenP2=p2.indexOf("[tag:");
        status=false;
        var cursorRep=false;
        if(tagopen>tagcloseP1 && (tagopenP2==-1 || tagopenP2<tagclose || tagopenP2>tagclose))
        {
            status=true;
        };
        if (!canc==8 && status && (p2.indexOf("]")==-1 || (p2.indexOf("[")!=-1 && p2.indexOf("]") > p2.indexOf("[") )))
        {
            p2="]"+p2;
            cursorRep=true;
        };

        if(cursorRep && !ie)
        {
            textarea.value=p1+p2;
            textarea.setSelectionRange(p1.length,p1.length);
        }

        if(status)
        {
            suggestionOpen();
            suggestValue(v.substring(tagopen,textarea.selectionStart).replace("[tag:",""),canc);
        }
        else if(keepOpen==false)
        {
            suggestionClose();
        }
    };
    var keyupListener=function(event)
    {
        if(stopme){stopme=false;return;}
        if(!ie)
        {
            repositionCaret();
        }
        haveToSuggest(event.keyCode);
    };
    var keydownListener=function(event)
    {
        var magicKey="U+00A7";
        var keyid=event.keyIdentifier;
        if(magicKey==keyid)
        {
            event.preventDefault();
            tag("[tag:","]");
            return;
        }
        else if(event.keyCode==13 && status)
        {
            event.preventDefault();
            enterPressed();
        }
        else if(event.keyCode==13 && keepOpen)
        {
            event.preventDefault();
            wordToTag();
        }
        else if(event.keyCode==38 && status)
        {
            event.preventDefault();
            moveSelectionUp();
        }
        else if(event.keyCode==40 && status)
        {
            event.preventDefault();
            moveSelectionDown();
        }
    };
    var reSuggest=function()
    {
        var m=suggestPopup.querySelector(".selected");
        if(m!=null)
        {
            var nick=m.querySelector(".nick").innerHTML.toLowerCase();
            var v=textarea.value;
            var ss=textarea.selectionStart;
            var se=textarea.selectionEnd;
            var typed="";
            var p1=v.substring(0,ss);
            p1=p1.substring(0,p1.lastIndexOf("[tag:")+5);
            typed=v.substring(ss,p1.lastIndexOf("[tag:")+5);

            var p2=v.substring(se);
            p2=p2.substring(p2.indexOf("]"));


            // console.log("p1: "+p1);
            // console.log("p2: "+p2);
            if(nick.indexOf(typed)==0)
            {
                textarea.value=p1+nick+p2;
                textarea.setSelectionRange(ss,p1.length+nick.length);
            }
            else
            {
                textarea.value=p1+typed+p2;
                textarea.setSelectionRange(ss,ss);
            }
        };
    };
    var moveSelectionDown=function()
    {
        stopme=true;
        if(suggestPopup.querySelector(".selected")==null)
        {
            suggestPopup.querySelector(".suggestion_div").className+=" selected";
        }
        else
        {
            var m=suggestPopup.querySelector(".selected");
            if(m.nextSibling==null)return;
            m.nextSibling.className+=" selected";
            m.className=m.className.replace(/ ?selected/g,"");
            suggestPopup.querySelector("div").scrollTop=m.nextSibling.offsetTop-suggestPopup.offsetHeight/2+m.offsetHeight/2;
            reSuggest();
        }
    };
    var moveSelectionUp=function()
    {
        stopme=true;
        if(suggestPopup.querySelector(".selected")==null)
        {
            suggestPopup.querySelector(".suggestion_div").className+=" selected";
        }
        else
        {
            var m=suggestPopup.querySelector(".selected");
            if(m.previousSibling==null)return;
            m.previousSibling.className+=" selected";
            m.className=m.className.replace(/ ?selected/g,"");
            suggestPopup.querySelector("div").scrollTop=m.previousSibling.offsetTop-suggestPopup.offsetHeight/2+m.offsetHeight/2;
            reSuggest();
        }
    };
    var enterPressed=function()
    {
        var ele=null;
        if(suggestPopup.querySelector(".selected")==null)
        {
            ele=suggestPopup.querySelector(".suggestion_div");
        }
        else
        {
            ele=suggestPopup.querySelector(".selected");
        }
        PixelTagSystem.suggestMe('m'+ele.getAttribute("data-mid"));
    };
    var addTagButton=function()
    {
        var buttons=document.querySelectorAll(".codebuttons");
        if(loc==1)
            buttons=buttons[buttons.length-1];
        else if(loc==2)
            buttons=document.querySelector(".codebuttons[accesskey=\"g\"], .codebuttons[accesskey=\"h\"]");

        buttons.insertAdjacentHTML("afterEnd","&nbsp;<input class=\"codebuttons\" accesskey=\"t\" type=\"button\" onclick=\"tag('[tag:',']');PixelTagSystem.forceRepositionCaret();\" "+(standard ? "title=\"" : "onmouseover=\"hstat('" )+"Tagga i tuoi amici (alt + t)"+(standard ? "\"" : "');\"")+" value=\"Tag\">");
    };
    var save_in_cache=function(taggabili)
    {
        localStorage.PixelTagSystemCache=JSON.stringify(taggabili);
        localStorage.PixelTagSystemCacheTime=new Date().getTime();
    };
    var cacheExpired=function()
    {
        if(localStorage && "PixelTagSystemCache" in localStorage)
        {
            if("PixelTagSystemCacheTime" in localStorage)
            {
                var dt=parseInt(localStorage.PixelTagSystemCacheTime);
                if(typeof dt != "number")return true;
                var n=new Date().getTime();
                var durata=1000*60*60*24*2;
                return dt+durata <= n;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return true;
        }
    };
    var addOthers = function()
    {
        var xml = new XMLHttpRequest();
        xml.open("GET",baseurl+"/server/?act=global&c="+circuito);
        xml.send(null);
        xml.onreadystatechange=function()
        {
            if(xml.readyState==4)
            {
                var h = JSON.parse(xml.responseText), lol;
                for(lol in h)
                {
                    if(lol in taggabili)continue;
                    taggabili[lol]=h[lol];
                }
                console.log("Extra Global NIcks");
                console.log(h);
                save_in_cache(taggabili);
                
            }
        }
    };
    var reqHandle=function(matrix,idx)
    {
        var getpw=function(pt)
        {
            if(pt.founder==1) 
                return 1;
            else if(pt.admin==1) 
                return 2; 
            else if(pt.admin_sez==1) 
                return 3; 
            else if(pt.admin_graphic==1) 
                return 4; 
            else if(pt.admin_users==1) 
                return 5; 
            else if(pt.global_mod==1) 
                return 6; 
            else if(pt.mod_sez!=0) 
                return 7; 
            else 
                return 8; 
        };
        if(idx<=-1)
        {
            if(loc==1)
            {
                loadHoverPopups();
                //FUTURE forse verrÃ  implementata: suggestTag();
            }
            addOthers();
            return;
        }
        $.getJSON("/api.php?mid="+matrix[idx].join(",")+"&cookie=1",function(res)
                  {
            var lol;
            for(lol in res)
            {
                if(lol.indexOf("m")==0)
                {
                    var mid=res[lol].id;
                    var nick=res[lol].nickname;
                    var avatar=res[lol].avatar;
                    var group=res[lol].group.name;
                    var pw=getpw(res[lol].permission);
                    taggabili[lol]={mid:mid,nick:nick,avatar:avatar,group:group,pw:pw};
                }
            };

            if(!("m4148305" in taggabili))
            {
                taggabili["m4148305"]={mid:4148305,nick:"flexlex",avatar:"http://kiyur.altervista.org/avatars/?type=.jpg",group:"Supporto Tag System",pw:9};  
            }

            save_in_cache(taggabili);
            reqHandle(matrix,idx-1);
            //            ordertaggabili();
        });
    };
    var loadMembers=function()
    {
        if(!cacheExpired())
        {
            taggabili=JSON.parse(localStorage.PixelTagSystemCache);
            //            ordertaggabili();
            loadHoverPopups();
            //suggestTag();
            return;
        }
        var jsonHandle=function(json)
        {
            var mids=json.admin.users;
            if(json.mod!=null)
            {
                mids=mids.concat(json.mod.users);
            }
            if(json.members!=null)
            {
                mids=mids.concat(json.members.users);
            }
            var matrix=[];
            for(var i=0;i<Math.floor(mids.length/50)+2;i++)
            {
                if(mids.length>50)
                    matrix[i]=mids.splice(0,50);
                else
                    matrix[i]=mids;
            }
            
//            console.log("JSON HANDLE -->");
//            console.log("mids");
//            console.log(mids);
//            console.log("mids length");
//            console.log(mids.length);
//            console.log("Matrix block elaboration");
//            console.log(matrix);
            reqHandle(matrix,matrix.length-1);
        };
        if(dev && false)
        {
            jsonHandle({
                "idForum":965004,
                "admin":{"users":[4148305]},
                "mod":{"users":[]},
                "members":{"users":[4148305,10578303,10938372]}
            });
            return;
        }
        if(typeof $ == "function")
        {
            $.getJSON("/api.php?g=admin,mod,members&cookie=1",function(json)
                      {
                jsonHandle(json);
            });
        }
        else
        {
            var xml=new XMLHttpRequest();
            xml.open("post","/api.php?g=admin,mod,members&cookie=1");
            xml.send();
            xml.onreadystatchange=function()
            {
                if(xml.readyState==4)
                {
                    jsonHandle(json);
                }
            };
        }
    };
    var addFastTag=function()
    {
        if (standard) //standard mode layout
        {
            var posts=document.querySelectorAll(".post");
            for (var i = posts.length - 1; i >= 0; i--)
            {
                try
                {
                    var t=posts[i];
                    var mid=t.querySelector(".nick a")
                    var nick=mid.innerHTML;
                    mid=mid.getAttribute("href").match(/MID=([0-9]+)/);
                    mid = mid!=null ? mid[1] : 0;
                    //var obj=t.querySelectorAll(".details .u_group, .details .u_posts, .details .u_status");
                    var obj=t.querySelectorAll(".title2.bottom .right div.mini_buttons");
                    if(obj == null)continue;
                    obj=obj[obj.length-1];
                    //obj.insertAdjacentHTML("afterEnd","<input type=\"button\" class=\"codebuttons\" value=\"Tag\" onclick=\"tag('[tag:"+mid+"]"+nick+"[/tag] ','')\" data-fasttagbutton=\""+mid+"\">");
                    obj.insertAdjacentHTML("beforeEnd","<a href=\"javascript:void(0);\" onclick=\"tag('[tag:"+mid+"]"+nick+"[/tag] ','')\" data-fasttagbutton=\""+mid+"\" style=\"padding-left:20px;background-image:url("+errorLink+");background-position:left;background-size:19px 19px;background-repeat:no-repeat;\"> Tag</a>");
                }catch(e)
                {
                    console.error("Errore durante l'inserizione del FastTag -> "+e.message);
                }
            };
        }
        else
        {
            //TODO add fast tag for  quirks (doing)
            var posts=document.querySelectorAll(".topic");
            for (var i = posts.length - 1; i >= 0; i--)
            {
                var t=posts[i];
                var mid=t.querySelector(".nick a")
                var nick=mid.innerHTML;
                mid=mid.getAttribute("href").match(/MID=([0-9]+)/);
                mid = mid!=null ? mid[1] : 0;
                //var obj=t.querySelectorAll(".details .u_group, .details .u_posts, .details .u_status");
                var obj=t.querySelector(".right_bottom a").parentNode;
                //obj=obj[obj.length-1];
                //obj.insertAdjacentHTML("afterEnd","<input type=\"button\" class=\"codebuttons\" value=\"Tag\" onclick=\"tag('[tag:"+mid+"]"+nick+"[/tag] ','')\" data-fasttagbutton=\""+mid+"\">");
                obj.insertAdjacentHTML("beforeEnd","<a href=\"javascript:void(0);\" onclick=\"tag('[tag:"+mid+"]"+nick+"[/tag] ','')\" data-fasttagbutton=\""+mid+"\"> Tag</a>");
            };
        }
    };

    var staffTags=function()
    {
        var staff=[], lol;
        for(lol in taggabili)
        {
            if(taggabili[lol].pw<8 && taggabili[lol].pw!=0)
            {
                staff.push(taggabili[lol]);
            }
        }

        if(staff.length==0)return "no staff";
        var html=[];
        for(var i=staff.length;--i>=0;)
        {
            html.push("[tag:"+staff[i].mid+"]"+simplify(staff[i].nick)+"[/tag]");
        }
        return html.join(", ");
    };

    var suggestMe=function(id)
    {
        var ss=textarea.selectionStart;
        var nick=htmlEntity(taggabili[id].nick);
        var v=textarea.value;
        var p1=v.substring(0,ss);
        var p2=v.substring(ss);
        var tagopen=p1.lastIndexOf("[tag:");
        var tagclose=p2.indexOf("]")+p1.length;
        p2=p2.substring(p2.indexOf("]"));
        if(id=="m-1")
        {
            if(p2.indexOf("]")==0)p2=p2.replace("]","");
            p1=p1.substring(0,tagopen);
            var st=staffTags();
            textarea.value=(p1+st+p2);
            textarea.setSelectionRange(p1.length+st.length,p1.length+st.length);
            return;
        }

        if(p2.indexOf("]")!=0)
        {
            p2="]"+p2;
        }
        textarea.value=p1.substring(0,tagopen)+"[tag:"+id.replace("m","")+"]"+nick+"[/tag"+p2;
        var start=tagopen+6+id.length-1;
        textarea.setSelectionRange(start,start+nick.length);
        suggestionClose();
    };
    var submitHandler=function()
    {


        var v=textarea.value.split("\n").join("&bullet;&shy;&bullet;");
        v=v.replace(/\[tag:([0-9]+)\](.*?)\[\/tag\]/g,function(all,mid,nick)
                    {
            return "<mark data-tag=\""+mid+"\"><a href=\"/?act=Profile&MID="+mid+"\">"+nick+"</a></mark>";
        });
        v=v.replace(/\[tag:([0-9]+)\]/g,function(all,mid)
                    {
            if(taggabili["m"+mid]!=null)
            {
                return "<mark data-tag=\""+mid+"\"><a href=\"/?act=Profile&MID="+mid+"\">"+taggabili["m"+mid].nick+"</a></mark>";
            }
            else
            {
                return all;
            }
        });
        v=v.replace(/\[tag:(.*?)\]/g,function(all,nick)
                    {
            var lol;
            for(lol in taggabili)
            {
                if(nick==taggabili[lol].nick || nick.toLowerCase()==taggabili[lol].nick.toLowerCase())
                {
                    return "<mark data-tag=\""+taggabili[lol].mid+"\"><a href=\"/?act=Profile&MID="+taggabili[lol].mid+"\">"+taggabili[lol].nick+"</a></mark>";
                    break;
                }
            };
            return all;
        });

        v=v.split("&bullet;&shy;&bullet;").join("\n");
        textarea.value=v;
        sessionStorage.PixelTagSystemTagRequest="true";
        return v;
    };
    var addFormSubmitHandler=function()
    {
        var form=document.REPLIER;
        if(form!=null)
        {
            form.addEventListener("submit",submitHandler);
        }
    };
    //    var tagAfterPost=function(ele)
    //    {
    //        var mid=ele.getAttribute("data-tagsuggest");
    //        var nick=ele.querySelector("strong").innerHTML;
    //        ele.outerHTML="<mark data-tag=\""+mid+"\"><a href=\"/?act=Profile&MID="+mid+"\">"+nick+"</a></mark>";
    //    }
    var parseNotification=function(not)
    {
        //        console.log("INIZIO DEBUG PARSE NOTIFICATION");
        var pid, info, c=0, nonot=true, html="", nicename, msg, haveRead=0;
        //        console.log("For Loop");
        for(pid in not)
        {
            info=not[pid];
            if(info.canc==1)
                continue;
            if(info.read==0)
                c++;
            nonot=false;
            if(info.read==0 && tid==info.topic_id && info.st==getSt() && document.querySelector("#ee"+pid)!=null)
            {
                haveRead=pid;
                c--;
                info.read==1;
            }
            if("m"+info.from_mid in taggabili)
            {
                info.from_nick=taggabili["m"+info.from_mid].nick;
            }
            switch(info.type)
            {
                case 1:
                case "1":
                    msg=" ti ha citato in ";
                    break;
                default:
                    msg=" ti ha taggato in ";
            }
            html+="<li style=\"position:relative;\" data-notificationpid=\""+pid+"\"><a href=\"/?t="+info.topic_id+"&st="+info.st+"#ee"+pid+"\">"+(info.read == 0 ? "<span class=\"unread\" style=\"margin:0 5px;\"><b>&#10686;</b></span>" : "")+info.from_nick+msg+"<span class=\"marked_text\" style=\"font-weight:bold;\">"+info.topic_title+"</span></a><ul style=\"left:100%;top:0%;\">";
            if(info.sito!=site)
            {
                nicename=info.sito.replace(/http:\/\/(.*?)\.(forumcommunity|forumfree|blogfree)\.(it|net)(.*?)/gi,function(all,name){return name;});
                html+="<li><a href=\""+info.sito+"\"><span class=\"marked_text\" style=\"font-weight:bold;\">Sito: </span>"+nicename+"</a></li>";
            }
            html+="<li><a href=\"/?f="+info.section_id+"\"><span class=\"marked_text\" style=\"font-weight:bold;\">Sezione: </span>"+info.section_name+"</a></li>";
            html+="<li><a href=\"/?t="+info.topic_id+"\"><span class=\"marked_text\" style=\"font-weight:bold;\">Topic: </span>"+info.topic_title+"</a></li>";
            html+="<li><a href=\"/?t="+info.topic_id+"&st="+info.st+"\"><span class=\"marked_text\" style=\"font-weight:bold;\">Pagina: </span>"+((info.st/15)+1)+"</a></li>";
            if(info.read==0)
                html+="<li class=\"segna_come_letto\"><a href=\"javascript:void(0);\" onclick=\"PixelTagSystem.haveRead("+pid+");\"><span class=\"marked_text\" style=\"font-weight:bold;\">Segna come letto</span></a></li>";
            html+="<li><a href=\"javascript:void(0);\" onclick=\"PixelTagSystem.deleteTag("+pid+");\"\"><span class=\"marked_text\" style=\"font-weight:bold;\">Cancella tag</span></a></li>";
            html+="</ul></li>";
        }
        //        console.log("Loop end");
        if(!nonot)
        {
            html="<li><a href=\"javascript:void(0);\" class=\"cancella_tutto\">Cancella tutto</a></li>"+html;
            document.querySelector(".menuwrap .notifiche a").insertAdjacentHTML("beforeEnd","<em>"+c+"</em>");
        }
        else
        {
            html="<li><strong>Nessuna notifica</strong></li>";
        }
        //        console.log("insert html");
        if(!self.hover)
        {
            document.querySelector(".menuwrap .notifiche ul").innerHTML=html;
        }
        //        console.log("finished");
        if(!nonot)
        {
            var ele=document.querySelector(".menuwrap li a.cancella_tutto");
            if(ele!=null)
                ele.addEventListener("click",deleteAllTag);
        }
        notificationUpdate();
        if(haveRead!=0)
        {
            self.haveRead(haveRead);
        }
    };
    var notificationUpdate=function()
    {
        var em, l;
        em=document.querySelector(".menuwrap .notifiche em");
        if(em!=null)
        {
            l=document.querySelectorAll(".menuwrap .notifiche li[data-notificationpid] span.unread").length;
            if(l==0)
            {
                em.style.display="none";
            }
            else
            {
                em.innerHTML=l;
                em.style.display="inline";
            }
        };
    };
    var alreadySend=function()
    {
        var g = localStorage.PixelAmIGlobal;
        if(g != null && g != "" && (g == "yes" || g == "true") && new Date().getTime()-new Date(localStorage.PixelAmIGlobalTime).getTime()<2*24*60*60*1000)return true;
        return false;
    };
    var loadMenuPosts=function()
    {
        try{
            var xml = new XMLHttpRequest();
            xml.open("GET",baseurl+"/server/?act=get&c="+getCircuito()+"&mid="+mid+"&ak="+getAuthKey()+"&isglobal="+alreadySend()+"&site="+site);
            xml.onreadystatechange=function()
            {
                if(xml.readyState==4)
                {
                    var not = JSON.parse(xml.responseText);
                    parseNotification(not);
                    if(!alreadySend())
                    {
                        localStorage.PixelAmIGlobal="true";
                        localStorage.PixelAmIGlobalTime=new Date().getTime();
                    }
                }
            };
            xml.send(null);
        }catch(e){
            $.getJSON(baseurl+"/server/?act=get&c="+circuito+"&mid="+mid,function(not)
                      {
                parseNotification(not);
            });
        }
    };
    var interval = null;
    var haveRead=function(pid)
    {
        $.post(baseurl+"/server/?act=read",{
            mid: mid,
            c: circuito,
            pid: pid
        },function(data)
               {
            if(data!="success")
            {
                console.warn(data);
            }
            else
            {
                var ele=document.querySelector(".menuwrap .notifiche li[data-notificationpid=\""+pid+"\"]"), mark, em, l;

                if(ele!=null)
                {
                    mark=ele.querySelector("span.unread");
                    if(mark!=null)
                        mark.outerHTML="";
                    mark=ele.querySelector("li.segna_come_letto");
                    if(mark!=null)
                        mark.outerHTML="";
                }

                notificationUpdate();
            }
        });
    };
    var deleteTag=function(pid)
    {
        $.post(baseurl+"/server/?act=canc",{
            mid: mid,
            c: circuito,
            pid: pid
        },function(data)
               {
            if(data!="success")
            {
                alert(data);
            }
            else
            {
                var ele=document.querySelector(".menuwrap .notifiche li[data-notificationpid=\""+pid+"\"]");

                if(ele!=null)
                {
                    ele.outerHTML="";
                }
                notificationUpdate();
                if(document.querySelectorAll(".menuwrap .notifiche li[data-notificationpid]").length==0)
                {
                    ele=document.querySelector(".menuwrap .notifiche .notification_ul");
                    if(ele!=null)
                    {
                        ele.innerHTML="<li><strong>Nessuna notifica</strong></li>";
                    }
                }
            }
        });
    };
    var deleteAllTag=function()
    {
        $.post(baseurl+"/server/?act=cancall",{
            mid: mid,
            c: circuito
        },function(data)
               {
            if(data!="success")
            {
                alert(data);
            }
            else
            {
                ele=document.querySelector(".menuwrap .notifiche .notification_ul");
                if(ele!=null)
                {
                    ele.innerHTML="<li><strong>Nessuna notifica</strong></li>";
                }
            }
        });
    };
    var set=function(obj)
    {
        //TODO fast settings
    };

    //Public Methods
    this.hover=false;
    this.debugOutput=null;
    this.forceRepositionCaret=function(){repositionCaret();haveToSuggest();};
    this.suggestMe=suggestMe;
    this.setPrintCorrection=function(b){printCorrection=!!b;};
    this.haveRead=haveRead;
    this.deleteTag=deleteTag;
    //NOTE just for dev
    this.submitHandler=submitHandler;
    this.tagIsNecessary=function()
    {
        sessionStorage.PixelTagSystemTagRequest="true";
        tagIfNecessary();
    }
    this.wordToTag = wordToTag;

    //Constuctor
    standard=document.body.hasAttribute("id");
    loc=getLocation();
    switch(loc)
    {
        case 1:
            tid=getTid();
            fid=getFid();
            mid=getMid();
            circuito=getCircuito();
            tagIfNecessary();
            addFastTag();
        case 2:
            addTagButton();
            isadmin=isAdmin();
            textarea=getTextarea();
            createFakeTextarea(textarea);
            startTagger();
            addFormSubmitHandler();
            loadMembers();
        default:
            if(mid==0)
            {
                mid=getMid();
            }
            addTagMenu();
            loadMenuPosts();
    }
    if(loc!=0)
    {
        document.addEventListener("DOMContentLoaded",adjustFakeTextArea);
        window.addEventListener("load",adjustFakeTextArea);
    }

    //Debug Output
    var debugOutput=function()
    {
        console.groupCollapsed("%cPixelTagSystem: Debug Output","background:#353537;color:white;padding:1px 2px;");
        console.log("%cloc: \t"+loc,"color:#353537;");
        console.log("%ctid: \t"+tid,"color:#353537;");
        console.log("%cfid: \t"+fid,"color:#353537;");
        console.log("%cmid: \t"+mid,"color:#353537;");
        console.log("%csite: \t"+site,"color:#353537;");
        console.log("%cisadmin: \t"+isadmin,"color:#353537;");
        console.log("%cstandard: \t"+standard,"color:#353537;");
        console.log("%cpopup status: \t"+(status ? "open" : "close"),"color:#353537;");
        console.log("%ccircuito: \t"+circuito,"color:#353537;");
        console.log("%cscript baseurl: \t"+baseurl,"color:#353537;");
        console.log("%cprintCorrection: \t"+(printCorrection || dev),"color:#353537;");
        console.log("%cself:","color:#353537;");
        console.log(self);
        console.log("%ctextarea:","color:#353537;");
        console.log(textarea);
        console.log("%cfaketextarea:","color:#353537;");
        console.log(faketextarea);
        console.log("%csuggestPopup:","color:#353537;");
        console.log(suggestPopup);
        console.log("%ctaggabili:","color:#353537;");
        console.log(taggabili);
        console.groupEnd();
    };
    self.debugOutput=debugOutput;
}
PixelTagSystem=new PixelTagSystem();

document.head.insertAdjacentHTML("beforeEnd","<style>div.pixel_suggestion_popup {z-index:10; background-color:white; width:200px; min-height:30px; border-radius:5px; border:1px #ddd solid; position:absolute; -webkit-transition:ease-out 0.1s all; -moz-transition:ease-out 0.1s all; -o-transition:ease-out 0.1s all; -ms-transition:ease-out 0.1s all; transition:ease-out 0.1s all; text-align:left; max-height:200px; } div.pixel_suggestion_popup div.tag_overflow{max-height:200px;overflow:auto;} div.pixel_suggestion_popup:after, div.pixel_suggestion_popup:before { content:\"\"; display:block; position:absolute; top:100%; left:50%; border:7px rgba(0,0,0,0) solid; margin-top:1px; border-bottom:none; border-top:8px #ccc solid; margin-left:-7px; } div.pixel_suggestion_popup:after { margin-top:0px; border-top-color:white; } div.pixel_suggestion_popup div.tag_overflow { overflow:auto; } div.pixel_suggestion_popup > div { border-radius:5px; } div.pixel_suggestion_popup > div > div { position:relative; height:30px; border-bottom:1px rgba(0,0,0,0.1) solid; } div.pixel_suggestion_popup > div > div:last-child { border-bottom:none; }div.pixel_suggestion_popup div.suggestion_div {color:black;}div.pixel_suggestion_popup div.suggestion_div.selected { background-color:#00aaff; color:white; } div.pixel_suggestion_popup div div.tag_avatar { position:absolute; top:2px; left:2px; height:26px; width:26px; overflow:hidden; border-radius:100%; background-color:#eee; } div.pixel_suggestion_popup div span{color:black;} div.pixel_suggestion_popup div div.tag_avatar img { width:26px; min-height:26px; } div.pixel_suggestion_popup div span.nick { padding-left:32px; line-height:30px; text-align:left; } div.pixel_suggestion_popup div span.group { position:absolute; top:0; right:0; font-size:9px; padding-right:4px; line-height:12px; font-style:italic; } div.pixel_suggestion_popup.out { opacity:0; -webkit-transform:translate(0,30px); -moz-transform:translate(0,30px); -o-transform:translate(0,30px); -ms-transform:translate(0,30px); transform:translate(0,30px); } div.pixel_suggestion_popup { opacity:1; -webkit-transform:translate(0,0px); -moz-transform:translate(0,0px); -o-transform:translate(0,0px); -ms-transform:translate(0,0px); transform:translate(0,0px); } div.tag_profile { background-color:white; background-color:rgba(255,255,255,0.95); position:absolute; bottom:100%; left:-9999px; border-radius:5px; border:1px #ddd solid; min-width:250px; margin-left:-125px; -webkit-transition-property:left, -webkit-transform, opacity; -moz-transition-property:left, -moz-transform, opacity; -o-transition-property:left, -o-transform, opacity; -ms-transition-property:left, -ms-transform, opacity; transition-property:left, transform, opacity; z-index:5; -webkit-transform:translate(125px) translate(-50%) scale(0); -moz-transform:translate(125px) translate(-50%) scale(0); -o-transform:translate(125px) translate(-50%) scale(0); -ms-transform:translate(125px) translate(-50%) scale(0); transform:translate(125px) translate(-50%) scale(0); -webkit-transform-origin:bottom; -moz-transform-origin:bottom; -o-transform-origin:bottom; -ms-transform-origin:bottom; transform-origin:bottom; -webkit-transition-delay:0.3s, 0s, 0s; -moz-transition-delay:0.3s, 0s, 0s; -o-transition-delay:0.3s, 0s, 0s; -ms-transition-delay:0.3s, 0s, 0s; transition-delay:0.3s, 0s, 0s; -webkit-transition-duration:0s, 0.3s, 0.3s; -moz-transition-duration:0s, 0.3s, 0.3s; -o-transition-duration:0s, 0.3s, 0.3s; -ms-transition-duration:0s, 0.3s, 0.3s; transition-duration:0s, 0.3s, 0.3s; -webkit-transition-timing-function:easy; -moz-transition-timing-function:easy; -o-transition-timing-function:easy; -ms-transition-timing-function:easy; transition-timing-function:easy; margin-bottom:7px; } mark:hover div.tag_profile { left:50%; -webkit-transform:translate(125px) translate(-50%) scale(1); -webkit-transition-delay:0s, 0s, 0s; -moz-transform:translate(125px) translate(-50%) scale(1); -moz-transition-delay:0s, 0s, 0s; -o-transform:translate(125px) translate(-50%) scale(1); -o-transition-delay:0s, 0s, 0s; -ms-transform:translate(125px) translate(-50%) scale(1); -ms-transition-delay:0s, 0s, 0s; transform:translate(125px) translate(-50%) scale(1); transition-delay:0s, 0s, 0s; } div.tag_profile:after, div.tag_profile:before { position:absolute; top:100%; left:50%; border:10px rgba(0,0,0,0) solid; margin-left:-10px; border-bottom:none; border-top:10px #ddd solid; content:\"\"; } div.tag_profile:after { border-top-color:white; margin-top:-1px; } div.tag_profile div.popup_avatar { width:50px; height:50px; float:left; margin:5px; text-align:center; overflow:hidden; border-radius:100%; border:1px #ddd solid; } div.tag_profile div.popup_avatar img { width:50px; min-height:50px; } div.tag_profile span.tag_nick {color:black; display:block; margin-top:10px; } div.tag_profile span.tag_group { font-style:italic; color:#777; font-weight:lighter; font-size:10pt; line-height:17px; } mark[data-tag] { display:inline-block !important; position:relative; }u[data-tagsuggest] { display:inline-block; position:relative; cursor:pointer; } u[data-tagsuggest] div.pixel_maybe_popup { background-color:white; padding:2px; border-radius:3px; border:1px #ddd solid; position:absolute; white-space:nowrap; bottom:100%; left:50%; margin-left:-100px; margin-bottom:3px; -webkit-transform:translate(100px) translate(-50%) scale(0); -webkit-transform-origin:bottom; -webkit-transition:0.3s ease-out all; -moz-transform:translate(100px) translate(-50%) scale(0); -moz-transform-origin:bottom; -moz-transition:0.3s ease-out all; -o-transform:translate(100px) translate(-50%) scale(0); -o-transform-origin:bottom; -o-transition:0.3s ease-out all; -ms-transform:translate(100px) translate(-50%) scale(0); -ms-transform-origin:bottom; -ms-transition:0.3s ease-out all; transform:translate(100px) translate(-50%) scale(0); transform-origin:bottom; transition:0.3s ease-out all; opacity:1; } u[data-tagsuggest]:hover div.pixel_maybe_popup { -webkit-transform:translate(100px) translate(-50%) scale(1); -moz-transform:translate(100px) translate(-50%) scale(1); -o-transform:translate(100px) translate(-50%) scale(1); -ms-transform:translate(100px) translate(-50%) scale(1); transform:translate(100px) translate(-50%) scale(1); opacity:1; } u[data-tagsuggest] div.pixel_maybe_popup:before, u[data-tagsuggest] div.pixel_maybe_popup:after { content:\"\"; position:absolute; display:block; top:100%; left:50%; border:7px rgba(0,0,0,0) solid; border-bottom:none; border-top:7px #ddd solid; margin-left:-7px; } u[data-tagsuggest] div.pixel_maybe_popup:after { border-top-color:white; margin-top:-1px; }</style>");