/*
 * 広告バナーをランダム表示する
 * $Rev: 2406 $
 * $Date: 2010-08-25 09:56:23 +0900 (水, 25 8 2010) $
 * $Author: satoh-k $
 */

var KoukokuPublish = function(){
	//ルートからのパス
	this.path   = "/banner";
	//サイトドメイン
	this.domain = "www.pref.yamanashi.jp";
	//CSVデータ
	this.AreaData = new Array();
	this.CsvData = new Array();
}

KoukokuPublish.prototype = {
	/**
	 * CSVデータをロードする
	 * CSVデータをAjaxを使いロードする
	 * @param banner_area_id バナー表示エリアのID
	 * @param area_id 広告エリアのID
	 */
	LoadData : function(banner_area_id,area_id){
		//ドメインが違う場合は、処理しない
		if(location.hostname != this.domain) return;
		var class_id = this;
		var xmlhttp = createXMLHttpRequest();
		if(xmlhttp){
			xmlhttp.onreadystatechange = function(){
				if(xmlhttp.readyState == 4){
					if(xmlhttp.status == 200) class_id.getData(banner_area_id,xmlhttp.responseText);
				}
			}
		}
		else alert("ajax error");
		//リクエスト処理
		xmlhttp.open('GET',this.path + '/' + area_id + '/banner_data_' + area_id + '.csv',true);
		xmlhttp.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
		xmlhttp.send(null);
	},
	/**
	 * 広告表示切り替え用処理
	 * 広告の表示をランダムに切り替える
	 * @param banner_area_id バナー表示エリアのID
	 * @param txt CSVの内容
	 */
	getData : function(banner_area_id,txt){
		//引数のチェック
		if(!txt) return;

		//変数の初期化
		this.AreaData = new Array();
		this.CsvData = new Array();
		var tmp_area_data = new Array();
		var prev_number = new Array();

		//改行コードの統一
		txt = txt.replace(/\r\n/g,"\n");
		txt = txt.replace(/\r/g,"\n");
		//行データ数分分割
		var csv_dataArray = txt.split("\n");
		//エリア情報の取得
		for(var i = 0;i < 2;i++){
			tmp_area_data.push(csv_dataArray[0]);
			csv_dataArray.shift();
		}
		//エリア情報を配列で取得
		this.AreaData = getCsvData(tmp_area_data.join("\n"));
		this.AreaData = this.AreaData[0];
		//バナー情報を配列で取得
		this.CsvData = getCsvData(csv_dataArray.join("\n"));

		//表示順がランダムの場合
		if(this.AreaData['order_from'] == 0){
			//広告の件数を取得
			for(var i = 0,rand_num = 0;i < this.CsvData.length;i++){
				if(this.CsvData[i]['banner_type'] == 1) rand_num++;
			}
			//ランダムIDを取得
			do{
				if(rand_num == 0) break;
				//乱数の生成
				randam = getRand(("" + rand_num).length,0,(rand_num - 1));
				//重複データチェック
				for(var i = 0;i < prev_number.length;i++){
					if(randam == prev_number[i]) break;
				}
				//重複データが無い場合
				if(i == prev_number.length) prev_number.push(randam);
				//広告表示可能数が広告数を超えている場合
				if(prev_number.length >= this.CsvData.length) break;
			} while(prev_number.length < rand_num);
			//広告募集中バナーを追加
			while(prev_number.length < this.CsvData.length){
				prev_number.push(rand_num++);
			}
		}
		//表示順が固定の場合
		else{
			for(var i = 0;i < this.CsvData.length;i++){
				prev_number.push(i);
			}
		}

		//表示の作成
		var obj=new Array();
		var img = new Array();
		var banner_id = new Array();
		var advert_area = document.getElementById('advert_area_' + banner_area_id).getElementsByTagName('TBODY')[0];
		var tag_tr = "";
		//エリアの中を削除
		if(advert_area.firstChild) advert_area.removeChild(advert_area.firstChild);
		//エリアの中を作成
		for(var i = 0;i < this.AreaData['layout_line'] * this.AreaData['layout_row'];i++){
			//タグの作成
			if(i % this.AreaData['layout_row'] == 0) tag_tr = document.createElement('TR');
			var tag_td = document.createElement('TD');
			//表示件数以下の場合のみ、Aタグ・IMGタグを作成する
			if(i < this.AreaData['disp_num']){
				var tag_a = document.createElement('A');
				var tag_img = document.createElement('IMG');
				//IDを指定
				tag_td.id = 'banner_' + banner_area_id + '_' + i + '_td';
				tag_a.id = 'banner_' + banner_area_id + '_' + i + '_a';
				tag_img.id = 'banner_' + banner_area_id + '_' + i + '_img';
				//バナーIDの取得
				banner_id.push('banner_' + banner_area_id + '_' + i);
				//作成したタグを設置する
				tag_a.appendChild(tag_img);
				tag_td.appendChild(tag_a);
			}
			tag_tr.appendChild(tag_td);
			if(i % this.AreaData['layout_row'] == (this.AreaData['layout_row'] - 1)){
				advert_area.appendChild(tag_tr);
				tag_tr = "";
			}
		}

		//作成したタグにデータを埋め込む
		for(var i = 0;i < banner_id.length;i++){
			//表示件数以下かチェック
			if(i >= this.AreaData['disp_num']) break;
			//データが存在するかチェック
			if(prev_number[i] === undefined || !this.CsvData[prev_number[i]]) break;

			//タグにデータをセット
			document.getElementById(banner_id[i] + '_a').href = this.CsvData[prev_number[i]]['a_href'];
			document.getElementById(banner_id[i] + '_a').onclick = callClickCount(this.CsvData[prev_number[i]]['a_onClick'],this.CsvData[prev_number[i]]['a_href']);
			document.getElementById(banner_id[i] + '_img').src = this.CsvData[prev_number[i]]['img_src'];
			document.getElementById(banner_id[i] + '_img').alt = this.CsvData[prev_number[i]]['img_alt'];
			document.getElementById(banner_id[i] + '_img').width = this.AreaData['banner_width'];
			document.getElementById(banner_id[i] + '_img').height = this.AreaData['banner_height'];
			//画像のロード
			obj[i] = new Image;
			obj[i].id = 'tmp_' + document.getElementById(banner_id[i] + '_img').id;
			obj[i].src = this.CsvData[prev_number[i]]['img_src'];
			//画像のロードが完了したら、再度書き換えを行う
			obj[i].onload = obj[i].onerror = function(){
				document.getElementById(this.id.substr(4,this.id.length)).src = this.src;
			}
		}
	}
}

/**
 * クリック集計用CGIを読み込む
 * クリック集計用CGIを実行するため、Scriptタグで読み込む
 * @param URL クリック集計用CGIのURL
 * @return クリック集計用CGIを実行するための無名関数
 */
function callClickCount(cgiPath,linkPath){
	return function() {
		//HTTPリクエストの作成
		var xmlhttp = createXMLHttpRequest();
		if(xmlhttp){
			xmlhttp.onreadystatechange = function(){
				//読み込みが完了したらページ遷移
				if(xmlhttp.readyState == 4){
					document.location.href = linkPath;
				}
			}
		}
		//HTTPリクエストの作成に失敗したら、ページ遷移
		else{
			document.location.href = linkPath;
		}
		//リクエスト処理
		xmlhttp.open('GET', cgiPath + '&r=' + (new Date()).getTime(), true);
		xmlhttp.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
		xmlhttp.send(null);
		return false;
	};
}

/**
 * Ajax用オブジェクトの作成
 * Ajax用にHTTP通信を行うためのオブジェクトを作成する
 * @return XMLhttpObjectオブジェクト
 */
function createXMLHttpRequest(){
	var XMLhttpObject = null;
	try{ XMLhttpObject = new XMLHttpRequest(); }
	catch(e){
		try{ XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP"); }
		catch(e){
			try{ XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP"); }
			catch(e){ return null; }
		}
	}
	return XMLhttpObject;
}

/**
 * 乱数の生成
 * 乱数を生成する。numかmin・maxのどちらかは必須。
 * @param num 生成する乱数の桁数
 * @param min 生成する乱数の最小値
 * @param max 生成する乱数の最大値
 * @return 生成した乱数。生成に失敗した場合は、falseを返す。
 */
function getRand(num,min,max){
	var ret = 0;
	if(num === '' && (min === '' || max === '')) return false;
	if(num === '') num = 0;
	//桁数にあわせた乱数の取得
	for(var i = 0;i < num;i++){
		ret = ret * 10 + (Math.floor(Math.random() * 10));
	}
	//最小値・最大値の指定がある場合
	if(min !== '' && max !== ''){
		//最大値を内包する桁数の取得
		var max_cnt = 1;
		var max_num = 0;
		while(max_cnt < max){
			max_cnt *= 10;
		}
		max_num = ("" + max_cnt).length;
		//最小値から最大値までの乱数の取得
		while(ret < min || ret > max){
			//retが0以下になった場合、乱数再取得
			if(ret == 0) ret = getRand(max_num,"","");
			ret = ret % (max + 1);
		}
	}
	return ret;
}

/**
 * CSV文字列を配列に変更
 * @param csv_txt CSV文字列
 * @return CSVを配列化したデータ
 */
function getCsvData(csv_txt){
	//変数の宣言
	var csv_data = new Array();
	var item = new Array();

	//行データ数分分割
	dataArray = csv_txt.split("\n");
	//行データ数分ループ
	for(var i = 0;i < dataArray.length;i++){
		//行データが空で無い場合
		if(dataArray[i] != ""){
			//行データに含まれる「,」を別の文字列に変更後、その文字列で区切り、列データを抽出する
			data = dataArray[i].replace(/([^\\]\"),/ig,"$1@@javascript_csv_chopper@@").split("@@javascript_csv_chopper@@");
			//一時データ
			tmp_data = new Object();
			//列データ分ループ
			for(var j = 0;j < data.length;j++){
				//改行データのみの行を空白にする
				if(data[j].match(/^\s$/i)) data[j] = "";
				//列データが空白でない場合
				if(data[j] != ""){
					//「"」を取り除く
					data[j] = data[j].replace(/(^\"|\"$)/ig,"");
					//項目名の取得
					if(i == 0) item[j] = data[j];
					//データの取得
					else tmp_data[item[j]] = data[j].replace("\\\"","\"");
				}
			}
			//配列に入れる
			if(i != 0) csv_data[csv_data.length] = tmp_data;
		}
	}
	return csv_data;
}

