/*
    Modified by KAYAC Inc. (Safari, restrict element)
    // ==UserScript==
    // @name            url_breaker+
    // @namespace       http://piro.sakura.ne.jp/
    // @description     URL Breaker Modified Version
    // @include         *
    // ==/UserScript==
    Original Script:
        url_breaker (made by asukaze)
        http://www.asukaze.net/soft/url_breaker/url_breaker.user.js
*/

(function () {
    if (window.opera || !document.addEventListener) return;

    // 改行したいクラスを全て指定
    var classes = ["break", "foo", "bar"];

    // 改行したくない要素を指定
    var exclude = "title style script textarea map";

    var pred   = [];
    for (var i = 0; i < classes.length; i++) {
        pred.push('ancestor-or-self::*[contains(concat(" ", @class, " "), " '+classes[i]+' ")]');
    }

    var handler = function () { try {
        var resolver = document.createNSResolver(document.documentElement);
        var nodes = document.evaluate(
            '/descendant::*[not(contains(" ' + exclude.toUpperCase() +  ' ", concat(" ", local-name(), " "))) and ('+pred.join(" or ")+')]/child::text()',
            document.documentElement,
            resolver,
            XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
            null
        );
        //    var regexp = new RegExp("([!-%'-/:=\\?@\\[-`\\{-~]|&amp;)");
        var regexp = new RegExp("([!-%'\\)-/:=\\?@\\\\-`\\|-~]|&amp;)");
        var range  = document.createRange();
        var wbr    = document.createElement('wbr');
        var lastIndex;
        var node;
        for (var i = 0; i < nodes.snapshotLength; i++)    {
            node = nodes.snapshotItem(i);
            range.selectNode(node);
            while (node && (lastIndex = range.toString().search(regexp)) > -1) {
                range  = document.createRange();
                range.setStart(node, lastIndex+RegExp.$1.length);
                range.insertNode(wbr.cloneNode(true));
                node = node.nextSibling.nextSibling;
                range.selectNode(node);
            }
        }
        range.detach();
    } catch (e) { if (window.console) console.log(e) } };

    if (/Safari/.test(navigator.userAgent)) {
        window.addEventListener("load", handler, false);
    } else {
        document.addEventListener("DOMContentLoaded", handler, false);
    }
})();

