var campaignTarget = {};
(function($){

campaignTarget.CONSTANTS =  {
	MYTRAVEL_DOMAIN : "ashiato.travel.rakuten.co.jp/",
	SERVER_REQUEST : true
};

// Browsing campaign data storage
campaignTarget.campaignDataList = [];

campaignTarget.defaultOptions = {
	dataType  : "jsonp",
	rootId    : "cpnBox",
	protocol  : "https",
	timeout   : 5000
};

campaignTarget.options = {
	tabirepo : $.extend({},campaignTarget.defaultOptions,{
		placeId : "TBRP",
		dispNum : 2,
		maxNum : 15,
		dispFunc : function(s){
			$("#statusBox").after(s);
		},
		emptyList : [
			{	pageName : "【いつでもどこでも旅予約】初めてのケータイ予約でもれなくプレゼント！",
				url : "http://img.travel.rakuten.co.jp/image/tr/mp/loy/fp7zm/",
				imageNormal : "https://img.travel.rakuten.co.jp/share/images/tabirepo/80_60_20110315-mobile.gif",
				imageSmall : "https://img.travel.rakuten.co.jp/share/images/tabirepo/80_60_20110315-mobile.gif"
			},
			{	pageName : "【無料でクーポンGET】宿泊料金その場で割引！",
				url : "http://img.travel.rakuten.co.jp/image/tr/mp/loy/A1cJ6/",
				imageNormal : "https://img.travel.rakuten.co.jp/share/images/tabirepo/80_60_20110215-rakupon.gif",
				imageSmall : "https://img.travel.rakuten.co.jp/share/images/tabirepo/80_60_20110215-rakupon.gif"
			}
		],
		emptyFunc : function(){
		},
		protocol: "https"
	},true),
	mytravel : $.extend({},campaignTarget.defaultOptions,{
		placeId : "MYTR",
		dispNum : 1,
		maxNum  : 1,
		dispFunc : function(s){
			$("#customizeMybookingDomestic").append(s);
		},
		emptyFunc : function(){
			$("#cpnBox").remove();
		},
		protocol: "http"
	},true),
	travelTop : $.extend({},campaignTarget.defaultOptions,{
		rootId : "featuredBnr",
		placeId : "TOP1",
		dataType  : "jsonp",
		dispNum : 1,
		maxNum  : 1,
		protocol: "http",
		timeout   : 4000,
		dispFunc : function(s){
			$("#featuredBnr").append(s);
		},
		emptyFunc : function(){},
		imgLargeFunc : function(image){
			return image.replace(/80_60/,"170_53");
		},
		emptyList : [
			{	pageName : "ポイント10倍プランが27,000円割引",
				url : "http://img.travel.rakuten.co.jp/image/tr/hs/topaa/QVGGs/",
				imageNormal : "http://travel.rakuten.co.jp/coupon/bnr/170_53.jpg",
				imageSmall : ""
			}
		]
	},true)
};

campaignTarget.campaignTargetTemplate = {
	tabirepo : {
		form :[
			'<div id="cpnBox">',
			'  <dl>',
			'    <dt>エリアごとキャンペーン</dt>',
			'    <dd>',
			'      <ul class="campaignTargetConts">',
			'        ##CAMPAIGN_TARGET_ELEMENT##',
			'      </ul>',
			'    </dd>',
			'  </dl>',
			'  <div id="scrllBtn">',
			'    <a href="javascript:void(0);" id="scrllNxt">次へ</a>',
			'    <a href="javascript:void(0);" id="scrllPrv">前へ</a>',
			'  </div>',
			'</div>'
		],
		element : [
			'<li class="campaignTargetElement">',
			'  <a href="##CAMPAIGN_TARGET_URL##">',
			'  <img src="##CAMPAIGN_TARGET_IMAGE_NORMAL##">',
			'  <span>##CAMPAIGN_TARGET_MSG##</span>',
			'  </a>',
			'</li>'
		],
		empty_element : ['<li></li>']
	},
	mytravel : {
		form :[
			'<div id="cpnBox" style="margin:10px;font-size:80%;height:65px;border-top:1px dotted gray;padding-top:5px;">',
			'  ##CAMPAIGN_TARGET_ELEMENT##',
			'</div>'
		],
		element : [
			'<span>■たびレポキャンペーン■</span>',
			'<a href="##CAMPAIGN_TARGET_URL##">',
			'<img width="50" height="50" src="##CAMPAIGN_TARGET_IMAGE_SMALL##" alt="##CAMPAIGN_TARGET_MSG##" style="display: block; float: left;">',
			'<span>##CAMPAIGN_TARGET_MSG##</span>',
			'</a>'
		],
		empty_element : ['']
	},
	travelTop : {
		form :['##CAMPAIGN_TARGET_ELEMENT##'],
		element : [
			'<p><a href="##CAMPAIGN_TARGET_URL##">',
			'<img width="170" height="53" alt="##CAMPAIGN_TARGET_MSG##" src="##CAMPAIGN_TARGET_IMAGE_LARGE##">',
			'<span>##CAMPAIGN_TARGET_MSG##</span>',
			'</a></p>'
		],
		empty_element : ['']
	}
};

campaignTarget.display = function(viewCode){
	var that = this,
		options;
	this.viewCode = viewCode;
	if (viewCode && this.options[viewCode]) {
		options = this.options[viewCode];
		//Rzクッキーがない場合、またはサーバへのリクエストが無効化されているときはoptionsで設定したemptyListを表示する
		if(!this.getCookie("Rz") || this.CONSTANTS.SERVER_REQUEST === false || location.protocol === 'https:'){
			this.dispCampaignTarget(options.emptyList || []);
			return;
		}
		$.ajax({
			url: options.protocol + "://" + this.CONSTANTS.MYTRAVEL_DOMAIN + "ashiato/campaign/take/",
			cache: false,
			ifModified: false,
			timeout:options.timeout,
			dataType: options.dataType,
			scriptCharset:"UTF-8",
			data:{
				maxNum : options.maxNum,
				placeId : options.placeId
			},
			success : function(json){
				var contents = json.body.contents || []
				, i = 0
				, length = contents.length
				, res = {};
			
				res.campaignBasicInfo = length === 0? options.emptyList : [];
				for(i; i < length; i++) {
					res.campaignBasicInfo.push(contents[i].campaignBasicInfo);
				}

				//データがないときは、optionsで設定したemptyListを表示する
				that.dispCampaignTarget(res.campaignBasicInfo || []);
			},
			error : function(e){
				//エラー、タイムアウトの場合、optionsで設定したemptyListを表示する
				that.dispCampaignTarget(options.emptyList || []);
			}
		});
	}
};

campaignTarget.dispCampaignTarget = function(list){
	var html = this.getHtml(list);

	var dispFunc = this.options[this.viewCode].dispFunc;
	if(dispFunc) dispFunc(html);

	this.render();
};

campaignTarget.getHtml = function(list){
	this.campaignDataList = list;
	var num = this.options[this.viewCode].dispNum;
	var campaignDataList = this.campaignDataList;
	num = num < campaignDataList.length? num : campaignDataList.length;
	var html = [];

	if(num) {
		for (var i = 0; i < campaignDataList.length; i++) {
			if(i >= num) break;
			//要素生成
			html.push(this.getElement(campaignDataList[i]));
		}
	} else {
		html.push(this.campaignTargetTemplate[this.viewCode]['empty_element'].join(""));
	}
	var templateList = this.campaignTargetTemplate[this.viewCode]['form'].join("");
	return templateList.replace(/##CAMPAIGN_TARGET_ELEMENT##/g,html.join(""));
};

campaignTarget.getElement = function(campaign){
	if(!campaign) {
		return this.campaignTargetTemplate[this.viewCode]['empty_element'].join("");
	}
	var templateList = this.campaignTargetTemplate[this.viewCode]['element'].join("");
	var p = this.options[this.viewCode]['protocol'];

	//ファイル名を置換する
	var imageLarge = campaign.imageNormal;
	var imgLargeFunc = this.options[this.viewCode].imgLargeFunc;
	if(imgLargeFunc) imageLarge = imgLargeFunc(imageLarge);

	return templateList
		.replace(/##CAMPAIGN_TARGET_URL##/g,campaign.url)
		.replace(/##CAMPAIGN_TARGET_IMAGE_SMALL##/g,campaign.imageSmall.replace(/^https?/,p))
		.replace(/##CAMPAIGN_TARGET_IMAGE_NORMAL##/g,campaign.imageNormal.replace(/^https?/,p))
		.replace(/##CAMPAIGN_TARGET_IMAGE_LARGE##/g,imageLarge.replace(/^https?/,p))
		.replace(/##CAMPAIGN_TARGET_MSG##/g,campaign.pageName);
};

campaignTarget.render = function(){
	var root = $("#"+this.options[this.viewCode].rootId);
	var scrllNxt = $("#scrllNxt");
	var scrllPrv = $("#scrllPrv");
	var that = this;
	this.page = 1;
	var num = that.options[that.viewCode].dispNum;
	this.pages = Math.ceil(this.campaignDataList.length/num);
	var duration = 100;
	var campaignDataList = that.campaignDataList;
	var element;
	var emptyFunc = that.options[that.viewCode].emptyFunc;
	if(!this.pages && emptyFunc) emptyFunc();

	if (scrllNxt) {
		scrllNxt.click(function(){
			var i;
			that.page++;
			if(that.page > that.pages) that.page = 1;
			for(i=0;i<num;i++) {
				var data = campaignDataList[i+((that.page-1)*num)];
				element = $(that.getElement(data));
				(function(e,i){
					setTimeout(function(){
						root.find(".campaignTargetConts > li:eq("+i+")").replaceWith(e);
						root.find(".campaignTargetConts > p:eq("+i+")").replaceWith(e);
						e.css({"opacity":0}).animate({"opacity":1},250);
					},(num-i-1)*duration);
				})(element,i);
			}
		});
		if(this.pages == 1){
			scrllNxt.hide();
		}
	}
	if(scrllPrv){
		scrllPrv.click(function(){
			var i;
			that.page--;
			if(that.page < 1) that.page = that.pages;
			for(i=num-1;i>=0;i--) {
				var data = campaignDataList[((that.page-1)*num)+i];
				element = $(that.getElement(data));
				(function(e,i){
					setTimeout(function(){
						root.find(".campaignTargetConts > li:eq("+i+")").replaceWith(e);
						root.find(".campaignTargetConts > p:eq("+i+")").replaceWith(e);
						e.css({"opacity":0}).animate({"opacity":1},250);
					},i*duration);
				})(element,i);
			}
		});
		if(this.pages == 1){
			scrllPrv.hide();
		}
	}
};

campaignTarget.getCookie = function(name){
	var value = null;
	if (document.cookie && document.cookie != '') {
		var cookies = document.cookie.split(';');
		for (var i = 0; i < cookies.length; i++) {
			var cookie = $.trim(cookies[i]);
			if (cookie.substring(0, name.length + 1) == (name + '=')) {
				value = decodeURIComponent(cookie.substring(name.length + 1));
				break;
			}
		}
	}
	return value;
};

})(jQuery);

