DIR : /home/kozerus/public_html/jkwii/js/jsdoit/toDoll/index.js

/home/kozerus/public_html/jkwii/js/jsdoit/toDoll

/**
 * toDoll
 *
 * ところどころで Fork元である edo_m18 さんのソースを流用しています
 * 使っているのはjQueryではなくMooToolsです
 */

(function(win, $){
    var toDoll = win.toDoll || {};

    toDoll.ToDo = new Class({
        Implements:[Options],

        options:{
            dbName  :'todoll',
            max:10//最大保存数
        },

        INDEX    : 0,
        UID: 1,

        initialize:function(option){
            this.setOptions(option);
            this.storage = window.localStorage;
            this.UID = this.getID();
            this.INDEX = this.getIndex();

            this.saveID();
        },

        isEmpty:function(){
            return  (this.INDEX > 0);
        },

        /**
         * 新しく追加できるか確認
         *
         */
        isAdd:function(){
            return (! this.isMax() || this.getID());
        },

        /**
         * 保存数
         */
        isMax:function(){
            return (this.INDEX >= (this.options.max-1));
        },

        /**
         * idが数値かどうかを判定
         */
        isID: function(id) {
            return typeof id === 'number';
        },

        /**
         * ストレージからIDを得る
         */
        getID:function(){
            var i = this.storage[this.options.dbName + '.uid'];

            return i ? Number(i) : 1;
        },

        /**
         * IDを保存
         * @param id
         */
        saveID:function(){
            this.storage[this.options.dbName + '.uid'] = this.UID;
        },

        /**
         * 現在のindex数を取得する
         */
        getIndex: function(data) {

            var o = data ? data : this.getData();

            return o ? o.length : null;
        },

        /**
         * ToDoデータをlocalStorageから取得する
         *
         * @param {Number} id 取得したいToDoのID
         * @returns {Object} 取得したToDoデータリスト
         */
        getData: function(id) {

            var db = this.storage[this.options.dbName],
                json,
                i = 0, l;

            //データが存在していなければ初期化を実行する
            (db) || this.clear();

            //JSONデータをチェック。データが存在しなければ正規化
            json = JSON.parse(this.storage[this.options.dbName]);
            (json) || (json = {});
            (json.data) || (json.data = []);

            //IDが指定されていなかったらデータすべてを返す
            if (!this.isID(id)) {
                var data;

                if(typeOf(json.data) === 'object'){
                    data = [json.data];
                }else{
                    data = json.data.sort(function(a, b) {
                        return a.complete - b.complete;
                    });
                }

                //完了状態を元にソート
                //(完了したものが後ろに移動する)
                return data;
            }

            //指定されたIDのデータを返す
            for (l = json.data.length; i < l; i++ ) {
                if (json.data[i].tid == id) {
                    return json.data[i];
                }
            }

            //該当IDが存在しなければnullを返す
            return null;
        },

        /**
         * setter
         * @param {Object} data
         * @param {Number} id
         */
        setData: function(data, id) {

            var d,
                i = 0, l;

            if (!this.isID(id)) {
                this.storage[this.options.dbName] = JSON.stringify({data: data});
            } else {
                d = this.getData();

                update: {
                    for (l = d.length; i < l; i++) {
                        if (d[i].tid == id) {
                            d[i] = data;
                            break update;
                        }
                    }

                    d[d.length] = data;
                }

                this.INDEX = this.getIndex(d);
                this.UID++;
                this.saveID();
                this.storage[this.options.dbName] = JSON.stringify({data:d});
            }
        },

        /**
         * データベース(localStorage)とリストを初期化(クリア)する
         */
        clear: function() {
            this.storage[this.options.dbName] = JSON.stringify({data:[]});
            this.INDEX = 0;
        },

        /**
         * ToDoを削除する
         *
         * @param {Number} id 削除するToDoのID
         */
        remove: function(id) {

            var data,
                i = 0, l;

            //いったん全データを取得
            data = this.getData();

            //該当するデータを検索
            for (l = data.length; i < l; i++) {
                if (data[i].tid == id) {
                    data.splice(i,1);
                    break;
                }
            }

            //更新したデータリストを保存
            this.setData(data);
        },

        /**
         * ToDoをリストに追加する
         *
         * @param {String} txt ToDoに設定するテキスト.
         * @param {Number} id ToDoのユニークID
         */
        add: function(txt, id){

            var data;

            /**
             * 渡されたIDのデータを取得
             * もしデータがあればそれを更新する
             */
            data = this.getData(id);

            //各プロパティの正規化
            data || (data = {});
            //data.groupID || (data.groupID = 0);
            data.complete || (data.complete = 0);

            data.txt = txt;
            data.tid = id;

            //設定した情報を保存
            this.setData(data, id);
        },

        /**
         * 全部コンプしてるか調べる
         * @return {boolean}
         */

        isFullComplete : function(){

            var  data = this.getData();

            return data.every(function(item){

                return (item.complete !== 0);

            });
        }

    });

    win.toDoll = toDoll;

})(window, document.id);

(function(win, $){
    var toDoll = win.toDoll || {};

    toDoll.Scenario = new Class({
        initialize:function(data){
            this.data = data;
            this.book = [];
        },

        setData:function(action, data){
            if(typeof action === 'string'){
                this.data[action] = data;
            }else{
                this.data = action;
            }
        },

        /**
         * 台詞データ取得
         * @param {string} action 大カテゴリ
         * @param {string} when 'before' or 'after'
         */
        getData:function(action, opt_when){
            if(!this.data){
                return null;
            }

            if(action){
                if(opt_when){
                    try {
                        if(opt_when.indexOf( '_random') === -1){
                            return this.data[action][opt_when].clone();

                        }else{//ランダム
                            var dat = this.data[action][opt_when].getRandom();
                            if(typeOf(dat) === 'object'){
                                return [ Object.clone(dat)];
                            }else if(typeOf(dat) === 'array'){
                                return dat.clone();
                            }

                        }

                    }catch(e){
                        return null;
                    }
                }else{
                    try{
                        return this.data[action].clone();
                    }catch(e){
                        return null;
                    }
                }
            }else{
                return this.data;
            }
        },

        /**
         * 台詞を台本に追加
         * @param {Array} array
         */
        add:function(array){
            for(var i = 0, x = array.length; i < x ; i ++ ){
                this.book.push(array[i]);
            }
        },

        /**
         * 台本から先頭の台詞を取り出す
         * @return {Object}
         */
        get:function(){
            if( this.book.length > 0 ) {
                return this.book.shift();
            }
            return null;
        },

        /**
         *
         * @param action
         * @param opt_when
         */
        setBook:function(action, opt_when){
            var array = this.getData(action, opt_when);
            if(array){
                this.add(array);
            }
        },

        getBook:function(){
            return this.book;
        },

        bookSize:function(){
            return this.book.length;
        },

        remove:function(i){
            this.book.splice(i,1);
        },

        clearBook:function(){
            this.book = [];
        }
    });

    win.toDoll = toDoll;
})(window, document.id);

(function(win, $){
    var toDoll = win.toDoll || {};

    /**
     * Class Assistant
     * @constructor
     *
     * voice format
     * {"text":"おはようございます!", "face":"joy", "delay":500}
     */
    toDoll.Assistant = new Class({
        Implements:[Options, Events],
        options:{

            /** @type {string} 台詞ファイル */
            scenario:'scenario/jk.json',

            /** @type {string} 立ち位置 */
            position:'right',

            ngWords:{
                //Lv1
                'complain':['セッ○ス','セック○','お○にー','くり○りす', '手コキ', '手コミ', '手マン', '手マン', '青姦', '千摺り', '素股', '即ハメ', '即ハメ', '即マン', '即マン', '即ヤリ', '即ヤリ',   '潮ふき', '潮フキ', '潮吹き','マンコ', 'まんこ', 'マンコ', 'まんこ','ぱいぱん', 'パイパン', 'パイパン','ハメ撮', 'ハメ撮', 'ハメ撮り', 'はめ撮り', 'ハメ撮り', 'ハメ写', 'ハメ写','セクロス', 'セクロス',    'セックル', 'セックル','マン汁', 'まん汁', 'マン汁', 'まん汁', 'ヤリコン', 'ヤリコン', 'ヤリサー', 'ヤリサー', 'ヤリトモ', 'ヤリマン', 'やりまん', 'ヤリマン','オナニー', 'おなにー', 'オナニー', 'スカトロ', 'すかとろ', 'スカトロ', 'すかとろ'],
                //Lv2
                'dislike': ['おっぱい','エンコウ', 'エンコウ','淫乱', '援助交際', '円交', '援交', '盗撮','買春', '売女','幼女','ょぅι゛ょ','ようじょ'],
                //Lv3
                'hate':['アナル', 'あなる', 'アナル','SEX', 'sex', 's_e_x', 'S_E_X', 'SE×', 'SEX', 'Sex', 'sex', 'Sex', 'sEx', 'seX', 'SEx', 'sEX', 'SeX', 'セックス', 'セックす', 'セッくス', 'セっクス', 'せっくス', 'セッくス', 'セックス','ちんこ', 'チンコ','チンコ', 'チンコ', 'チンチン', 'ちんちん', 'チンチン', 'チンポ', 'ちんぽ', 'チンポ', 'チンポ','れいぷ', 'レイプ', 'レイプ','顔射','自慰', 'fuck', 'ファック', 'ふぁっく','乱交','痴漢'],
                //Lv4
                'detest':['タヒね','シネ','いんらん', 'インラン','殺す', 'しね','自殺','麻薬','大麻', '死ね','死ん'],

                //special
                'love':['好き','すき','愛してる','結婚して'],
                'cheer':['疲れた','もうやだ','嫌だ','疲れる','無理'],
                'cure':['死にたい','死にます','死にましょう','しにましょう', '死にませんか','しにませんか', '自殺','殺して','死ぬ','しぬ', 'しにたい','しにます']
            },

            voice:{
                /** @type {Array} */
                "loading":[{"text":"ごめん。ちょっと待って", "face":"normal", "delay":0}],

                /** @type {Array} エラーメッセージ */
                "error":[ {"text":"エラーがあったみたいです", "face":"normal", "delay":0}]
            },

            maxWordLen:10,//文字数
            maxTaskLen:10,//タスク保存数

            baloon:'assistant-speech-baloon',

            layer:'assistant'
        },

        /**
         * 喋っているかどうかのフラグ
         * @type {boolean}
         */
        talking:false,

        /**
         * 初期化
         * @param option
         */
        initialize:function(option){
            this.setOptions(option);

            this.baloon = $(this.options.baloon);
            this.layer = $(this.options.layer);

            this.Scenario = new toDoll.Scenario();

            this.talkTimer = null;
            this.scenario = null;

            //初期表情セット
            this.setExpression(this.options.voice.loading.face);
            this.setBaloon(this.options.voice.loading.text);

            this.load();
        },

        /**
         * JSON読み込み
         */
        load:function(){
            var that = this;
            that.talk(that.options.voice.loading);

            return new Request.JSON({
                url: this.options.scenario,
                onSuccess: function(json){
                    that.Scenario.setData( json);
                    that.setTalk('start');
                    that.talk();
                },
                onFailure:function(){
                    that.SetTalk(that.options.voice.error).talk();
                }
            }).get();
        },

        /**
         * 台詞処理
         * @param {Array} scenario voiceオブジェクトが入った配列
         */
        vocalCodes:function(scenario){
            var that = this;

            var voice = scenario.shift();

            if(voice){
                var pending = voice['pending'] ? voice.pending : 0;

                this.talkTimer = setTimeout(function(){
                    that.setBaloon(voice.text);
                    that.setExpression(voice.face);

                    if(voice['callback']){
                        voice['callback']();
                    }

                }, pending);
            }

            if(scenario.length){
                this.talkTimer = setTimeout(function(){
                    return that.vocalCodes(scenario);
                }, (voice.delay + pending));

            }else{
                this.talking = false;
                return this.fireEvent('talkComplete');

            }
        },

        /**
         * リセット
         * 台詞再生の重複を防ぐ
         */
        reset:function(){
            this.Scenario.clearBook();
            clearTimeout(this.talkTimer);
            this.talking = false;
            return this;
        },

        getTalk :function(action, opt_when){
            if(typeof action === 'string'){
                return  this.Scenario.getData(action, opt_when);
            }else{
                return  this.Scenario.getData();
            }
        },

        //台本に追加
        setTalk:function(action, opt_when){
        	
            if(typeof action === 'string'){
                this.Scenario.setBook(action, opt_when);
            }else if(typeOf(action) === 'array'){
                this.Scenario.add(action);
            }

            return this;
        },

        /**
         * 喋らせる
         * @param {Array} scenario voiceオブジェクトが入った配列
         */
        talk:function(){

            if(this.talking){
                return false;
            }else{
                this.talking = true;
                var scenario = this.Scenario.getBook();
                this.vocalCodes(scenario);
            }
            return this;
        },

        /**
         * ふきだしセット
         * @param {string} text
         */
        setBaloon:function(text){
            this.baloon.set('html', text);
        },

        /**
         * 表情セット
         * @param {string} tag
         */
        setExpression:function(tag){
            this.layer.setAttribute('data-face', tag);
        },


        /**
         * 軽くバリデーションなど
         * @param {string} text
         */

        validation:function(text){
            var result = [];
            var ngtest = {  detest:false, hate:false, dislike:false, complain:false };

            text = text.clean().stripScripts().replace(/[\n\r]+/g, '');

            if(text.length === 0){
                result.push('empty');
            }

            if(text.length > this.options.maxWordLen){
                result.push('over');
            }

            Object.each(this.options.ngWords, function(ngWord, lv){
                for(var i = ngWord.length; i--; ){
                    if(text.test(ngWord[i], 'i')){
                        ngtest[lv] = true;
                    }
                }
            });

            Object.each(ngtest, function( r, lv){
                if(r === true){
                    result.push(lv);
                }
            });

            return result;

        }
    });

    win.toDoll = toDoll;

})(window, document.id);


(function(win, $){
	var toDoll = win.toDoll || {};
	
    toDoll.todo = [];

    toDoll.wellCount = 0;//焦らしカウンタ
    toDoll.welLimit = false;//焦らしフラグ
    toDoll.busy = null; //(タイマー的な)処理中で忙しいんですフラグ

    Element.NativeEvents['webkitTransitionStart'] = 2;
    Element.NativeEvents['webkitTransitionEnd'] = 2;
    Element.NativeEvents['webkitAnimationStart'] = 2;
    Element.NativeEvents['webkitAnimationEnd'] = 2;
    Element.NativeEvents['transitionstart'] = 2;
    Element.NativeEvents['transitionend'] = 2;
    Element.NativeEvents['animationstart'] = 2;
    Element.NativeEvents['animationend'] = 2;

    /**
     * @constructor
     */
	toDoll.Controller = new Class({
		Implements:[Options, Events],

		options:{
		    todoOptions:{},
		    assistantOptions:{}
		},

		//
		initialize:function(option){
			this.setOptions(option);

			this.Assistant = new toDoll.Assistant(this.options.assistantOptions);
            this.options.todoOptions['max'] = this.Assistant.maxTaskLen;
            this.Todo = new toDoll.ToDo(this.options.todoOptions);

            this.container = $('todo');
            this.commandPanel = $('user-voice');
            this.addFormPanel = $('add-form');
            this.confirmPanel = $('confirm');

            this.removeCheckedToDo = []; //削除するToDアイテム(のID)

            var that = this;

            /**
             * set #todo Delegate
             */
            this.container.addEvents({

                //mouseover
                'mouseover:relay(.todoItem:not(.complete):not(.edit) > .todoTxtItem)': function(event, target){
                    event.preventDefault();

                    if(!toDoll.busy){
                        that.Assistant.reset().setTalk('todoitem', 'mouseover_random').talk();
                    }
                },

                //click -> edit
                'click:relay(.todoItem:not(.complete):not(.edit) > .todoTxtItem)':function(event, target){
                    event.preventDefault();

                    that.Assistant.reset().setTalk('edit','start').setTalk('edit','waiting').talk();
                    that.createChangeForm(target);
                }
            });

		},


        /**
         * ToDo確認
         */
		check:function(){

            this.Assistant.reset().setTalk('check','before');

            if(this.busy){
                return false;
            }

			 //ToDoがひとつも登録されていない
            if (! this.Todo.isEmpty()) {
            	this.Assistant.setTalk('check','empty')
                                     .setTalk('waiting')
                                     .talk();
                $('container').removeClass('showTodo');
                return true;

            }else{

                this.container.empty();
                this.reflesh();
                this.reading();

            }

		},

        /**
         * リスト更新
         * @param data
         */
        reflesh:function(opt_append){

            var data = this.Todo.getData();
            toDoll.todo = [];

            //全ToDoデータを画面から削除
            if(opt_append){
                this.container.empty();
            }

            for (var i = 0, l = data.length; i < l; i++) {

                element = this._createTodoHTML(data[i]);

                toDoll.todo.push(element);

                if(opt_append){
                    this.container.grab(element);
                }

            }//for
        },

        /**
         * データの読み上げ
         * @param data
         */
        reading:function(){
            var afterWords;
            var data = this.Todo.getData();

            toDoll.busy = true;

            var talk = [];
            for (var i = 0, l = data.length; i < l; i++) {
                talk.push({
                    'text': data[i].txt,
                    face:'happy',
                    'delay':data[i].txt.length * 300,
                    callback:function(){
                        $('container').addClass('showTodo');
                        $('todo').grab(toDoll.todo.shift());
                    }
                });
            }

            afterWords = this.Assistant.getTalk('check','after');
            afterWords.getLast().callback = function(){
                toDoll.busy = null;
            };

            talk.append(afterWords);

            //全部コンプしてたときの台詞
            if(this.Todo.isFullComplete()){
                talk.append( this.Assistant.getTalk('complete', 'fullcomp_random'));
            }

            talk.append(this.Assistant.getTalk('waiting'));

            //1つずつ喋らせる
            this.Assistant.setTalk(talk).talk();
        },

        /**
         * html要素作成
         * @param data
         * @param compFlg
         */
		_createTodoHTML:function(data){

           var  compFlg = data.complete ? ' complete' : '';

           var  html = '<span class="todoTxtItem" data-tid="'+ data.tid + '">' + data.txt + '</span>';

            if(compFlg){
                var date = new Date(data.complete);
                var datetime = date.format('%Y-%m-%dT%T+09:00');
                var timetext = date.format('%Y/%m/%d %T');
                html += '<time class="todoCompTime" datatime="' + datetime + '">'+ timetext +'</time>';
            }

            html += '<div class="todoCtrl completeCtrl">';
            html +=    '<button  data-tid="' + data.tid + '" class="btnComp" data-action="complete">完了</button> ';
            html +=    '<button type="button"  data-tid="' + data.tid + '" data-action="removeConf" class="btnDel">削除</button>';
            html +=  '</div>';
            html +=  '<div class="todoCtrl resumeCtrl">';
            html +=    '<button data-tid="' + data.tid + '" class="btnResume" data-action="resume">再開</button>';
            html +=  '</div>';
            html +=  '<div class="todoCtrl editCtrl">';
            html +=    '<button data-tid="' + data.tid + '" class="btnEditUpdate" data-action="editEnter">更新</button>';
            html +=    '<button data-tid="' + data.tid + '" class="btnEditCancel" data-action="editCancel">キャンセル</button>';
            html +=  '</div>';

            return new Element('div', {"id":'todoitem-' + data.tid, 'class':'todoItem' + compFlg, 'html':html});
		},

        /**
         * ToDo追加するときのフォーム表示演出
         */
        add:function(){

            var that = this;

            if( ! this.Todo.isAdd()){
                return false;
            }

            this.Assistant.reset()
                                .setTalk('add','before')
                                .setTalk('add', 'waiting');

            this.Todo.ADDFLG = true;

            var transitionCallback =  function(){
                that.Assistant.talk();
                this.removeEvent('webkitTransitionEnd');
                this.removeEvent('transitionend');
            };

            this.commandPanel.addEvent('webkitTransitionEnd', transitionCallback);
            this.commandPanel.addEvent('transitionend', transitionCallback);

            this.commandPanel.setAttribute('data-effect', 'fadeOut');//コマンド隠す
            this.addFormPanel.setAttribute('data-effect', 'fadeIn');//フォーム出す

        },

        /**
         * 追加します
         */
        addEnter:function(){
        	this.addForm = $('add-text');
            var text = this.addForm.value;
			this.Assistant.reset();

            var check = this.Assistant.validation(text);

            //これ以上無理
            if(this.Todo.isMax()){
                this.Assistant.setTalk('validation','max').setTalk('waiting').talk();
                return false;
            }

            if(check.length > 0){
            	this.Assistant.setTalk('validation', check.shift());
            	this.Assistant.setTalk('add', 'waiting');
            	this.Assistant.talk();
            	this.addForm.value = '';
            	return false;
            }

            this.Assistant.setTalk('add', 'execute').setTalk('waiting').talk();
            this.addForm.value = '';

            var id = this.Todo.getID();
            id = !isNaN( id ) ? id : 0;

            this.Todo.add(text, id);
            $('container').addClass('showTodo');

            this.reflesh(true);
        },

        /**
         * 追加やめます
         */
        addCancel:function(){
            this.Todo.ADDFLG = false;
            this.Assistant.reset().setTalk('add','cancel').setTalk('waiting').talk();

            this.commandPanel.setAttribute('data-effect', 'fadeIn');//コマンド出す
            this.addFormPanel.setAttribute('data-effect', 'fadeOut');//フォーム隠す

        },

        /**
         * ---------- 終了 -----------
         *
         * @param {(number|string)} id 対象のToDo ID
         */
        complete: function(param,  id ) {

            var data = this.Todo.getData(Number( id ));

            //コンプリートフラグ
            data.complete =  Date.now();
            this.Assistant.reset()
                                 .setTalk('complete', 'normal_random');

            //フラグを更新してデータを保存
            this.Todo.setData(data, Number( id ));

            //全部コンプしてたときの台詞
            if(this.Todo.isFullComplete()){
                this.Assistant.setTalk('complete', 'fullcomp_random');
            }

            this.Assistant.setTalk('waiting').talk();

	        this.reflesh(true);

        },


        /**
         * ---------- 再開 -----------
         * @param {(number|string)} id 対象のToDo ID
         */
        resume:function( param, id ){

            var data = this.Todo.getData(Number( id ));

            //コンプリートフラグ消す
            data.complete =  0;
            this.Assistant.reset()
                .setTalk('resume', 'normal_random')
                .setTalk('waiting')
                .talk();

            //フラグを更新してデータを保存
            this.Todo.setData(data, Number( id ));

            this.reflesh(true);
        },

        /**
         * 全消去確認
         */
        clearConf:function(){
            var count = this.Todo.getIndex();

            if(toDoll.busy){
                return false;
            }

            if(count === 0){//忘れるものがない
                this.Assistant.reset().setTalk('clear','empty')
                    .setTalk('waiting').talk();

                return false;
            }else{
                this.Assistant.reset().setTalk('clear','conf').talk();
                this.confirmPanel.setAttribute('data-effect', 'fadeIn');//確認出す
                this.confirmPanel.setAttribute('data-title', 'Clear Confirm');

                this.confirmPanel.setAttribute('data-action', 'clear');//アクションセット
                this.commandPanel.setAttribute('data-effect', 'fadeOut');//コマンド隠す
            }
        },

        /**
         * 全消し処理
         */
        clear:function(ans, id){

            if(toDoll.busy){
                return false;
            }

            if(ans === "yes"){//する
                var count = this.Todo.getIndex();
                var that = this;

                this.Assistant.reset()
                    .setTalk('clear','before')
                    .setTalk('clear','after');

                this.Assistant.setTalk('waiting').talk();

                toDoll.busy = setTimeout(function(){
                    that.Todo.clear();
                    toDoll.busy = null;
                    toDoll.todo = [];
                    that.container.empty();//画面に表示しているリストを削除
                    $('container').removeClass('showTodo');
                }, 5000);

                return this.confirm(null);

            }else{//そのほかの答え
                return this.confirm(ans);
            }
        },


        /**
         * ToDo削除確認
         * @param id
         */
        removeConf:function(param, id){

            this.container.getElement('#todoitem-' + id ).addClass('remove');

            this.Assistant.reset()
                .setTalk('remove', 'conf')
                .talk();

            this.confirmPanel.setAttribute('data-action', 'remove');
            this.confirmPanel.setAttribute('data-title', 'Remove Confirm');

            this.removeCheckedToDo.push(id);

            //TODO フォームとコマンドどちらも表示されている可能性がある。けど(゚ε゚)キニシナイ!!
            //this.addFormPanel.getAttribute('data-effect');
           //this.commandPanel.getAttribute('data-effect');

            this.confirmPanel.setAttribute('data-effect', 'fadeIn');//確認出す
            this.commandPanel.setAttribute('data-effect', 'fadeOut');//コマンド隠す
            this.addFormPanel.setAttribute('data-effect', 'fadeOut');//フォーム隠す
        },
        
        /**
         * ToDo削除処理
         */
        removeToDo:function(data){
        	var l, i=0;
        	
        	if(!this.removeCheckedToDo.length){
        		return data;
        	}
        	
        	var id = this.removeCheckedToDo.shift();
               		
           //該当するデータを検索
           for (l = data.length; i < l; i++) {
               if (data[i].tid == id) {
                    data.splice(i,1);
               		return this.removeToDo(data);
               }
           }
        	
        },
        

       /**
        * ToDo削除
        * IDはthis.removeCheckedToDoの中に配列で
        * @param {string} ans confirmの答え
        */
        remove: function(ans) {
           var data;
           var count = this.Todo.getIndex();
           var that = this;
           
           if(ans === "yes"){
               this.Assistant.reset()
                   .setTalk('remove','before').setTalk('remove','after')
                   .setTalk('waiting').talk();

               data = this.removeToDo(this.Todo.getData());
               
               //データを保存
               this.Todo.setData(data);
               this.removeCheckedToDo = [];

               if(data.length === 0){
                   $('container').removeClass('showTodo');
               }

               //全部コンプしてたときの台詞
               if(this.Todo.isFullComplete()){
                   this.Assistant.setTalk('complete', 'fullcomp_random');
               }

               this.reflesh(true);

               return this.confirm(null);

           }else{

               return this.confirm(ans);
           }

        },


        /**
         * 確認
         * @param ans
         */
        confirm:function(ans){

            switch(ans){

                case 'no'://やめる
                    this.Assistant.reset().setTalk('confirm','cancel').setTalk('waiting').talk();
                    this.confirm(null);
                    return;
                    break;

                case 'well'://焦らす
                    toDoll.wellCount++; //焦らしカウントアップ

                    if(toDoll.wellCount > 3 || toDoll.wellLimit){//仏の顔も3度までって言うじゃん?
                        return  this.clear('deny');

                    }else{
                        var data = this.Assistant.getTalk('confirm', 'well');
                        var last = data.getLast();
                        last.callback = function(){ toDoll.welLimit = true; };
                        data.push(last);

                        this.Assistant.reset().setTalk(data).talk();
                    }

                    return;
                    break;

                case 'deny'://嫌がる
                    this.Assistant.reset().setTalk('confirm','deny').setTalk('waiting').talk();
                    this.confirm(null);
                    break;

                default:

                    this.commandPanel.setAttribute('data-effect', 'fadeIn');//コマンド出す
                    this.confirmPanel.setAttribute('data-effect', 'fadeOut');//確認隠す

                    break;
            }
        },

        /**
         * ToDoを変更するフォーム
         *
         */
        createChangeForm: function(  element ) {
			var that = this;
            var id = element.getAttribute('data-tid');
            var input = new Element('input', {'type': 'text',
                'value': element.get('text'),
                'id':'edit-todo-'+id,
                'data-tid':id,
                'class':'editTodoItem',
                'events':{
                    'keydown':function(e){
                        if(e.code === 13){
                               that.editEnter(null, this.getAttribute('data-tid'));
                        }
                    }
                }});

            element.empty().grab(input);
            input.focus();
            element.getParent().addClass('edit');
        },

        /**
         * ToDoを変更するフォーム隠す
         * @param id
         */
        hideChangeForm:function( id ){

            var todoitem = $('todoitem-' + id);
            var input = todoitem.getElement('.editTodoItem');
            todoitem.getElement('.todoTxtItem').set('html', input.value);
            todoitem.removeClass('edit');
        },

        /**
         * 編集
         * @param _ans
         * @param id
         */
        editEnter:function(_ans, id){
            var data= this.Todo.getData(Number(id));//データを取得
            var parent = $('todoitem-' + id);
            var editForm =  parent.getElement('.editTodoItem');
            var text = editForm.value;
            var check = this.Assistant.validation(text);

            this.Assistant.reset();

            if(check.length > 0){
                this.Assistant.setTalk('validation', check.shift())
                                    .setTalk('edit', 'waiting')
                                    .talk();
                this.editForm.value = '';
                return false;
            }

            data.txt = text;

            this.Assistant.setTalk('edit', 'execute_random').setTalk('waiting').talk();
            editForm.value = '';

            this.Todo.setData(data, Number(id));//保存

            this.reflesh(true);

        },

        /**
         * 編集キャンセル
         * @param _ans {undefined}
         * @param id {string}
         */
        editCancel:function(_ans, id){
            this.Assistant.reset().setTalk('edit','cancel').talk();
            this.hideChangeForm(id);
        }

	});

	win.toDoll = toDoll;
})(window, document.id);


(function(win, $) {

	var toDoll = win.toDoll;
	toDoll.enable = false;

	var images = ['amazed', 'angry', 'bashful', 'cry', 'happy', 'joy', 'normal', 'sad', 'scornful', 'shy', 'surprise', 'trouble'];

	window.addEvents({
		'load' : function() {
			document.body.addClass(Browser.name);
		},
		'domready' : function() {
			if(supportCheck()) {
				$('support-check-result').empty();
				execute();
			}
		},
		'resize' : function() {
			if(supportCheck()) {
				$('support-check-result').empty();
				
				if(!toDoll.enable) {
					execute();
				}
			}
		}
	});

	function supportCheck() {

		if(!!!Browser.safari && !!!Browser.chrome) {
			$('container').addClass('supportCheckAlert');
			$('support-check-result').set('html', 'Chrome または Safari でご覧下さい');
			
			if(!toDoll.enable) {
				$('todoBox').addClass('hide');
				$('user').addClass('hide');
				$('container')
				$('assistant-speech-baloon').set('text', '対応してないんだって');
			}

			return false;
		}
		
		if(window.innerWidth < 800 || window.innerHeight < 500) {
			$('container').addClass('supportCheckAlert');
			
			$('support-check-result').set('html', '横800px 縦500px以上の広さが必要です。<br>(900 x 500px以上推奨)');

			if(!toDoll.enable) {
				$('todoBox').addClass('hide');
				$('user').addClass('hide');
				$('container')
				$('assistant-speech-baloon').set('text', 'もうちょっと離れてくれる?');
			}

			return false;

		}
		
		$('container').removeClass('supportCheckAlert');
		
		return true;

	};

	function execute() {

		toDoll.enable = true;
		$('container').addClass('enable');
		
		$('todoBox').removeClass('hide');
		$('user').removeClass('hide');

		images.each(function(img) {
			new Image().src = 'http://webtecnote.com/jsdoit/todoll/img/jk/' + img + '.png';
		});

		win.addEvents({
			'domready' : function() {

				var Controller = new toDoll.Controller({
                    assistantOptions:{
                        scenario:'./zqR4/js'
                    }
                });

				$('add-form').addEvent('submit', function(e) {
					e.stop();
					Controller.addEnter();
					return false;
				});
				/**
				 * ボタンクリックDelegate
				 * data-action="methodName" data-tid="todoId" data-param="parametor"
				 */
				document.addEvent('click:relay(button)', function(event, target) {
					event.preventDefault();
					var action = target.getAttribute('data-action') || target.getParent().getAttribute('data-action');
					var tid = target.getAttribute('data-tid') || target.getParent().getAttribute('data-tid');
					//ToDoのID
					var param = target.getAttribute('data-param');

					if(!!Controller[action]) {
						if(param === 'well' && toDoll.welLimit) {
							Controller[action]('deny');
						} else {
							Controller[action](param, tid);
						}
					}

				});
			}
		});
	}

})(window, document.id);
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer