/**
 * 外部サイトの新着情報を取得して整形し、ページ内に取り込むスクリプト。
 * 外部サイトのデータは通常はXMLHttpRequestで取得できないので、プロキシ用の
 * PHPスクリプトとセットで使用してください。
 *
 * @created 2010-04-13
 * @modified 2011-01-22
 * @author Anchor Technology, Inc.
 */

var PROXY_URL = "/php/proxy.php?url=";
var INCLUDE_POS = "#newslist";

var intervalId;
var aggregatedCounter = 0;
var newsArray = new Array();
var sitesCount = Object();
var sites = [
    {
        name: "くるめ",
        url: "www.ja-kurume.or.jp",
        enc: "UTF-8",
        handler: function(data) {
			count();
            $(data).find("table.index-news-table tr").each(function(index) {
				var url = sites[0].url;
				if (sitesCount[url] > 2) return;

                var date = $(this).find("th").text();
				if (!$.browser.msie && !$.browser.version <= 7) {
					if (date.trim().length == 0) return;
				}
				
                var dateString = formatDateString(date, "(.+)年(.+)月(.+)日");
                var text = $(this).find("td");
                text.find("img").remove();
                text.children("a").andSelf().each(function() { adjustLink(this, url); });
                newsArray.push({date: dateString, text: text, name: "くるめ", url: url});
				
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
            });
        }
    },
    {
        name: "筑紫",
        url: "www.ja-chikushi.or.jp",
        enc: "Windows-31J",
        handler: function(data) {
			count();
            $(data).find("#info li").each(function(index) {
				var url = sites[1].url;
				if (sitesCount[url] > 2) return;

                var text = $(this).find(".style11");
                text.children("a").andSelf().each(function() { adjustLink(this, url); });
                var date = $(this);
                date.find(".style10,.style11").remove();
                var dateString = formatDateString(date.text(), "(.+)/(.+)/(.+)");
                newsArray.push({date: dateString, text: text, name: "筑紫", url: url});
				
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
            });
        }
    },
    {
        name: "粕屋",
        url: "www.ja-kasuya.or.jp",
        enc: "UTF-8",
        handler: function(data) {
			count();
            $(data).find("#news li").each(function(index) {
                var url = sites[2].url;
				if (sitesCount[url] > 2) return;

                var date = $(this).find(".date").text();
                var dateString = formatDateString(date, '(\\d+)\\.(\\d+)\\.(\\d+)');
                var text = $(this).find(".title");
                text.children("a").andSelf().each(function() { adjustLink(this, url); });
                newsArray.push({date: dateString, text: text, name: "粕屋", url: url});
				
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
            });
        }
    },
    {
        name: "糸島",
        url: "www.ja-itoshima.or.jp",
        enc: "UTF-8",
        handler: function(data) {
			count();
            $(data).find("#whatsnews dl").each(function(index) {
				var url = sites[3].url;
				if (sitesCount[url] > 2) return;

				var date = $(this).find("dt").text();
				var dateString = formatDateString(date, '(\\d+)\\.(\\d+)\\.(\\d+)');
                var text = $(this).find("dd");
                text.find("br").remove();
                text.children("a").andSelf().each(function() { adjustLink(this, url); });
                newsArray.push({date: dateString, text: text, name: "糸島", url: url});
				
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
            });
        }
    },
    {
        name: "むなかた",
        url: "www.ja-munakata.or.jp",
        enc: "Shift_JIS",
        handler: function(data) {
			count();
            $(data).find("#part_update dt").each(function(index) {
				var url = sites[4].url;
				if (sitesCount[url] > 2) return;

                var date = $(this).html();
                var dateString = formatDateString(date, '(\\d+)\\.(\\d+)\\.(\\d+)');
                var text = $(this).next();
                text.children("a").andSelf().each(function() { adjustLink(this, url); });
                newsArray.push({date: dateString, text: text, name: "むなかた", url: url});
				
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
            });
        }
    },
	{
        name: "みなみ筑後",
        url: "www.minamickg-fk-ja.or.jp",
        enc: "Shift_JIS",
        handler: function(data) {
			count();
            $(data).find("table[width='100%']>tbody>tr>td:has(a)").each(function(index) {
				var url = sites[5].url;
				if (sitesCount[url] > 2) return;
                var dateString = "";
                var text = $(this);
				if (text.find("img").length > 0) return;
				
                text.children("a").andSelf().each(function() { adjustLink(this, url); });
                newsArray.push({date: dateString, text: text, name: "みなみ筑後", url: url});
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
            });
        }
    },
	{
		name: "直鞍",
		url: "www.ja-chokuan.or.jp/topics.php",
		enc: "Shift_JIS",
		handler: function(data) {
			count();
			$(data).find("tr").each(function(index) {
				var url = sites[6].url;
				if (sitesCount[url] > 2) return;
				
				// 日付
				var dateElm = $(this).find("td:first").text();
				var dateStr = formatDateString(dateElm, "(.+)/(.+)/(.+)");
				// タイトル
				var titleElm = $(this).find("td:eq(1) p");
				titleElm.children("a").andSelf().each(function() { adjustLink(this, "www.ja-chokuan.or.jp"); });
				newsArray.push({date: dateStr, text: titleElm, name: "直鞍", url: url});
				
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
			});
		}
	},
	{
		name: "ふくおか嘉穂",
		url: "www.ja-f-kaho.or.jp/main.html",
		enc: "Shift_JIS",
		handler: function(data) {
			count();
			$(data).find("table:eq(3) td[height=26]").each(function(index) {
				var url = sites[7].url;
				if (sitesCount[url] > 2) return;
				
				var titleElm = $(this).each(function() { adjustLink(this, "www.ja-f-kaho.or.jp");});
				titleElm.contents().filter(function() { return this.nodeType != 1; }).remove();
				newsArray.push({date: "", text: titleElm, name: "ふくおか嘉穂", url: url});
				
				if (isNaN(sitesCount[url])) sitesCount[url] = 0;
				sitesCount[url]++;
			});
		}
	}
];

// 起動トリガー
$(function() {
    for (var i = 0;i < sites.length; i++) {
        var params = {url: sites[i].url, enc: sites[i].enc};
        $.get(PROXY_URL, params, sites[i].handler);
    }
    intervalId = setInterval(viewNews, 100);
});

/**
 * 全てのサイトが処理終了していたら、ニュースの配列をDOMに組み込む。
 */
function viewNews() {
    if (aggregatedCounter == sites.length) {
        clearInterval(intervalId);
        newsArray.sort(function(a, b) {
            return a.date < b.date ? 1 : -1;
        });
        for (var i = 0; i < newsArray.length; i++) {
            var date = newsArray[i].date;
            var text = newsArray[i].text;
            var name = newsArray[i].name;
            $(INCLUDE_POS).append("<li>" + date + "&nbsp;" + text.html() + "［" + name + "］</li>");
        }
    }
}

/**
 * 渡された要素中のa要素の属性を変更する。
 * 外部サイトではリンクをドキュメント相対パスで記入しているため。
 */
function adjustLink(elm, url) {
    if ($(elm).find("a").length == 0) return;

	$(elm).find("a").each(
		function() {
			var a = $(this);
			var href = a.attr("href");
			var adjusted;
			
			//alert(href+" > "+a.attr("hostname")+" : "+href.indexOf("http")+ " : "+href.indexOf("/"));
			var linkHostname = a.attr("hostname");
			var localHostname = location.hostname;
			if ($.browser.msie && $.browser.version <= 7) {
				// もともと絶対パスで書かれているリンクはそのまま使う
				if (linkHostname != localHostname) {
					adjusted = href;
				} else {
					adjusted = "http://" + url + (a.attr("pathname").lastIndexOf("/", 0) != 0 ? "/" : "") + a.attr("pathname");
				}
				if (a.attr("hash")) {
					adjusted += a.attr("hash");
				}
			} else if (a.attr("hostname") != url && href.indexOf("http") != 0 && href.indexOf("/") != 0) {
				var protocol = ($.browser.msie) ? "http:" : a.attr("protocol");
				adjusted = protocol + "//" + url + (a.attr("pathname").lastIndexOf("/", 0) != 0 ? "/" : "") + a.attr("pathname");
				if (a.attr("hash")) {
					adjusted += a.attr("hash");
				}
			} else {
				adjusted = href;
			}
			a.attr("href", adjusted);
			a.attr("target", "_blank");
		}
	);
}


/**
 * 収集処理をカウントする。
 */
function count() {
    aggregatedCounter++;
}

/**
 * 全角英数記号を半角の英数記号に変換する。
 */
function z2h(val){
    if (typeof(val) != "string") return false;

    var han= '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@-.,: ';
    var zen= '１２３４５６７８９０ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ＠－．，：　';
    for(i = 0; i < zen.length; i++){
        var regex = new RegExp(zen[i], "gm");
        val = val.replace(regex,han[i]);
    }
    return val;
}

/**
 * 文字列が指定した長さになるように、先頭をゼロで埋める。
 * sprintf関数が無いので簡易的に実装。
 */
function fill(val, len) {
    while (val.length < len) {
        val = "0" + val;
    }
    return val;
}

/**
 * 日付文字列を別の形式に整形する。元の文字列での区切り文字列は何でも良いが、年月日の順に並んでいる必要がある。
 */
function formatDateString(str, patt) {
    if ($.browser.msie && $.browser.version <= 7) return str;
    str = z2h(str);
    str = $.trim(str);
    str.match(patt);
    dateStrings = [RegExp.$1.substr(2), fill(RegExp.$2, 2), fill(RegExp.$3, 2)];

    return dateStrings.join("/");
}


