(function() {

if(typeof TSPBM11 == 'undefined') window.TSPBM11 = {};
TSPBM11.hilightWord = function(node, chr) {
    if(!node) return;
    if(node.hasChildNodes) {
        for(var i = 0, l = node.childNodes.length; i < l; i++) {
            arguments.callee(node.childNodes[i], chr);
        }
    }
    if(node.nodeType != 3) return;
    var value = node.nodeValue;
    if(value.indexOf(chr) == -1) return;
    var parent = node.parentNode;
    var mchr = '<span id="tospoword" style="margin:0;padding:0;">'+chr+'</span>';
    var reg = new RegExp(chr, 'g');
    parent.innerHTML = parent.innerHTML.replace(reg, mchr);
};

TSPBM11.analyzeThis = function(word) {
    var body = document.getElementsByTagName('body')[0];
    TSPBM11.hilightWord(body, word);
};

TSPBM11.partsShowedWordAt = function(at) {
	var	tspword = document.getElementById('tospoword');
	var	nvalue = tspword.childNodes[at - 1].nodeValue;
	var	chr = nvalue.charAt(0);
	var chr_style = 'margin:0;padding:0;background-color:#FF0000;color:#FFFF00;font-size:1.3em';
    var mchr = '<span class="tospoword-inner" style="'+chr_style+'">'+chr+'</span>';
    var reg = new RegExp(chr);
    var span = (function() {
        var m = tspword.innerHTML.match(/<span(.*)>/);
        return m ? '<span' + m[1] + '>' : '';
    })();
    tspword.innerHTML = span + nvalue.replace(reg, mchr);
};

// internal functions below

var tsp_getMovie = function(name) {
    if(navigator.appName.indexOf('Microsoft') != -1) {
        return window[name];
    }
    else {
        return document[name];
    }
};

var tsp_attachOnLoad = function(fn) {
    window.addEventListener
      ? window.addEventListener('load', fn, false)
      : window.attachEvent('onload', fn);
};

var tsp_innerText = function(node) {
    return (typeof node.innerText == 'undefined')
        ? node.textContent
        : node.innerText;
};

var tsp_filter = function(list, callback) {
    var new_list = [];
    for (var i = 0, l = list.length; i < l; i++) {
        if (callback(list[i])) {
            new_list.push(list[i]);
        }
    }
    return new_list;
};

var tsp_each = function(list, callback) {
    for (var i = 0, l = list.length; i < l; i++) {
        callback(i, list[i]);
    }
};

var $tsp_tn = function (name, node) {
    if (!node) node = document;
    return node.getElementsByTagName(name);
};

var sentence_ends = [
    'です', 'ます', 'である', 'だ', 'だね', 'だよ', 'だよね', 'だもん', 'かな'
];

var delimiters = ['。', '、', '・', '\n', '！', '？', '♪', '，', '．', '〜'];
var dlmt_reg = new RegExp('['+delimiters.join('')+']');

// via http://blog.katsuma.tv/2009/01/flash_player_version_by_js.html
var FlashPlayer = {
   version : (function(){
      var version='0.0.0';
      if(navigator.plugins && navigator.mimeTypes['application/x-shockwave-flash']){
         var plugin=navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin;
         if (plugin && plugin.description) {
            version=plugin.description.replace(/^[A-Za-z\s]+/, '').replace(/(\s+r|\s+b[0-9]+)/, ".");
         }
      } else { // Win IE
         var x='';
         try {
            var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
            x=axo.GetVariable("$version");
         } catch(e) {
            try {
               axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
               x="WIN 6,0,21,0";
               axo.AllowScriptAccess="always";
               x=axo.GetVariable("$version");
            } catch(e) {
               if (!x.match(/^WIN/)) {
                  try {
                     axo=null;
                     axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
                     x=axo.GetVariable("$version");
                  } catch(e) {
                     if (axo) {
                        x="WIN 3,0,18,0";
                     } else {
                        try {
                           axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                           x="WIN 2,0,0,11";
                        } catch(e) {
                           x="WIN 0,0,0,0";
                        }
                     }
                  }
               }
            }
         }
         version=x.replace(/^WIN /,'').replace(/,[0-9]+$/,'').replace(/,/g,'.');
      }

      if (version.match(/^[0-9]+\.[0-9]+\.[0-9]+$/)) {
         return version;
      } else {
         return '0.0.0';
      }
   })()
};


// onload event handler
tsp_attachOnLoad(function() {

    var lines = tsp_innerText(document.body).split("\n");
        lines = tsp_filter(lines, function(l) { return !!l; });

    var quotes = lines.join('').replace(/(\r)?\n/g, '').match(/「(.*?)」/g);
    if(quotes !== null) {
        tsp_each(quotes, function(qi, qt) { lines.push(qt.replace(/[「」]/g, '')); });
    }

    var topic_list = [];
    tsp_each(sentence_ends, function (si, sv) {
        var r = new RegExp(sv + '(|'+delimiters.join('|')+')');
        var matched = tsp_filter(lines, function(l) { return l.match(r); });
        tsp_each(matched, function(mi, mv) {
            var e = mv.split(dlmt_reg)[0]
                .replace(/[(（](.*?)[)）]/g, '')
                .replace(/^\t+/, '')
                .replace(/^\s+/, '');
            if(e.length > 5 && e.length <= 12)
                topic_list.push(e);
        });
    });

    var topic_size = topic_list.length;
    var sentence = topic_list[parseInt(Math.random() * topic_size)];
    if (!sentence) sentence = '見出しが見つからない';
    TSPBM11.analyzeThis(sentence);

    window.partsShowedWordAt = function(index) {
        TSPBM11.partsShowedWordAt(index);
    };

    var script = tsp_filter($tsp_tn('script'), function(s) {
        return s.src.match(/^http:\/\/tospo\.blogdeco\.jp/);
    })[0];
    var flversion = FlashPlayer.version;
    var node = {};
    var	beacon = (function() {
		var span = document.createElement('span');
        span.innerHTML = '<img src="http://log.kayac.com/cl/?rs=i&cm=blogdeco00081&ln=1" width="1" height="1">';
        return span.getElementsByTagName('img')[0];
	} )();
    if (flversion >= '10.0.0') {
        var span = document.createElement('span');
        span.innerHTML = [
            '<embed id="externalTSPBM11" name="externalTSPBM11"',
            ' quality="high" bgcolor="#FFFFFF" style="" width="155" height="380"',
            ' allowScriptAccess="always"',
            ' flashvars="sentence='+sentence+'"',
            ' src="http://tospo.blogdeco.jp/swf/tospo_bp.swf"',
            ' type="application/x-shockwave-flash" />'
        ].join('');
        node = $tsp_tn('embed', span)[0];
    }
    else {
        node = document.createElement('a');
        node.href = 'http://www.adobe.com/go/getflashplayer';
        node.innerHTML = '※このブログパーツの実行にはAdobe FlashPlayer10が必要です';
    }
    script.parentNode.insertBefore(node, script);
    script.parentNode.insertBefore(beacon, script);
});

})();
