/**
 * Add link to google maps japan on address-like texts
 * @param node optional (document.body)
 * @return links
 *
 * @version 20070304
 * @see http://nonn-et-twk.net/twk/
 * @see http://d.hatena.ne.jp/shinichitomita/20060713/1152800000
 *
 * some changed by http://itami.info 20080429
 * class='gmaplink'
 */


// initialize 
window.onload = function (){
  var WHITESPACE_ex = /[\s　:：()\[\]［］「」（）、。]/.source;
  var NO_WHITESPACE_ex = /[^\s　:：()\[\]［］「」（）、。]/.source;

  var TODOFUKEN_ex = /(?:東京都|北海道|(?:大阪|京都)府|(?:神奈川|和歌山|鹿児島|.{2})県)(?![\d０-９])/.source;
  var CITY_SEPARATE_CHAR_ex = new RegExp('(?:^|' + WHITESPACE_ex + ')').source;
  var SHICHOSON_ex = new RegExp(NO_WHITESPACE_ex + '{1,4}[郡市区]').source;
  var AZA_ex = NO_WHITESPACE_ex + '{1,20}';
  var BANCHI_ex = /[\d０-９]/.source + '{1,8}'; // 一二三四五六七八九十東西南北無ABC
  var KYOTO_ex = /京都[府市][^\s]{6,20}(?:[上下][るル])?(?:(?:東入|西入)?[るル]?|入中)/.source;

  var PRE_WHITESPACES_re = new RegExp('^' + WHITESPACE_ex + '+(.*)$');
  var BUILDING1_re = /^[^\d０-９]+[\d０-９]+(?:(?:[-―－ー]|丁目|番地?|号)[\d０-９]+)+/;
  var BUILDING2_re = /^(.*(?:丁目|番地?|号))[^地\d０-９]+(?:ビル|$)/;
  AddressLink.re = {
	general: new RegExp(
		'(?:' + TODOFUKEN_ex + '|' + CITY_SEPARATE_CHAR_ex + SHICHOSON_ex + ')' + '[ \t　]*' +
		'(?:' + AZA_ex + '[ \t　]*' +
			'(?:' + BANCHI_ex + '(?:丁目|番地?|号)?[-―－ー]?' + '){1,8}' +
			')' +
		'|' + KYOTO_ex
	)
	, prews: PRE_WHITESPACES_re
	, building1: BUILDING1_re
	, building2: BUILDING2_re
	};
//  prompt('',AddressLink.re.prews.source);
AddressLink();
}



function AddressLink(node) {
	if (!node) node = document.body;
	if (isNaN(arguments.callee.count)) arguments.callee.count = 0;
	var NODE_TYPE = {TAG:1, TEXT:3};

	var splitNodeNum = 0;
	if (node.nodeType == NODE_TYPE.TAG && node.childNodes)
	{
		var childNodes = node.childNodes;
		for (var i = 0; i < childNodes.length; ++i)
			i += arguments.callee(childNodes[i]);
	}
	else if (node.nodeType == NODE_TYPE.TEXT)
	{
		var text = node.data;
		var re = arguments.callee.re;
		var matched = text.match(re.general);
		if (matched)
		{
			var m = matched[0];
			var ws = m.match(re.prews);
			if (ws)
				m = ws[1];
			// remove building names since google maps rarely recognize them
			var building = m.match(re.building1);
			if (building)
				m = building[0];
			var building2 = m.match(re.building2);
			if (building2)
				m = building2[1];

			// split at first matched place
			var matchedNode = node.splitText(text.indexOf(m));
			MakeLink(matchedNode, m);

			++splitNodeNum;
			++arguments.callee.count;
		}
	}
	return splitNodeNum;

	function MakeLink(matchedNode, matchedText)
	{
		matchedNode.splitText(matchedText.length);
		var anchorNode = document.createElement('A');
		anchorNode.className= 'gmaplink'; 
		anchorNode.title = 'Googleマップ';
		anchorNode.href = 'http://maps.google.co.jp/?hl=ja&q='
			+ encodeURI(matchedNode.data.replace(/[\s　:：、。]/, ''));
		anchorNode.appendChild(matchedNode.cloneNode(true));
		matchedNode.parentNode.replaceChild(anchorNode, matchedNode);
	}
} // AddressLink
