/*------------------------------------------------*
 * 絵文字挿入パレット
 *
 * @update     2007/07/19  Hikari Kubo
 * @copyright  Buzoo Inc.
 *------------------------------------------------*/

/**
 * Load init
 */
window.onload = function() {
    // ボタンClick時
    var button = document.getElementById("switch");
    addListener(button, 'click', switchPalette, false);

    // アイコンClick時
    var icon = document.getElementById("palette").getElementsByTagName('img');

    for (i=0; i<icon.length; i++){
        icon[i].onclick = function() {
            // src属性からファイル番号算出
            var no = this.getAttributeNode('src').value.replace(/.*\/([0-9]+)\.(.*)/, "$1");
            appendEmoji(no);
        };
    }
}

/**
 * クロスブラウザ用 addListener
 */
function addListener(elem, eventType, func, cap) {
    // DOM(Firefox, Opera)用
    if(elem.addEventListener) {
        elem.addEventListener(eventType, func, cap);
    }
    // IE用
    else if(elem.attachEvent) {
        elem.attachEvent('on' + eventType, func);
    }
}

/**
 * 絵文字パレット表示切替
 */
function switchPalette() {
    var target = document.getElementById("palette");

    if (target.style.display == 'none') {
        target.style.display = '';
    } else {
        target.style.display = 'none';
    }
}

/**
 * 絵文字挿入
 */
function appendEmoji(no) {

    var textarea = document.getElementById('target');

    // 挿入文字
    var str = '[絵:' + no + ']';

    // カーソル位置を取得し前後の文字列に絵文字を挟む
    var top = textarea.scrollTop;
    var selection = new Selection(textarea);
    var s = selection.create();
    var position = s.start;

    var before = textarea.value.substring(0, position);
    var after = textarea.value.substring(position, textarea.value.length);

    textarea.value = before + str + after;

    // キー位置調整
    if (window.navigator.appName.indexOf('Microsoft') != -1) { // IE
        var e = textarea.createTextRange();
        var tx = textarea.value.substr(0, position+str.length);
        var pl = tx.split(/\n/);
        e.collapse(true);
        e.moveStart('character', position+str.length-pl.length+1);
        e.text = e.text+'';
        e.collapse(false);
        e.select();
    } else {
        textarea.scrollTop = top;
        textarea.setSelectionRange(position+str.length, position+str.length);
    }

    // フォーカスを合わせる
    textarea.focus();

    // パレットを消す
    switchPalette();
}


// Cross Browser selectionStart/selectionEnd
// Version 0.2
// Copyright (c) 2005-2007 KOSEKI Kengo
// 
// This script is distributed under the MIT licence.
// http://www.opensource.org/licenses/mit-license.php

function Selection(textareaElement) {
    this.element = textareaElement;
}

Selection.prototype.create = function() {
    if (document.selection != null && this.element.selectionStart == null) {
        return this._ieGetSelection();
    } else {
        return this._mozillaGetSelection();
    }
}

Selection.prototype._mozillaGetSelection = function() {
    return { 
        start: this.element.selectionStart, 
        end: this.element.selectionEnd 
    };
}

Selection.prototype._ieGetSelection = function() {
    this.element.focus();

    var range = document.selection.createRange();
    var bookmark = range.getBookmark();

    var contents = this.element.value;
    var originalContents = contents;
    var marker = this._createSelectionMarker();
    while(contents.indexOf(marker) != -1) {
        marker = this._createSelectionMarker();
    }

    var parent = range.parentElement();
    if (parent == null || parent.type != "textarea") {
        return { start: 0, end: 0 };
    }
    range.text = marker + range.text + marker;
    contents = this.element.value;

    var result = {};
    result.start = contents.indexOf(marker);
    contents = contents.replace(marker, "");
    result.end = contents.indexOf(marker);

    this.element.value = originalContents;
    range.moveToBookmark(bookmark);
    range.select();

    return result;
}

Selection.prototype._createSelectionMarker = function() {
    return "##SELECTION_MARKER_" + Math.random() + "##";
}

