Yahoo! Profiles Blast Emoji Supporter

By Masahiro Ihara Last update May 26, 2009 — Installed 83 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

There are 3 previous versions of this script.

//
// ==UserScript==
// @name        Yahoo! Profiles Blast Emoji Supporter
// @description Add support for Yahoo! Profiles blast emoji input
// @include     http://profiles.yahoo.co.jp/-/edit/blast/*
// ==/UserScript==
//
// 2009/05/24 version 0.1    Initial version

(function(){
    var isEmojiWindowOpen = false;
    var isEmojiWindowInitialized = false;

    function setStyle(){
        var style =
            <><![CDATA[
                #emojidialog {
                    position: absolute;
                    border: 1px solid #666666;
                    margin-top: 0.2em;
                    padding: 0em 0.5em 0.5em 0.5em;
                    background: #ffffff;
                    display: none;
                }
                #emojiclosebutton {
                    text-align: right;
                }
            ]]></>;
        GM_addStyle(style);
    }

    // set up jQuery variable
    var $;
    // Add jQuery
    var GM_JQ = document.createElement("script");
    GM_JQ.src = "http://code.jquery.com/jquery-latest.min.js";
    GM_JQ.type = "text/javascript";
    document.body.appendChild(GM_JQ);
    // Check if jQuery's loaded
    var checker = setInterval(function() {
        if (typeof($ = unsafeWindow.jQuery) != "undefined") {
            clearInterval(checker);
            letsJQuery();
        }
    }, 100);
    // All your GM code must be inside this function
    function letsJQuery() {
        $('#contentBodyCount').after('<br /><a href="#" id="emojiprompt">絵文字一覧を表示する</a>');
        $('#emojiprompt').click(function(e) {
            e.preventDefault();
            if (isEmojiWindowOpen) {
                closeEmojiWindow();
            } else {
                openEmojiWindow();
            }
        });
    }
    function openEmojiWindow() {
        if (!isEmojiWindowInitialized) {
            var emojidialog = '<div id="emojidialog">';
            setStyle();
            var emojiidx = [
                '3', '6', '8', '9',
                '10', '11', '12', '13', '14', '16', '17', '18', '19',
                '20', '21', '22', '24', '26', '27', '28', '29',
                '30', '33', '34', '35',
                '48',
                '51', '52', '54', '56', '58', '59',
                '60', '61', '62', '63', '67', '68', '69',
                '70', '71', '72', '73', '74', '75', '76', '79',
                '82', '85', '87', '89',
                '93', '94', '95', '96', '98',
                '101', '104', '105', '106', '108',
                '110', '111', '114',
                '122', '125', '127', '128',
                '132', '137',
                '140', '144',
                '150', '151', '152',
                '162', '167', '168', '169',
                '171', '173', '174', '175', '176', '177', '178', '179',
                '182', '188',
                '190', '192', '193', '194', '195', '196', '198',
                '208', '209',
                '210', '211', '212', '213', '214', '215', '216', '217',
                '221', '222', '223',
                '234', '235', '236', '237',
                '243', '244', '245', '246', '247', '248', '249',
                '250', '251', '252', '253', '254', '257', '258', '259',
                '262',
                '271', '274',
                '280', '281', '284', '287', '289',
                '290', '291', '298',
                '305', '306', '307', '308',
                '316', '318', '319',
                '322', '326', '327',
                '334', '336', '339',
                '345', '349',
                '352', '353', '354', '357',
                '361', '364', '369',
                '372', '374',
                '389',
                '399',
                '407', '409',
                '414',
                '422', '425', '426',
                '458',
                '477', '478',
            ];
            for (var i in emojiidx) {
                emojidialog += '<a href="#emojiicon' + i + '" name="emojiicon">';
                emojidialog += '<img src="http://i.yimg.jp/images/mail/emoji/15/ew_icon_s' + i + '.gif" width="15" height="15">';
                emojidialog += '</a>';
                if (i % 24 == 0) {
                    emojidialog += '<br />';
                }
            }
            emojidialog += '<br /><div id="emojiclosebutton"><a href="#" id="emojiclose">閉じる</a></div>';
            emojidialog += '</div>';
            $('#emojiprompt').after(emojidialog);
            $('a[name=emojiicon]').click(function(e) {
                e.preventDefault();
                var id = $(this).attr('href');
                var s = '{{s0}}';
                if (id.match(/#emojiicon(\d+)/)) {
                    s = '{{s' + RegExp.$1 + '}}';
                }
                var blst = $('#contentBody').val();
                blst += s;
                $('#contentBody').val(blst);
//                $('#contentBody').focus();
                // キーボードイベントを送って入力可能な残り文字数を更新させる
                var event = document.createEvent('KeyboardEvent');
                event.initKeyEvent("keydown", true, true, null, false, false, false, false, 65, 0);
                document.getElementById('contentBody').dispatchEvent(event);
            });
            $('#emojiclose').click(function(e) {
                e.preventDefault();
                closeEmojiWindow();
            });
            isEmojiWindowInitialized = true;
        }
        $('#emojidialog').show();
        isEmojiWindowOpen = true;
        $('#emojiprompt').text('絵文字一覧を閉じる');
    }
    function closeEmojiWindow() {
        $('#emojidialog').hide();
        isEmojiWindowOpen = false;
        $('#emojiprompt').text('絵文字一覧を表示する');
    }
})();