/* RccScript version 0.3.2
 * http://rccmembers.web.fc2.com/public/rccscript/index.html
 * Copyright (c) 2009 Riddle Creater's Community
 */

var RccScript = {
    // titleString + ページ番号 + titleSuffix がタイトルバーに表示されます。
    titleString: 'Title ',
    titleSuffix: '',

    // 表示するページ番号の桁数。3なら'001'、2なら'01'、 1なら'1' (3桁まで)
    titleNumDigits: 1,

    // これをtrueにするとタイトルバーとrcc_pageNoの部分が全角数字になります。
    useFullwidthNum: false,

    // これをtrueにするとタイトルバーとrcc_pageNoの部分が漢数字になります。
    // (いまのところ九十九まで対応)
    useKanjiNum: false,

    // 答え入力欄 (rcc_input) のヨコ幅 (半角文字数)
    inputSize: 15,

    // 答え入力ボタン (rcc_button) のラベル
    goButtonLabel: 'Enter',

    // 1問目のファイル名 (rcc_entrance や rcc_start を使う場合は設定してください)
    startFileName: '01_start.html',

    // rcc_entranceのスタート用ボタンのラベル (rcc_entranceを使う場合は設定してください)
    startButtonLabel: 'はじめから',

    // rcc_entranceのコンティニュー用ボタンのラベル (rcc_entranceを使う場合は設定してください)
    continueButtonLabel: 'つづきから',

    // rcc_clueのヒントボタン用のラベル (rcc_clueを使う場合は設定してください)
    clueButtonLabel: 'ヒント',

    // ヒントウィンドウの色を'dark'か'light'で指定
    clueWindowColor: 'dark',

    // ヒントウィンドウの半透明化 trueなら半透明 falseなら不透明
    useTransparentWindow: true,

    // これをtrueにするとclass="movable"指定した要素がドラッグ可能になります。
    // 使わない場合は false にしておいた方が読み込み時のスクリプトが軽くなります。
    useMovable: false,

    // これは弄らずそのままで
    version: '0.3.2'
};

/*-----------------------------------------------------------------------------*/
RccScript.isIE = !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1);
RccScript.pageNum = -1;
// Functions
RccScript.goNext = function() {
    var answer = document.getElementById('rcc_input').value;
    if (answer == '') return;
    answer = RccScript.shapeAnswer(answer);
    if (answer == '') return;
    var prefix = (RccScript.pageNum == -1) ? '' :
        RccScript.getFixedNumber(RccScript.pageNum + 1,2) + '_';
    if (self != top) {
        top.location.href = prefix + answer + '.html';
    } else {
        document.location.href= prefix + answer + '.html';
    }
};

RccScript.checkEnter = function(e) {
    if (!e) e = window.event;
    if (e.keyCode == 13) RccScript.goNext();
};

RccScript.shapeAnswer = function(word) {
    word = toHalfwidth(word);         // 全角→半角
    word = k2r(word);                 // ひらがなカタカナ→ローマ字
    word = trim1(word);               // 記号やスペース等を除去
    word = encodeURI(word);           // 漢字→英字列にエンコード Unicode UTF-8(?)
    word = trim2(word.toLowerCase()); // 英数字以外を除去
    return word;

    function trim1(word) {
        var ignored = ' "%<>[]\\^`{}|';
        var result = '';
        for (var i = 0; i < word.length; i++) {
            var c = word.charAt(i);
            if (ignored.indexOf(c, 0) != -1)
                continue;
            result += c;
        }
        return result;
    }

    function trim2(word) {
        var valid = 'abcdefghijklmnopqrstuvwxyz0123456789';
        var result = '';
        for (var i = 0; i < word.length; i++) {
            var c = word.charAt(i);
            if (valid.indexOf(c, 0) == -1)
                continue;
            result += c;
        }
        return result;
    }

    function toHalfwidth(word) {
        var half = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        var wide = '０１２３４５６７８９ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ';
        var ignored = '　！”＃＄％＆’（）ー＝＾?￥｜＠‘「｛；＋：＊」｝、＜．＞／？＿、。・';

        var result = '';
        for (var i = 0; i < word.length; i++) {
            var c = word.charAt(i);
            var idx = wide.indexOf(c);
            if (idx != -1)
                c = half.charAt(idx);
            if (ignored.indexOf(c) != -1)
                continue;
            result += c;
        }
        return result;
    }

    function k2r(word) {
        var KANA = 'アイウエオヲンあいうえおをん';
        var ROMA = 'aiueoon';
        var KANA2 = 'カキクケコサスセソタテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポかきくけこさすせそたてとなにぬねのはひふへほまみむめもやゆよらりるれろわがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ';
        var ROMA2 = 'kakikukekosasusesotatetonaninunenohahifuhehomamimumemoyayuyorarirurerowagagigugegozajizuzezodajizudedobabibubebopapipupepo';
        var KANA3 = 'シチツしちつ';
        var ROMA3 = 'shichitsu';
        var KANA4 = 'ャュョゃゅょ';
        var ROMA4 = 'auo';
        var KANA5 = 'ァィゥェォぁぃぅぇぉ';
        var ROMA5 = 'aiueo';
        var result = '';
        var xtu = false;
        var prevchar = '';
        for (var i = 0, len = word.length; i < len; i++) {
            var ch = word.charAt(i);
            var rch = '';
            if (KANA.indexOf(ch,0) != -1) {
                var idx = KANA.indexOf(ch,0) % ROMA.length;
                rch = ROMA.charAt(idx);
                if (result.charAt(result.length-1) == rch && rch != 'i') {
                    rch = '';
                } else if ( rch == 'u' && result.charAt(result.length-1) == 'o') {
                    rch = '';
                }
            } else if (KANA2.indexOf(ch,0) != -1) {
                var idx = KANA2.indexOf(ch,0) % 61 * 2;
                rch = ROMA2.substr(idx,2);
                if ('bmp'.indexOf(rch.charAt(0),0) != -1
                    && (prevchar == 'ン' || prevchar == 'ん')) {
                    result = result.slice(0, -1) + 'm';
                }
            } else if (KANA3.indexOf(ch,0) != -1) {
                var idx = KANA3.indexOf(ch,0) % 3 * 3;
                rch = ROMA3.substr(idx,3);
            } else if (KANA4.indexOf(ch,0) != -1) {
                var idx = KANA4.indexOf(ch,0) % 3;
                rch = ROMA4.charAt(idx);
                if ('シチジヂしちじぢ'.indexOf(prevchar,0) == -1) {
                    rch = 'y' + rch;
                }
                result = result.slice(0, -1);
            } else if (KANA5.indexOf(ch,0) != -1) {
                var idx = KANA5.indexOf(ch,0) % 5;
                rch = ROMA5.charAt(idx);
                if ('フふヴ'.indexOf(prevchar,0) != -1
                    || ('テデてで'.indexOf(prevchar,0) != -1 && rch == 'i')
                    || ('シチジヂしちじぢ'.indexOf(prevchar,0) != -1 && rch == 'e')) {
                    result = result.slice(0, -1);
                } else {
                    if ('ウう'.indexOf(prevchar,0) != -1) {
                        rch = 'w' + rch;
                        result = result.slice(0, -1);
                    } else {
                        rch = 'x' + rch;
                    }
                }
            } else if (ch == 'ッ' || ch == 'っ') {
                xtu = true;
                continue;
            } else if (ch == 'ヴ') {
                rch = 'vu';
            } else {
                rch = ch;
            }
            if (xtu) {
                if( rch.charAt(0) == "c") {
                    rch = 't' + rch;
                } else {
                    rch = rch.charAt(0) + rch;
                }
                xtu =false;
            }
            prevchar = ch;
            result += rch;
        }
        return result;
    }
};

RccScript.addListener = function(obj, type, func, cap) {
    if (obj.addEventListener) {
        obj.addEventListener(type, func, cap);
    } else if (obj.attachEvent) {
        obj.attachEvent('on' + type, func);
    } else {
        alert('ブラウザが対応してないみたい…。');
    }
};

RccScript.removeListener = function(obj, type, func, cap) {
    if (obj.removeEventListener) {
        obj.removeEventListener(type, func, cap);
    } else if (obj.detachEvent) {
        obj.detachEvent('on' + type, func);
    }
};

RccScript.getInnerWidth = function () {
  if (typeof innerWidth != 'undefined') {
        return  innerWidth;
    } else if (document.compatMode == 'CSS1Compat') {
        return  document.documentElement.clientWidth;
    } else {
        return document.body.clientWidth;
    }
};

RccScript.getCookie = function(key) {
    var cks = document.cookie.split( '; ' );
    for( var i = 0; i < cks.length; i++ ) {
        var vals = cks[i].split( '=' );
        if (vals[0] == key)
            return decodeURIComponent(vals[1]);
    }
    return null;
};

RccScript.setCookie = function(key, value) {
    var exp = new Date();
    exp.setFullYear(exp.getFullYear() + 1);
    document.cookie = encodeURIComponent(key) + '=' + encodeURIComponent(value) +'; expires=' + exp.toGMTString() + ';' ;
};

RccScript.deleteCookie = function(key) {
    var exp = new Date();
    exp.setFullYear(exp.getFullYear() - 1);
    document.cookie = encodeURIComponent(key) + '=; expires=' + exp.toGMTString() + ';' ;
};

RccScript.getFileName = function() {
    var loc = document.location.href;
    var idx = loc.lastIndexOf( '/' );
    if( idx < 0 ) return '';
    return loc.slice(idx + 1);
};

RccScript.init = function() {
    with (RccScript) {
        var filename =  getFileName();
        pageNum = getPageNum(filename);
        setTitle();
        setForm();
	setClue();
        setEntrance();
    }
    if (!document.getElementById('rcc_continue')
        && !document.getElementById('rcc_noCookie')) {
        RccScript.setCookie('contfilename', filename);
    }
    if (document.getElementById('rcc_deleteCookie')) {
        RccScript.deleteCookie('contfilename');
    }
    if (RccScript.useMovable) {
        RccMovable.init();
    }
};

RccScript.setClue = function() {
    var element = document.getElementById('rcc_clue');
    if (!element) return;
    var message = element.innerHTML;
    if (message.search(/\S/) == -1) return;
    var win = document.createElement('div');
    win.id = 'rcc_window';
    win.className = 'movable';
    if (RccScript.clueWindowColor == 'dark') {
	win.style.backgroundColor = '#000000';
	win.style.color = '#ffffff';
    } else {
	win.style.backgroundColor = '#ffffff';
	win.style.color = '#000000';
    }
    if (RccScript.useTransparentWindow) {
	if (RccScript.isIE) {
	    // IEのバグ回避用
	    win.style.zoom = '1';
	}
	win.style.filter = 'alpha(opacity=80)';
	win.style.opacity = 0.8;
	//mozOpacity = 0.8;
    }
    with (win.style) {
	position = 'absolute';
	border = '1px solid #666666';
	top = '0px';
	left = '0px';
	visibility = 'hidden';
    }
    var head = document.createElement('div');
    head.style.textAlign = 'right';
    var close_button = document.createElement('button');
    close_button.innerHTML = 'x';
    if (RccScript.clueWindowColor == 'dark') {
	close_button.style.color = '#ffffff';
    } else {
	close_button.style.color = '#000000';
    }
    with (close_button.style) {
	backgroundColor = 'transparent';
	border = '1px solid #666666';
	padding = '1px';
	margin = '1px';
	cursor = 'pointer';
    }
    if (!RccScript.isIE) {
        // 何故かIEだとエラーになるので
        close_button.type = 'button';
    }
    RccScript.addListener(close_button, 'click', closeWindow, false);
    head.appendChild(close_button);
    var content = document.createElement('div');
    content.innerHTML = message;
    content.style.padding = '0 1em 1em';
    win.appendChild(head);
    win.appendChild(content);

    var clue_button = document.createElement('button');
    clue_button.innerHTML = RccScript.clueButtonLabel;
    if (!RccScript.isIE) {
        // 何故かIEだとエラーになるので
        clue_button.type = 'button';
    }
    RccScript.addListener(clue_button, 'click', openWindow, false);
    element.innerHTML = '';
    element.appendChild(clue_button);
    element.appendChild(win);

    function openWindow(e) {
	var scrollTop  = document.documentElement.scrollTop || document.body.scrollTop;
	var win = document.getElementById('rcc_window');
	win.style.top = (scrollTop + e.clientY - 20)+ 'px';
	win.style.left = (e.clientX + 20) + 'px';
	win.style.visibility = 'visible';
    }

    function closeWindow() {
	var win = document.getElementById('rcc_window');
	win.style.visibility = 'hidden';
    }
};

RccScript.setForm = function() {
    var element = document.getElementById('rcc_form');
    var input = document.getElementById('rcc_input');
    var button = document.getElementById('rcc_button');
    if (element) {
        if (!input) {
            input = document.createElement('input');
            input.id = 'rcc_input';
            input.type = 'text';
            input.size = RccScript.inputSize;
            element.appendChild(input);
            element.appendChild(document.createTextNode(' '));
        }
        if (!button) {
            button = document.createElement('button');
            button.id = 'rcc_button';
            if (!RccScript.isIE) {
                // 何故かIEだとエラーになるので
                button.type = 'button';
            }
            button.innerHTML = RccScript.goButtonLabel;
            element.appendChild(button);

        }
    }
    if (input) {
        RccScript.addListener(input, 'keypress', RccScript.checkEnter, false);
    }
    if (button) {
        RccScript.addListener(button, 'click', RccScript.goNext, false);
    }
};

RccScript.setEntrance = function() {
    var element = document.getElementById('rcc_entrance');
    var st_button = document.getElementById('rcc_start');
    var ct_button = document.getElementById('rcc_continue');
    if (element) {
        if (!st_button) {
            st_button = document.createElement('button');
            st_button.id = 'rcc_start';
            if (!RccScript.isIE) {
                st_button.type = 'button';
            }
            st_button.innerHTML = RccScript.startButtonLabel;
            element.appendChild(st_button);
            element.appendChild(document.createTextNode(' '));
        }
        if (!ct_button) {
            ct_button = document.createElement('button');
            ct_button.id = 'rcc_continue';
            if (!RccScript.isIE) {
                ct_button.type = 'button';
            }
            ct_button.innerHTML = RccScript.continueButtonLabel;
            element.appendChild(ct_button);
        }
    }
    if (st_button) {
        RccScript.addListener(st_button, 'click', startGame, false);
    }
    if (ct_button) {
        RccScript.addListener(ct_button, 'click', continueGame, false);
        if (!RccScript.getCookie('contfilename')) {
            ct_button.disabled = 'disabled';
        }
    }
    if (!navigator.cookieEnabled) {
        var text = document.createTextNode('Cookieを有効にしておくと閉じたページから再開できます');
        element.appendChild(document.createElement('br'));
        element.appendChild(text);
    }

    function startGame() {
        var filename = RccScript.startFileName;
        if (filename) {
            if (self != top) {
                top.location.href = filename;
            } else {
                document.location.href= filename;
            }
        } else {
            alert('RccScript.startFileNameを設定してください。');
        }
    }

    function continueGame() {
        var filename = RccScript.getCookie('contfilename');
        if (filename) {
            if (self != top) {
                top.location.href = filename;
            } else {
                document.location.href= filename;
            }
        }
    }
};

RccScript.setTitle = function() {
    var numString;
    if (RccScript.pageNum == -1) {
	numString = '';
    } else {
	if (RccScript.useKanjiNum) {
            numString = RccScript.getKanjiNum(RccScript.pageNum);
	} else {
            numString = RccScript.getFixedNumber(RccScript.pageNum, RccScript.titleNumDigits);
	    if (RccScript.useFullwidthNum) {
		numString = toFullwidth(numString);
	    }
	}
    }
    if( document.title == '' || document.title == String.fromCharCode(0xA0)) {
        document.title = RccScript.titleString + numString + RccScript.titleSuffix;
    }
    var element = document.getElementById('rcc_pageNo');
    if (element) {
        element.innerHTML = numString;
    }

    function toFullwidth(str) {
	var wide = ['０','１','２','３','４','５','６','７','８','９'];
	var result = '';
	for (var i = 0; i < str.length; i++){
	    result += wide[str.charAt(i)];
	}
	return result;
    }
};

RccScript.getPageNum = function(filename) {
    if (filename) filename = RccScript.getFileName();
    var idx = filename.indexOf( '_' );
    if( idx < 0 ) return -1;
    var num = parseInt(filename.slice(0, idx), 10);
    if(isNaN(num)) return -1;
    return (isNaN(num)) ? -1 : num;
};

RccScript.getFixedNumber = function(num, digits) {
    if (digits > 3) digits = 3;
    num = num.toString();
    if (num.length > digits) digits = num.length;
    var str = '00' + num;
    return str.slice(-digits);
};

RccScript.getKanjiNum = function(num) {
    // とりあえず99まで対応
    var kanjiNum = '〇一二三四五六七八九';
    var result = '';
    if (num > 9) {
        var tenths = Math.floor(num / 10);
        if (tenths > 1) {
            result += kanjiNum.charAt(tenths);
        }
        result += '十';
        num = num - tenths * 10;
        if (num == 0) {
            return result;
        }
    }
    var c = kanjiNum.charAt(num);
    result += c;
    return result;
};

// RccMovable
var RccMovable = {
    top_diff: 0,
    left_diff: 0,
    holdedObj: null,
    zindex: 0,
    init: function() {
        var elements = (document.all) ? document.all: document.getElementsByTagName('*');
        for (var i = 0, len = elements.length; i < len; i++) {
            if (elements[i].className.indexOf('movable') != -1) {
                var element = elements[i];
                var style = (element.currentStyle) ? element.currentStyle : document.defaultView.getComputedStyle(element, null);
                if (style.position == 'static') {
                    element.style.position = 'relative';
                }
                var top = parseInt(style.top);
                var left = parseInt(style.left);
                element.style.top = (isNaN(top)) ? '0px' : top + 'px';
                element.style.left = (isNaN(left)) ? '0px' : left + 'px';
                element.style.cursor = 'move';
                RccScript.addListener(element, 'mousedown', startDrag, false);
                //element.onmousedown = startDrag;
            }
        }

        function moveobj(e) {
            var obj = RccMovable.holdedObj;
            obj.style.top = (e.clientY - RccMovable.top_diff) + 'px';
            obj.style.left = (e.clientX - RccMovable.left_diff) + 'px';
            stopEvent(e);
            return false;
        }

        function startDrag(e) {
            var obj = getTarget(e);
	    while (obj.className.indexOf('movable') == -1) {
		obj = obj.parentNode;
		if (!obj) return false;
	    }
            RccMovable.left_diff = e.clientX - parseInt(obj.style.left);
            RccMovable.top_diff = e.clientY - parseInt(obj.style.top);
            RccScript.addListener(document, 'mousemove', moveobj, false);
            RccScript.addListener(document, 'mouseup', release, false);
            //document.onmousemove = moveobj;
            //document.onmouseup = release;
            obj.style.zIndex = ++RccMovable.zindex;
            RccMovable.holdedObj = obj;
            stopEvent(e);
            return false;
        }

        function release(e) {
            if (!e) e = window.event;
            RccScript.removeListener(document, 'mousemove', moveobj, false);
            RccScript.removeListener(document, 'mouseup', release, false);
            //document.onmousemove = null;
            //document.onmouseup = null;
            RccMovable.holdedObj = null;
        }

        function getTarget(e) {
            var obj;
            if (e.target) {
                obj = e.target;
            } else if (e.srcElement) {
                obj = e.srcElement;
            }
            if (obj.nodeType == 3) {// defeat Safari bug
                obj = obj.parentNode;
            }
            return obj;
        }

        function stopEvent(e) {
            // バブリングフェーズのイベント伝播を阻止
            if (e.stopPropagation) {
                e.stopPropagation();
            } else if (window.event) {
                window.event.cancelBubble = true;
            }
            // デフォルトイベントを抑止
            if (e.preventDefault) {
                e.preventDefault();
            } else if (window.event) {
                window.event.returnValue = false;
            }
        }
    }
};

RccScript.addListener(window, 'load', RccScript.init, false);
