(function($){
    $.fn.extend({
        props : {
            colors: ["#7e0005","#7e1406","#7e2908","#7e3e09","#7e510c","#7f620f","#807212","#7f7f13","#6a7f12","#537f11","#3b7f10","#257f0f","#177f10","#167f28","#177f49","#168069","#167f7f","#14767f","#10687f","#0b577f","#05407e","#01287e","#00117e","#110b7e","#290b7e","#410b7e","#580b7e","#700c7e","#850006","#851507","#852b09","#85410b","#85550e","#866711","#877914","#868615","#708614","#588612","#3f8611","#288611","#188611","#18862b","#18864d","#18876f","#188686","#167d86","#126e86","#0c5c85","#064485","#022b85","#001285","#110c85","#2b0c85","#450c85","#5d0c85","#770c85","#8f0008","#8f1709","#8f2f0a","#8f460c","#8f5b0f","#906f13","#918216","#909017","#789016","#5e9015","#439014","#2b9013","#1b9013","#1b902d","#1b9052","#1b9177","#1a9090","#188690","#137690","#0e628f","#06498f","#012e8f","#00148f","#130f8f","#2e0e8f","#490e8f","#640e8f","#800e8f","#980009","#98180a","#98320c","#984a0e","#986011","#997615","#9a8a18","#999919","#7f9918","#649917","#479915","#2d9915","#1e9915","#1e9931","#1e9957","#1d9a7f","#1c9999","#1a8f99","#157e99","#0f6898","#074e98","#023098","#001598","#141098","#321098","#4e1098","#6b0f98","#880f98","#a0000a","#a01a0b","#a1350d","#a14f0f","#a16613","#a27d16","#a39219","#a2a21c","#88a21a","#69a219","#4ba217","#31a217","#20a217","#20a233","#1fa25c","#1fa386","#1fa2a2","#1c97a2","#1785a2","#116ea1","#0953a1","#0133a1","#0017a0","#1612a0","#3412a0","#5212a1","#7112a1","#9011a1","#aa000c","#aa1b0c","#aa380e","#ab5311","#ab6c15","#ac8518","#ad9b1b","#acac1e","#90ac1c","#70ac1b","#51ac1a","#34ac19","#23ac19","#22ac37","#22ac63","#22ad8e","#21acac","#1fa0ac","#198dac","#1275ab","#0a57ab","#0237aa","#0018aa","#1713aa","#3813aa","#5813aa","#7813ab","#9813ab","#b3000d","#b31d0e","#b33b10","#b35813","#b57216","#b58c1a","#b5a31d","#b5b520","#97b51f","#75b51d","#55b51c","#37b51b","#24b51b","#25b53a","#24b568","#25b696","#23b5b5","#21a8b5","#1b94b4","#147bb4","#0a5cb4","#0339b3","#001ab3","#1815b3","#3b15b3","#5c15b3","#7e15b3","#a015b4","#bc000e","#bc1e0f","#bc3e11","#bc5c14","#be7818","#be931c","#beab20","#bfbe23","#9fbe21","#7cbe1f","#59be1e","#39be1d","#27be1d","#27be3d","#27be6d","#27bf9d","#26bebe","#23b1be","#1d9cbd","#1681bd","#0c61bc","#023cbc","#001cbc","#1a17bc","#3e16bc","#6116bc","#8516bc","#a817bd","#c5000f","#c52011","#c54113","#c56016","#c67d1a","#c79a1d","#c7b321","#c7c725","#a6c723","#81c721","#5dc720","#3cc71f","#29c71f","#29c740","#29c772","#29c8a5","#28c6c7","#25b9c7","#1fa3c6","#1687c6","#0d66c5","#033fc5","#001dc5","#1b19c5","#4119c5","#6618c5","#8b18c5","#b018c5","#cf0011","#cf2212","#cf4414","#cf6518","#d0841c","#d1a11f","#d1bc24","#d1d127","#aed125","#88d123","#61d122","#3fd121","#2cd121","#2cd143","#2cd177","#2bd2ad","#2ad0d1","#27c2d1","#21acd0","#188ed0","#0f6bcf","#0242d0","#001fd0","#1b1ad0","#441ad0","#6a1ad0","#921ad0","#b91ad0","#d80012","#d82313","#d84716","#d86919","#d9891d","#daa821","#dbc526","#dada29","#b5da27","#8eda25","#67da24","#41da23","#2fda23","#2fda46","#2eda7c","#2edbb4","#2cd9da","#2acbda","#23b4d9","#1a95d9","#0f6fd9","#0345d9","#0020d9","#1e1bd9","#471bd9","#6e1cd9","#991cd9","#c01bd9","#e00014","#e02515","#e14a17","#e16d1a","#e28f1f","#e3af23","#e4cd28","#e3e32c","#bde329","#94e327","#6be326","#45e325","#31e325","#31e349","#30e381","#31e3bc","#2fe2e3","#2cd3e3","#24bbe2","#1b9be3","#1074e2","#0447e2","#0022e1","#1e1de1","#4a1de2","#731de2","#9e1de2","#c81ce2","#ea0619","#ea2b19","#ea4f1a","#ec721c","#ec9521","#edb725","#eed62a","#eded2e","#c6ed2c","#9aed2a","#6fed28","#48ed26","#34ed27","#34ed4c","#33ed88","#33edc4","#32eded","#2edded","#26c4ed","#1da2ec","#1279ec","#034beb","#0024eb","#211feb","#4c1feb","#781fec","#a51fec","#d11fec","#f31422","#f33721","#f35c22","#f57e24","#f59f27","#f5c02a","#f7df2f","#f6f632","#cdf62e","#a1f62c","#73f629","#4bf628","#36f628","#36f650","#35f68d","#35f6cb","#34f6f6","#30e6f7","#28cbf6","#1fa8f5","#127ef5","#044ff4","#0026f4","#2121f4","#5021f4","#7d20f4","#ab21f5","#d921f5","#fb242e","#fb452c","#fb682c","#fd892d","#fdaa2f","#fdc931","#ffe734","#fdfe37","#d7fe34","#aafe31","#7cfe2f","#52fe2d","#39fe2d","#38fe54","#38fe91","#37fed2","#36feff","#32edfe","#2ad2fe","#21adfd","#1382fd","#0351fc","#0027fc","#2222fc","#5322fc","#8222fc","#b122fd","#e022fd","#fb323a","#fb5138","#fb7237","#fd9037","#fdaf39","#fecd3a","#ffe83b","#fdfe3d","#dafe3a","#aefe37","#84fe35","#5afe32","#3dfe31","#3cfe5d","#3bfe97","#3afed4","#39feff","#34eefe","#2cd3fe","#22aefd","#1382fd","#0351fc","#0027fc","#2222fc","#5322fc","#8222fc","#b122fd","#e022fd","#fb4046","#fb5d45","#fd7c43","#fd9843","#fdb442","#fed044","#ffea45","#fefe45","#dcfe41","#b4fe3f","#8bfe3c","#62fe39","#43fe39","#41fe65","#40fe9d","#3efed7","#3cfeff","#38efff","#31d6fe","#29b3fd","#1e89fd","#1058fc","#052cfc","#2925fc","#5524fc","#8222fc","#b122fd","#e022fd","#fb4e53","#fb6a52","#fd8651","#fd9f4f","#fdb94f","#fed34e","#ffeb4f","#fefe50","#defe4c","#b9fe49","#92fe45","#6cfe43","#4afe42","#48fe6e","#47fea4","#45ffd9","#43feff","#3ff0ff","#39d8fe","#31b8fd","#2890fd","#1d61fc","#1634fc","#352bfc","#602afc","#8929fc","#b427fd","#e125fd","#fb5d60","#fc755e","#fd8f5d","#fda75d","#fdbf5b","#fed65a","#ffed5a","#fffe5a","#e0fe57","#befe54","#9afe51","#75fe4f","#53fe4d","#52fe78","#50fea9","#4effdc","#4bfeff","#48f1ff","#42dafe","#3abcfd","#3497fd","#2c6bfc","#243dfc","#4133fc","#6931fc","#9030fc","#b82efd","#e32dfd","#fc6b6e","#fc826c","#fd986b","#fdae6a","#fec468","#feda67","#ffee66","#fffe64","#e2fe63","#c4fe60","#a0fe5c","#7efe59","#5efe59","#5cfe82","#5afeaf","#58ffde","#55ffff","#52f2ff","#4cdcfe","#46c1fe","#409efd","#3974fd","#3449fc","#4f3dfc","#723bfc","#9739fc","#be38fd","#e436fd","#fc7a7c","#fc8d7a","#fda278","#fdb577","#fec976","#fedd74","#ffef72","#fffe71","#e4fe6f","#c9fe6b","#a9fe69","#88fe66","#69fe64","#67fe8c","#65feb6","#62ffe1","#60ffff","#5df3ff","#59dffe","#52c5fe","#4ca5fd","#477efd","#4354fc","#5a49fc","#7c47fc","#9e45fd","#c142fd","#e641fd","#fc888a","#fc9987","#fdac86","#febc84","#fece82","#fee082","#fff180","#fffe7d","#e7fe7a","#ccfe79","#b1fe76","#92fe72","#75fe71","#72fe95","#70febc","#6effe3","#6cffff","#68f4ff","#63e2fe","#5fcafe","#5aacfd","#5587fd","#4f60fc","#6856fc","#8653fc","#a450fd","#c64efd","#e74cfd","#fc9697","#fca696","#feb594","#fec491","#fed490","#fee38e","#fff28d","#fffe8b","#e9fe89","#d1fe85","#b8fe83","#9dfe80","#81fe7e","#7ffe9e","#7dfec1","#7bffe6","#78ffff","#74f5ff","#71e4fe","#6ccffe","#68b3fd","#6391fd","#5f6dfd","#7361fd","#8f60fd","#ab5efd","#ca5bfd","#e958fd","#fca4a5","#fdb0a3","#febfa1","#fecca0","#fed99d","#fee69b","#fff49a","#fffe99","#ecfe95","#d7fe92","#bffe90","#a7fe8e","#8dfe8c","#8cfea9","#89fec8","#86ffe8","#85ffff","#81f6ff","#7ee7ff","#79d3fe","#76bafe","#729cfd","#6d79fd","#7f6ffd","#986dfd","#b36bfd","#ce68fd","#ea66fd","#fdb2b3","#fdbdb1","#fec8af","#fed4ad","#fedeab","#ffeaa9","#fff5a7","#fffea5","#f0fea3","#dcfea0","#c7fe9d","#b0fe9a","#9bfe9a","#99feb2","#96fece","#94ffeb","#91ffff","#8ef7ff","#8beaff","#87d8fe","#83c1fe","#7ea5fd","#7c87fd","#8b7dfd","#a27afd","#b977fd","#d376fd","#ed74fd","#fdc1c2","#fdc9bf","#fed1bc","#fedbbb","#ffe4b9","#ffedb7","#fff6b4","#fefeb3","#f2feb0","#e1fead","#d0feab","#bcfea8","#a7fea6","#a5febc","#a4fed5","#a1ffed","#9effff","#9bf8ff","#99ecff","#94dcfe","#91c8fe","#8daffe","#8992fd","#978afd","#ac88fd","#c186fd","#d683fd","#ee81fe","#fdcfd0","#fed4cd","#ffdbcb","#ffe2c8","#ffe9c6","#fff1c4","#fff8c2","#fefec0","#f4febd","#e7febb","#d8feb9","#c6feb6","#b5feb5","#b3fec7","#b0ffdb","#aefff0","#abffff","#a8f9ff","#a5efff","#a3e0ff","#9fcffe","#9bb9fe","#97a0fd","#a398fd","#b696fd","#c793fd","#db90fe","#f18efe","#fedddd","#fee1dc","#ffe5d9","#ffe9d6","#ffefd4","#fff4d2","#fffad0","#fffecd","#f6fecb","#ebfec8","#defec5","#d2fec4","#c3fec2","#bffed0","#bcffe1","#bcfff2","#b8ffff","#b5faff","#b3f1ff","#b0e5ff","#add7fe","#a9c3fe","#a6adfe","#afa6fe","#bfa3fe","#d0a2fe","#e09ffe","#f29cfe"],
            width: '28',
            size: '5',
            defaultcolor: undefined // colore predefinito
        },
        colorPicker : function (_props)
        {
            if (_props) this.props = $.extend(this.props, _props);
            $(this).data('color', this.props.defaultcolor);
            var THIS = this;
            $(this).addClass('picker-handler');
            var palette = $('<div class="picker"></div>').hide();
            var total = this.props.colors.length;
            var current = $(this);
            for(i=0; i<total; i++) {
                if ((i % this.props.width) == 0) if (i > 0) palette.append('<div style="clear: both;"></div>');
                var box = $("<div style='background-color:" + this.props.colors[i] + ";' class='pickercolor'></div>");
                box.click(function () {
                    var c = $(this).css('backgroundColor');
                    var color = (c.indexOf('rgb') != -1) ? rgbToHex(c) : c;
                    THIS.data('color',color);
                    $(THIS).trigger('select',color);
                });
                box.mouseover(function () {
                    var c = $(this).css('backgroundColor');
                    var color = (c.indexOf('rgb') != -1) ? rgbToHex(c) : c;
                    $(THIS).trigger('taste',color);
                });
                $(palette).append(box);
            }
            $(this).append(palette);
            var position = $(this).offset();
            palette.css({
                top: '-136px', //position.top - $(this).find(".picker").outerHeight(true) - 7,
                left: (position.left - 8)
            });

            // ACTIONS ///////////////////////
            $(this).click(function(){
                if($(THIS).find('.picker').css('display') == 'none') $(THIS)._showPalette();
                else $(THIS)._hidePalette();
            });
            $(palette).mouseleave(function(){
                $(THIS)._hidePalette();
                if(THIS.data('color')) $(THIS).trigger('taste',THIS.data('color'));
            });

            // FUNCTIONS /////////////////////
            function rgbToHex(value) {
                var matches = value.match(/\d+/g);
                for (var i = 0; i < matches.length; i++) {
                    matches[i] = parseInt(matches[i]).toString(16);
                    if (matches[i].length < 2) matches[i] = '0' + matches[i];
                }
                return "#" + matches[0] + matches[1] + matches[2];
            }
            return this;
        },
        _showPalette : function(){
            $('.picker').hide();
            $(this).find('.picker').show();
        },
        _hidePalette : function(){
            $(this).find('.picker').hide();
        }

    });
})(jQuery);
