/*
 *  Adview JavaScript: For N@VEL Advertisement Auot-updating System
 *  (c) 2006 ISHIHARA Yoshinori yoshinori@ishihara.ne.jp
 */

var AdviewJavaScript = {
    Version: '0.01'
}

// 自動更新用イベント生成オブジェクト
var periodicalExecuter;

// 更新間隔時間(秒)
var intervalTime = 6;

function setIntervalTime(second) {
    if (second.match(/^\d+$/))	
        intervalTime = second;
}

// 広告最大掲載数
var adMax = 5;

function setAdMax(num) {
    if (num.match(/^\d+$/))	
	adMax = num;
}

// テストモード
var testMode = false;

function toggleTestMode() {
	testMode = testMode ? false : true;
}

// 広告データ取得URL
var adUrl = 'http://www.ishihara.ne.jp/sample/get_addata.cgi';

function setUrl(url){
	adUrl = url;
}

// 常駐して、広告の自動更新を行う
function adListener() {
	periodicalExecuter = new PeriodicalExecuter(reqAddata, intervalTime);
	updateShowParams();
}

// 自動更新のリスタート
function restartAdListener() {
	periodicalExecuter.clearTimerEvent();
	periodicalExecuter = new PeriodicalExecuter(reqAddata, intervalTime);
	updateShowParams();
}

// テスト用コールバック関数
function writeDate() {
	var adContents = $('adContents');
	var date = new Date();
	adContents.innerHTML = date.toLocaleString();
}

// 広告データをサーバにリクエスト
function reqAddata() {
	var pars = createReqParams();
	var myAjax = new Ajax.Request(adUrl,
		                          {
									  method: 'get',
									  parameters: pars,
									  onComplete: setAddata
								  });
}

// リクエストパラメータ作成
function createReqParams() {
	// 掲載広告数、広告IDの取得
	var nodes = document.getElementsByClassName('adOne', 'adContents');
	var adNum = 0;
	var adIds;
	if (nodes){
		adNum =  nodes.length;
		for (var i = 0; i < nodes.length; i++){
			if (i > 0){
				adIds += ("," + nodes[i].id);
			}else{
				adIds = nodes[i].id;
			}
		}
	}
	var ret = 'adnum=' + adNum + '&admax=' + adMax
		    + '&interval=' + intervalTime;
	if (adIds) { ret += ('&adids=' + adIds) }
	if (testMode) { ret += '&testmode=1'; }
	return ret;
}

// サーバから返答を取得し、広告を更新
function setAddata(httpRes) {
	// 新規広告の追加
	var html = filterResponse(httpRes.responseText);
	new Insertion.Top('adContents', html);

	// 既存広告の削除
	var adContents = $('adContents');
    var nodes = document.getElementsByClassName('adOne', 'adContents');
	while (nodes.length > adMax) {
		var node = nodes[nodes.length - 1];
		adContents.removeChild(node);
		nodes = document.getElementsByClassName('adOne', 'adContents');
	}
}

// サーバからの返答で制御部を解釈して、取り除く
function filterResponse(text) {
	// RegExp.multiline = true;
    // MacのSafari,FireFox共に複数行モードが正しく動作しない
    // 仕方がないので、改行を取り除いて、１行にしてから、マッチチング
	var tmp = text.replace(/\n|\r/gi, "");
	var str = tmp.replace(/<\?xml.+\?>/i, "");
	var re = new RegExp("<config>(.*)</config>", "i");
	var result = re.exec(str);
	if (result){
		// configに従って、設定を変更
		updateParams(result[1]);
		return str.substr(result[0].length, str.length - result[0].length);
		//	return RegExp.rightContext; Safariでは仕様通りに動作しない
	}else{
		return text;
	}
}

// 設定をXMLに従って変更する
function updateParams (xmltext) {
	//
	if (xmltext.length <= 0) return;

	// 最大掲載広告数
	var reAdMax = new RegExp("<admax>(.+)</admax>", "i");
	var result = reAdMax.exec(xmltext);
	if (result) { setAdMax(result[1]); updateShowParams();}

	// 広告更新間隔
	var reInterval = new RegExp("<interval>(.+)</interval>", "i");
	result = reInterval.exec(xmltext);
	if (result){
		setIntervalTime(result[1]);
		restartAdListener();
		updateShowParams();
	}
}

// 設定表示の更新
function updateShowParams () {
    $('adMax').value = adMax;
    $('intervalTime').value = intervalTime;
    $('testMode').value = testMode ? "ON" : "OFF";
}


