/*
 * 広告バナーをランダム表示する
 * $Rev: 326 $
 * $Date: 2008-09-02 17:18:36 +0900 (火, 02 9 2008) $
 * $Author: satoh-k $
 */

var KoukokuPublish = function(){
	//ルートからのパス
	this.path   = "/banner";
	//CSVデータ
	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){
		var class_id = this;
		var xmlhttp = createXMLHttpRequest();
		if(xmlhttp){
			xmlhttp.onreadystatechange = function(){
				if(xmlhttp.readyState == 4 && 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){
		this.CsvData = new Array();
		Item = new Array();
		//行データ数分分割
		dataArray = txt.split("\n");
		//行データ数分ループ
		for(i = 0;i < dataArray.length;i++){
			//行データが空で無い場合
			if(dataArray[i] != ""){
				//行データに含まれる「,」を別の文字列に変更後、その文字列で区切り、列データを抽出する
				data = dataArray[i].replace(/([^\\]\"),/ig,"$1@@javascript_csv_chopper@@").split("@@javascript_csv_chopper@@");
				//CsvData[i]の初期化
				this.CsvData[i] = new Object();
				//列データ分ループ
				for(j = 0;j < data.length;j++){
					//改行データのみの行を空白にする
					if(data[j].match(/^\s$/i)) data[j] = "";
					//列データが空白でない場合
					if(data[j] != ""){
						//「"」を取り除く
						data[j] = data[j].substr(1,data[j].length - 2);
						//項目名の取得
						if(i == 0) Item[j] = data[j];
						//データの取得
						else this.CsvData[i][Item[j]] = data[j];
					}
				}
			}
		}
		//ランダム
		var randam_id = new Array();
		var banner_id = new Array();
		var Tags = document.getElementsByTagName("p");
		//バナーIDの取得
		for(i = 0;i < Tags.length;i++){
			if(id = Tags[i].id.match(new RegExp("banner_" + banner_area_id + "_.*"))){
				banner_id.push(id);
			}
		}
		//ランダムIDを取得
		rand_num = banner_id.length;
		do{
			//乱数の生成
			randam = getRand(("" + rand_num).length,1,(this.CsvData.length - 1));
			//重複データチェック
			for(i = 0;i < randam_id.length;i++){
				if(randam == randam_id[i]) break;
			}
			//重複データが無い場合
			if(i == randam_id.length) randam_id.push(randam);
			//広告表示可能数が広告数を超えている場合
			if(randam_id.length >= (this.CsvData.length - 1)) break;
		} while(randam_id.length < rand_num);
		//イメージのロード
		var obj=new Array();
		var img = new Array();
		for(i = 0;i < banner_id.length;i++){
			for(j in this.CsvData[randam_id[i]]){
				tmp_j = j.split("_");
				if(j == 'img_src'){
					obj[i] = new Image;
					obj[i].id = i;
					obj[i].src = this.CsvData[randam_id[i]]['img_src'];
					document.getElementById(banner_id[i] + "_img").src = this.CsvData[randam_id[i]]['img_src'];
					obj[i].onload = obj[i].onerror = function(){
						document.getElementById(banner_id[this.id] + "_img").src = this.src;
					}
				}
				else document.getElementById(banner_id[i] + "_" + tmp_j[0])[tmp_j[1]] = this.CsvData[randam_id[i]][j];
			}
		}
	}
}

/**
 * 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;
}
