/*
 * Yahooショッピングバナー
 */
(function($){
	$.extend({
		ysad : function(){
			//インスタンス変数
			var api_base = null;
			var api_param = null;
			var api_param_particular = null;
			var req_param = null;

			var scrollNow = false;
			var showItem = 0;
			var getCount = 0;
			var displayCount = 0;
			var scrollTimerID = 0;
			var targetid = null;
			var redLength = 0;
			var descLength = 0;
			//コンストラクタ
			this.construct = function(param, elem) {
				targetid = elem.attr('id');
				//引数が'destroy'の場合
				if (param == 'destroy') {
					destroy();
					return true;
				}
				
				api_base = {};
				req_param = param;
				displayCount = parseInt(req_param.disps);
				
				if (req_param.no_render) {
					noRenderOnlyScroll();
					return true;
				}
				
				var api_param = {
					appid: req_param.appid,
					affiliate_id: req_param.affiliate_id,
					affiliate_type: 'vc'
				};
				
				//APIの設定
				switch(req_param.api){
					case 'categoryRanking':
						api_base = {
							url: 'http://shopping.yahooapis.jp/ShoppingWebService/V1/json/categoryRanking'
						}
						api_param_particular = {
							hits: req_param.hits
						}
						break;

					case 'itemSearch':
						api_base = {
							url: 'http://shopping.yahooapis.jp/ShoppingWebService/V1/json/itemSearch'
						}
						api_param_particular = {
							hits: req_param.hits
						}
						break;

					case 'contentMatch':
						var contentmatch_url = (typeof(req_param.url) != "undefined" && req_param.url != "") ? req_param.url: location.href;
						api_base = {
							url: 'http://shopping.yahooapis.jp/ShoppingWebService/V1/json/contentMatchItem'
						}
						api_param_particular = {
							responsegroup: 'medium'
						};
						break;

					case 'eventSearch':
						api_base = {
							url: 'http://shopping.yahooapis.jp/ShoppingWebService/V1/json/eventSearch'
						}
						api_param_particular = {
							hits: 20
						}
						break;

					case 'reviewSearch':
						api_base = {
							url: 'http://shopping.yahooapis.jp/ShoppingWebService/V1/json/reviewSearch'
						}
						api_param_particular = {
							results: req_param.hits
						}
						break;

					default:
						alert('invalid api');
						return;
				}
				//表示方向の設定
				switch(req_param.direction){
					case 'vertical':
						api_base["drawMethod"] =  (req_param.draw_method != undefined) ? req_param.draw_method : drawDefaultVerticalDivSpace;
						redLength = 30;
						descLength = 45;
						break;
					case 'horizontal':
						api_base["drawMethod"] =  (req_param.draw_method != undefined) ? req_param.draw_method : drawDefaultHorizontalDivSpace;
						redLength = 30;
						descLength = 22;
						break;
					default:
						if (req_param.draw_method == undefined) {
							alert('invalid direction');
							return;
						}
						api_base["drawMethod"] = req_param.draw_method;
				}
				if (req_param.red_length) {
					redLength = req_param.red_length;
				}
				if (req_param.desc_length) {
					descLength = req_param.desc_length;
				}
				$.extend(api_param, req_param.query);
				$.extend(api_param, api_param_particular);

				//call jsonp on jQuery
				$.ajax({
					url: api_base.url,
					data: api_param,
					dataType: 'jsonp',
					jsonp: 'callback',
					complete: function(XMLHttpRequest, textStatus){
					//通信終了時の処理
						if (req_param.complete_method != undefined) {
							req_param.complete_method(XMLHttpRequest, textStatus);
						}
					},
					success: function(data, textStatus){
					//通信が成功した場合の処理 (コールバック関数)
						drawResult(req_param, data, api_base.drawMethod);
					},
					beforeSend: function(XMLHttpRequest){
					//通信開始時の処理
					},
					error: function(XMLHttpRequest, textStatus, errorThrown){
					//通信が失敗した場合の処理
					}
				});
			};
			//コンストラクタここまで
			//'destroy'メソッド
			function destroy() {
				clearInterval(scrollTimerID);
				api_base = null;
				api_param = null;
				api_param_particular = null;
				req_param = null;
				scrollNow = false;
				showItem = 0;
				getCount = 0;
				displayCount = 0;
				scrollTimerID = 0;
				redLength = 0;
				descLength = 0;
			}
			//スクロールのみ設定
			function noRenderOnlyScroll() {
				switch (req_param.direction) {
					case 'horizontal':
						getCount = $('.yiuh_' + targetid + '>li').length;
						break;
					case 'vertical':
						getCount = $('.yiuv_' + targetid + '>li').length;
						break;
					default:
				}
				setScroll();
			}
			//文字列短縮
			function limitStr(value, max) {
				var ret = value;
				if (value && value.length > max) {
					ret = value.substring(0, max) + '...';
				}
				return ret;
			}
			//カンマ区切り
			function toYen(value) {
				var num = new String(value).replace(/,/g, "");
				while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
				return num;
			}
			//マイリンク作成
			function toMyLink(sid, pid, title, url, css_class) {
				var vc_ad_tag = '<img Src="http://ad.jp.ap.valuecommerce.com/servlet/gifbanner?sid=' + sid + '&pid=' + pid + '" height="1" width="1" Border="0">';
				var vc_ck_tag = 'http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=' + sid + '&pid=' + pid + '&vc_url=' + encodeURIComponent(url);
				var cls = (css_class != undefined) ? ' class="' + css_class + '"' : '';
				return vc_ad_tag + '<a' + cls + ' href="' + vc_ck_tag + '">' + title + '</a>';
			}
			//API取得結果表示
			function drawResult(req_param, result, drawMethod) {
				if ((typeof(result.ResultSet) != 'undefined') && (result.ResultSet.totalResultsReturned > 0) && (req_param.hits > 0)) {
					req_param.affiliate_id.match(/sid%3D(\d+)%26pid%3D(\d+)/);
					var sid = RegExp.$1;
					var pid = RegExp.$2;
					var vc_ad_tag = '<img Src="http://ad.jp.ap.valuecommerce.com/servlet/gifbanner?sid=' + sid + '&pid=' + pid + '" height="1" width="1" Border="0">';
					var ad = drawMethod(req_param, result.ResultSet, vc_ad_tag, sid, pid);
					$('#' + targetid).html(ad);
					setScroll();
				} else {
					if (req_param.noresult != undefined) {
						req_param.noresult(result);
					}
				}
			}
			//スクロール設定
			function setScroll() {
				//矢印ボタン
				switch (req_param.direction) {
					case 'horizontal':
						displayButtons();
						$('.ybbl_' + targetid).click(function(){clickScroll(-1)});
						$('.ybbr_' + targetid).click(function(){clickScroll(1)});
						break;
					case 'vertical':
						displayButtons();
						$('.ybbt_' + targetid).click(function(){clickScroll(-1)});
						$('.ybbb_' + targetid).click(function(){clickScroll(1)});
						break;
					default:
				}
				//オートスクロール
				if (!req_param.auto_scroll) {
					scrollTimerID = setInterval(autoScroll, 8000);
				}
			}
			//クリック時広告部分スクロール
			function clickScroll(itemCount) {
				clearInterval(scrollTimerID);
				scrollMethod(itemCount, 'normal');
			}
			//広告部分スクロール
			function scrollMethod(itemCount, scrollTime) {
				var cssType = null;
				var classIndex = null;
				var ulclassIndex = null;
				var px = 0;
				switch(req_param.direction) {
					case 'horizontal':
						cssType = 'marginLeft';
						classIndex = '.yih_' + targetid;
						ulclassIndex = '.yiuh_' + targetid;
						px = parseInt($(classIndex).width()) + parseInt($(classIndex).css('padding-left')) + parseInt($(classIndex).css('padding-right'));
						break;
					case 'vertical':
						cssType = 'marginTop';
						classIndex = '.yiv_' + targetid;
						ulclassIndex = '.yiuv_' + targetid;
						px = parseInt($(classIndex).height()) + parseInt($(classIndex).css('padding-top')) + parseInt($(classIndex).css('padding-bottom'));
						if (px < 100) px = 100; //IE6
						break;
					default:
						return false;
				}
				if (scrollNow) {
					$(ulclassIndex).stop();
				}
				scrollNow = true;
				var newpos = -px * (showItem + itemCount);
				var option = {};
				option[cssType] = newpos + 'px';
				$(ulclassIndex).animate(option, scrollTime, function(){
					if (scrollNow) {
						showItem += itemCount;
						scrollNow = false;
						displayButtons();
					}
				});
			}
			//オートスクロール
			function autoScroll() {
				if (showItem + displayCount >= getCount){
					scrollMethod(-showItem, 2500);
				} else {
					scrollMethod(1, 3500);
				}
			}
			//スクロールボタン表示
			function displayButtons() {
				var btnIndex1 = null;
				var btnIndex2 = null;
				switch(req_param.direction) {
					case 'horizontal':
						btnIndex1 = '.ybbl_' + targetid;
						btnIndex2 = '.ybbr_' + targetid;
						break;
					case 'vertical':
						btnIndex1 = '.ybbt_' + targetid;
						btnIndex2 = '.ybbb_' + targetid;
						break;
					default:
						return false;
				}
				if (showItem == 0) {
					$(btnIndex1).css('visibility', 'hidden');
				} else {
					$(btnIndex1).css('visibility', 'visible');
				}
				if (showItem + displayCount >= getCount){
					$(btnIndex2).css('visibility', 'hidden');
				} else {
					$(btnIndex2).css('visibility', 'visible');
				}
			}
			//描画関数(api_base.drawMethodで設定)
			//横表示(div)
			function drawDefaultHorizontalDivSpace(req_param, result_set, vc_ad_tag, sid, pid) {
				var ad = '';
				ad += '<div class="ysad_ads_horizontal">';
				if (req_param.title != null) ad += '<div class="ysad_item_title_horizontal">' + req_param.title + '</div>'; //広告のタイトル
				ad += '<ul class="ysad_itemul_horizontal yiuh_' + targetid + '">';
				for (var i = 0; i < result_set.totalResultsReturned; i++) {
					var item = null;
					if (req_param.api == 'reviewSearch') {
						item = result_set.Result[i];
					}else{
						item = result_set[0].Result[i];
					}
			
					if (req_param.api == 'eventSearch' && !checkEventTime(item)) {
						continue;
					}
					
					//image
					ad += '<li class="ysad_item_horizontal yih_' + targetid + '">';
					ad += '<div class="ysad_item_img_horizontal">';
					ad += '<a class="ysad_yad" href="' + item.Url +'"><img class="ysad_adimg_horizontal" width="76" height="76" src="' + getImageUrl(item, req_param.api) + '"></a>';
					ad += vc_ad_tag;
					ad += '</div>';
			
					//text
					ad += '<div class="ysad_item_desc_horizontal">';
					ad += '<a class="ysad_yad" href="' + item.Url +'">' + limitStr(getNormalDesc(item, req_param.api), descLength) + '</a>';
					ad += '</div>';
					ad += '</li>';
					
					//指定個数で抜ける
					if (++ getCount == req_param.hits) {
						break;
					}
				}
				//footer
				ad += '</ul>';
				ad += '<div class="ysad_ad_footer_horizontal">';
				if (displayCount < getCount) {
					//ad += '<input type="button" class="yaad_bullet_button_left ybbl_' + targetid +'" value="＜"><input type="button" class="yaad_bullet_button_right ybbr_' + targetid + '" value="＞">';
					ad += '<img class="ysad_bullet_button_left ybbl_' + targetid +'" src="http://www.aiolia.net/gazou/arrow-l2.gif"><img class="ysad_bullet_button_right ybbr_' + targetid + '" src="http://www.aiolia.net/gazou/arrow-r2.gif">';
				}
				ad += '</div>';
				ad += '</div>';
				return ad;
			}
			//縦表示(div)
			function drawDefaultVerticalDivSpace(req_param, result_set, vc_ad_tag, sid, pid) {
				var ad = '';
				ad += '<div class="ysad_ads_vertical">'; //広告全体
				if (req_param.title != null) ad += '<div class="ysad_item_title_vertical">' + req_param.title + '</div>'; //広告のタイトル
				ad += '<div class="ysad_itemul_vertical_div">'; //広告内容(スクロール表示のため)
				ad += '<ul class="ysad_itemul_vertical yiuv_' + targetid + '">'; //広告のリスト
				for (var i = 0; i < result_set.totalResultsReturned; i++) {
					var item = null;
					if (req_param.api == 'reviewSearch') {
						item = result_set.Result[i];
					}else{
						item = result_set[0].Result[i];
					}
					if (req_param.api == 'eventSearch' && !checkEventTime(item)) {
						continue;
					}
					
					ad += '<li class="ysad_item_vertical yiv_' + targetid + '">';
			
					//image
					ad += '<div class="ysad_item_img_vertical">';
					ad += '<a class="ysad_yad" href="' + item.Url +'"><img class="ysad_adimg_ranking" width="76" height="76" src="' + getImageUrl(item, req_param.api) + '"></a>';
					ad += vc_ad_tag;
					ad += '</div>';
			
					//text
					ad += '<div class="ysad_item_desc_vertical">';
					ad += '<div class="ysad_item_rank">' + limitStr(getRedDesc(item, req_param.api), redLength) + '</div>';
					ad += '<a class="ysad_yad" href="' + item.Url +'">' + limitStr(getNormalDesc(item, req_param.api), descLength) + getExtraDesc(item, req_param.api) + '</a>';
					ad += '</div>';
			
					//区切り
					ad += ((i != getCount -1)?'<div class="ysad_hr"></div>':'');
					ad += '</li>';
			
					//指定個数で抜ける
					if (++ getCount == req_param.hits) {
						break;
					}
				}
				//footer
				ad += '</ul>';
				ad += '</div>';
				if (displayCount < getCount) {
					ad += '<img class="ysad_bullet_button_top ybbt_' + targetid + '" src="http://www.aiolia.net/gazou/arrow-u2.gif"><img class="ysad_bullet_button_bottom ybbb_' + targetid +'" src="http://www.aiolia.net/gazou/arrow-d2.gif">'; //ボタン
				}
				//footer
				ad += getAdFooterDiv(sid, pid, req_param.api, result_set);
				ad += '</div>';
				return ad;
			}
			function getImageUrl(item, api) {
				var desc = null;
				switch (api) {
					case 'itemSearch':
					case 'categoryRanking':
					case 'eventSearch':
					case 'contentMatch':
						desc = item.Image.Small;
						break;
					case 'reviewSearch':
						desc = item.Target.Image.Small.Url;
						break;
				}
				return desc;
			}
			function getRedDesc(item, api) {
				var desc = null;
				switch (api) {
					case 'itemSearch':
						desc = item.Store.Name;
						break;
					case 'categoryRanking':
						desc = item._attributes.rank + '位';
						break;
					case 'eventSearch':
						desc = '';
						break;
					case 'reviewSearch':
						desc = item.ReviewTitle;
						break;
					case 'contentMatch':
						desc = item.Name;
						break;
				}
				return desc;
			}
			function getNormalDesc(item, api) {
				var desc = null;
				switch (api) {
					case 'itemSearch':
						desc = item.Name;
						break;
					case 'categoryRanking':
						desc = item.Name;
						break;
					case 'eventSearch':
						desc = item.EventTitle;
						break;
					case 'reviewSearch':
						desc = item.Description;
						break;
					case 'contentMatch':
						desc = item.Description;
						break;
				}
				return desc;
			}
			function getExtraDesc(item, api) {
				var desc = null;
				switch (api) {
					case 'itemSearch':
					case 'categoryRanking':
					case 'eventSearch':
					case 'contentMatch':
						desc = '';
						break;
					case 'reviewSearch':
						var starrank = Math.round(item.Ratings.Average * 2);
						var fsnum = Math.floor(starrank / 2);
						var hfnum = starrank % 2;
						var nonum = 5 - fsnum - hfnum;
						desc = '<br>';
						for (var j = 0; j < fsnum; j ++) {
							desc += '<img class="ysad_starimg" src="http://www.aiolia.net/gazou//fullstar.gif">';
						}
						for (var j = 0; j < hfnum; j ++) {
							desc += '<img class="ysad_starimg" src="http://www.aiolia.net/gazou//halfstar.gif">';
						}
						for (var j = 0; j < nonum; j ++) {
							desc += '<img class="ysad_starimg" src="http://www.aiolia.net/gazou//nostar.gif">';
						}
						desc += '<br><span class="ysad_text_right"> 平均評価 ' + item.Ratings.Average + '</span>';
						break;
				}
				return desc;
			}
			function getAdFooterDiv(sid, pid, api, result_set) {
				var desc = null;
				switch (api) {
					case 'itemSearch':
						//desc = '<div class="ysad_ad_footer_vertical"><a class="ysad_yad" href="http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=' + sid + '&pid=' + pid + '&vc_url=http%3A%2F%2Fshopping.yahoo.co.jp%2Fsearch%3Ffirst%3D1%26cid%3D%26p%3D' + encodeURIComponent(result_set[0].Result.Request.Query) + '%26x%3D0%26y%3D0" target="_top">さらにチェック！</a></div>';
						desc = '<div class="ysad_ad_footer_vertical"><a class="ysad_yad" href="http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=' + sid + '&pid=' + pid + '&vc_url=http%3A%2F%2Fshopping.yahoo.co.jp%2Fsearch%3Fp%3D' + encodeURIComponent(encodeURIComponent(result_set[0].Result.Request.Query)) + '" target="_top">さらにチェック！</a></div>';
						//desc = '<div class="ysad_ad_footer_vertical"><a class="ysad_yad" href="http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=' + sid + '&pid=' + pid + '&vc_url=http%3A%2F%2Fshopping.yahoo.co.jp%2F" target="_top">ほかをチェック！</a></div>';
						break;
					case 'categoryRanking':
						desc = '<div class="ysad_ad_footer_vertical"><a class="ysad_yad" href="http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=' + sid + '&pid=' + pid + '&vc_url=http%3A%2F%2Fshopping.yahoo.co.jp%2Franking%2F' + req_param.query.category_id + '%2F" target="_top">' + (getCount + 1) + '位以下もチェック！</a></div>';;
						break;
					case 'eventSearch':
						desc = '';
						break;
					case 'reviewSearch':
						desc = '';
						break;
					case 'contentMatch':
						desc = '';
						break;
				}
				return desc;
			}
			function checkEventTime (item) {
				//日付をチェック
				var today = new Date();
				var sdate = new Date(item.EventTerm.Start.replace('T', ' ').replace('+09:00', '').replace(/-/g, '/'));
				var edate = new Date(item.EventTerm.End.replace('T', ' ').replace('+09:00', '').replace(/-/g, '/'));
				if (sdate > today) {
					return false;
				}
				if (today > edate){
					return false;
				}
				return true;
			}
		}
	});
	$.fn.extend({
		ysad : function(param){
			return this.each(function(i){
				if (!$(this).data('ysad')) {
					$(this).data('ysad', (new $.ysad));
				}
				$(this).data('ysad').construct(param, $(this));
			});
		}
	});
})(jQuery);
