// --------------------------------------------------------------------
// Author  : mashimonator
// Create  : 2009/11/14
// Update  : 2009/11/14
// Description : ブロック要素内のURLや半角英数字の長文を改行する
// --------------------------------------------------------------------

/*@cc_on 
var doc = document;
eval('var document = doc');
@*/
var wordBreak = {
	//-----------------------------------------
	// 設定値
	//-----------------------------------------
	conf : {
		targetClass : 'wordBreak'
	},
	//-----------------------------------------
	// 初期処理
	//-----------------------------------------
	init : function() {
		if ( wordBreak.isIE() ) {
			// --- for IE
			wordBreak.addCssRule('.'+wordBreak.conf.targetClass, 'word-break:break-all;');
		} else {
			var elm = wordBreak.getTargetElementsByClassName( wordBreak.conf.targetClass );
			if ( wordBreak.isFirefox2() ) {
				// --- for Firefox2
				for ( var i = 0, len = elm.length; i < len; i++ ) {
					wordBreak.insertBreak(elm[i], '<wbr />');
				}
			} else {
				// --- for other browser
				for ( var i = 0, len = elm.length; i < len; i++ ) {
					wordBreak.insertBreak(elm[i], String.fromCharCode(8203));
					//wordBreak.insertBreak(elm[i], '&shy;');
				}
			}
		}
	},
	//-----------------------------------------
	// 改行メイン処理
	//-----------------------------------------
	insertBreak : function( element, insertStr ) {
		var text = element.innerHTML;
		text = text.replace(/<br \/>\n/gi, '\n');
		text = text.replace(/<br>\n/gi, '\n');
		text = text.replace(/<br \/>/gi, '\n');
		text = text.replace(/<br>/gi, '\n');
		text = text.split('').join(insertStr);
		text = text.replace(/\n\s/ ,'\n');
		element.innerHTML = text.replace(/\n/g, '<br />\n');
	},
	//-----------------------------------------
	// スタイルシートに規則を追加する
	//-----------------------------------------
	addCssRule : function ( selector, declarations ) {
		var sheets = document.styleSheets;
		if ( sheets ) {
			if ( sheets.length < 1 ) {
				// 外部読み込みのスタイルシートが無い場合
				var style = document.createElement('style');
				style.setAttribute('type', 'text/css');
				style.innerHTML += selector + '{' + declarations + '}';
				var head = document.getElementsByTagName('HEAD');
				head[0].appendChild(style);
			} else {
				// 一番最後のスタイルシートを取得
				var tSheet = sheets[sheets.length-1];
				if ( document.all ) {
					// iIndexは省略可。省略するとスタイルシートの最後に追加
					tSheet.addRule( selector, declarations );
				} else {
					// ruleはセレクタと宣言ブロック。被挿入規則のインデックスが返る
					tSheet.insertRule( selector + '{' + declarations + '}', tSheet.cssRules.length );
				}
			}
		}
	},
	//-----------------------------------------
	// IE判定
	//-----------------------------------------
	isIE : function() {
		return IE='\v'=='v';
	},
	//-----------------------------------------
	// Firefox2判定
	//-----------------------------------------
	isFirefox2 : function() {
		FF2=(function x(){})[-6]=='x';
		if ( FF2 ) {
			return true;
		} else {
			return false;
		}
	},
	//-----------------------------------------
	// ターゲットタグをClass名から取得する
	//-----------------------------------------
	getTargetElementsByClassName : function( cls ) {
		var elements = new Array();
		if ( document.evaluate ) {
			var xpathExpression = '/descendant::*[contains(@class,"'+ cls + '")]';
			//var xpathExpression = '/descendant::*[@class="'+ cls + '"]';
			var iterator = document.evaluate(xpathExpression, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
			for (var i = 0, len = iterator.snapshotLength; i < len; i++) {
				var elm = iterator.snapshotItem(i);
				elements[elements.length] = elm;
			}
		} else {
			var nodes = document.all ? document.all : document.getElementsByTagName('*');
			for (var i = 0, len = nodes.length; i < len; i++) {
				var elm = nodes.item(i);
				if ( elm.className.match(cls) ) {
					elements[elements.length] = elm;
				}
			}
		}
		return elements;
	},
	//-----------------------------------------
	// イベントに関数を付加する
	//-----------------------------------------
	addEvent : function( target, event, func ) {
		try {
			target.addEventListener(event, func, false);
		} catch (e) {
			target.attachEvent('on' + event, (function(el){return function(){func.call(el);};})(target));
		}
	}
}
// 実行
wordBreak.addEvent( window, 'load', wordBreak.init );
