/*
 * 商品検索の結果リスト(json)を取得します。
 * keywords			(検索文字列)
 * category			(カテゴリ)
 * price_max		(価格範囲)
 * price_min		(価格範囲)
 * limit			(１ページの最大件数)
 * sort_by			(ソート項目)
 * sort_order		(ソート順)
 * page				(ページ)
 * cbFunc			(callback)
 * targetObjXpath	(表示位置)
 */
function searchList( keywords, category, price_min, price_max, limit, sort_by, sort_order, ec, page, cbFnc, targetObjXpath ){

	var str = '';
	str += "<div class=\"site-loader\">\n";
	str += "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0\" width=\"350\" height=\"250\">\n";
	str += "<param name=\"wmode\" value=\"transparent\">\n";
	str += "<param name=\"movie\" value=\"http://static.bitcash.jp/bittokuen/shopping/search/swf/roading_itemsearch.swf\" />\n";
	str += "<param name=\"quality\" value=\"high\" />\n";
	str += "<param name=\"allowScriptAccess\" value=\"always\" />\n";
	str += "<embed src=\"http://static.bitcash.jp/bittokuen/shopping/search/swf/roading_itemsearch.swf\" quality=\"high\" pluginspage=\"http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash\" type=\"application/x-shockwave-flash\" width=\"350\" height=\"250\" allowScriptAccess=\"always\" wmode=\"transparent\"></embed></object>\n";
	str += "</div>\n";
	$(targetObjXpath).html(str);

	var server = "/bittokuen/";

	var url = server + "ajax/shopping/";
	var postBody = { "keywords" : keywords, "category" : category, "price_min" : price_min, "price_max" : price_max,
						 "sort_by" : sort_by, "sort_order" : sort_order, "ec" : ec };

	if(!page){
		page = 1;
	}
	postBody["page"]  = page;

	if(!limit){
		limit = 10;
	}
	postBody["limit"] = limit;


	if(!sort_by) sort_by = 'score';
	postBody["sort_by"] = sort_by;

	if(!sort_order) sort_order = 'desc';
	postBody["sort_order"] = sort_order;

	$.ajax({
		dataType : "jsonp",
		data : postBody,
		url : url,
		timeout : 4800,
		async : true,
		success : function(json){
			eval(cbFnc + "(json,targetObjXpath)");
		},
		error : function(){
			// タイムアウトした場合に再検索に３回いってみる
			LoopSearchList( url, 3, postBody, cbFnc, targetObjXpath );
		}
	});
}

/*
 * タイムアウトした場合に再度商品検索する
 */
function LoopSearchList( url, count, postBody, cbFnc, targetObjXpath, timeout ){
	if ( 0 < count ) {
		// timeout基準値
		if ( !timeout ) timeout = 7200;

		$.ajax({
			dataType : "jsonp",
			data : postBody,
			url : url,
			timeout : timeout,
			success : function(json){
				eval(cbFnc + "(json,targetObjXpath)");
			},
			error : function(){
				count--;
				// timeout値を増やしていく
				timeout +=2400;
				LoopSearchList( url, count, postBody, cbFnc, targetObjXpath, timeout );
			}
		});
	} else {
		// 検索できなかった場合
		var str = '';
		str += "<div class=\"site-error\">\n";
		str += "<p>アクセスが集中しております。<br /><br /></p>\n";
		str += "<p>時間を置いて再度お試しください。</p>\n";
		str += "</div>\n";
		$(targetObjXpath).html("<ul>\n" + str + "</ul>\n");
		return;
	}
}

/*
 * class="shoppingSearch"を持つinputタグのvalueから、searchList()を飛ばします。
 *
 * <input type="hidden" class="shoppingSearch" value="まぐろ,all,,,10,score,desc,08fsg,1,searchBlock,#search .searchlist" />
 * → searchlist("まぐろ", "all", "", "", 10, "score", "desc", "08fsg", 1, "searchBlock", "#shopping-search .shoppinglist");
 *
 */
$(function(){
	getSearchlist();
});

function getSearchlist(){
	searchListCB = new searchListCallBack();
	var searchlists = $("input.shoppingSearch");

	for( var i =0; i < searchlists.length; i++ ) {
		var params = searchlists[i].value.split(",");

		var keywords		= params[0];
		var category		= params[1];
		var price_min		= params[2];
		var price_max		= params[3];
		var limit			= params[4];
		var sort_by			= params[5];
		var sort_order		= params[6];
		var ec				= params[7];
		var page			= params[8];
		var cbFnc			= params[9];
		var targetObjXpath	= params[10];

		if( typeof( searchListCB[cbFnc] ) == "function" ){
			searchList( keywords, category, price_min, price_max, limit, sort_by, sort_order, ec, page,
						"searchListCB." + cbFnc, targetObjXpath );
		}
	}
}

/* searchList() の callback
 * this.formalize すると使いやすいかも。
 */
function searchListCallBack(){
	// 商品検索の結果ページの表示
	this.searchBlock = function(json,targetObjXpath){
		var result = eval(json);
		// 検索結果判定
		if ( 0 == result['info']['status'] ){
			// 検索結果なし
			this.notfoundBlock(json,targetObjXpath);
			// ページャーの表示
			this.pagerBlock(json,targetObjXpath);
		} else {
			// 検索結果あり
			this.foundBlock(json,targetObjXpath);
			// ページャー
			this.pagerBlock(json,targetObjXpath);
			// ソーター
			this.sorterBlock(json,targetObjXpath);
			// 値段リンク
			this.pricelinkBlock(json,targetObjXpath);
		}
		return;
	};

	// 検索結果なし
	this.notfoundBlock = function(json,targetObjXpath){
		var str = "";
		str += "<div class=\"site-error\">\n";
		str += "<p>商品が見つかりませんでした。<br /><br /></p>\n";
		str += "<p>再検索のヒント：</p>\n";
		str += "<p>誤字・脱字がないかを確認してみてください。</p>\n";
		str += "<p>言葉の区切り方を変えてみてください。</p>\n";
		str += "</div>\n";
		$(targetObjXpath).html( str );
	}

	// 検索結果あり
	this.foundBlock = function(json,targetObjXpath){
		var result = eval(json);
		var str = "";

		var lists	= result["items"];
		var dd = new Date();
		var unique_ids = new Array();
		var count = lists.length;
		var show_length = 105;

		for(var i = 0; i < count; i++){
			var list = this.formalize(lists[i]);
			var unique_id = 'l' + dd.getTime() + i;
			unique_ids.push(unique_id);

			// タイトルが長い場合省略
			var short_title = list.title;

			if( short_title.length > show_length ){
				short_title = list.title.substr(0, show_length) + "・・・" ;
			}

			// html
			str += "<li class=\"site\">\n";
			str += "	<div class=\"site-inner\">\n";
			str += "		<div class=\"site-body\">\n";
			str += "			<div class=\"image\">\n";
			str += "				<div class=\"image-inner\">\n";
			str += "					<span class=\"detail-link\" onClick=\"GoDetail('" + unique_id + "')\">\n";
			str += "						<img src=\"" + list.img + "\" width=\"150\">\n";
			str += "					</span>\n";
			str += "				</div>\n";
			str += "			</div>\n";
			str += "			<div class=\"bittoku\">\n";
			str += "				<h3><span class=\"detail-link\" onClick=\"GoDetail('" + unique_id + "')\">\n";
			str += "					" + short_title + "\n";
			str += "				</span></h3>\n";
			str += "				<div>\n";
			str += "					<ul>\n";
			str += "					<li class=\"shop\">" + list.ecname + "</li>\n";
			str += "					<li class=\"shopinfo\"><a href=\"/bittokuen/list/detail/id/" + list.ecid + "\">ショップ情報</a></li>\n";
			str += "					<li class=\"price\"><strong>￥" + list.price + "</strong></li>\n";
			str += "					<li class=\"point\"><strong>" + list.point + "</strong>ポイント" + "（商品購入金額の<p class=\"rate\">" + list.pointper + "</p>％）" + "</li>\n";
			str += "					<li class=\"date\">" + list.pointday + "</li>\n";
			str += "					</ul>\n";
			str += "				</div>\n";
			str += "				<form name=\"" + unique_id + "\">\n";
			str += "					<input type=\"hidden\" name=\"tmp\" value=\"" + unique_id + "\" />\n";
			str += "					<input type=\"hidden\" name=\"ecid\" value=\"" + list.ecid + "\" />\n";
			str += "					<input type=\"hidden\" name=\"ecname\" value=\"" + list.ecname + "\" />\n";
			str += "					<input type=\"hidden\" name=\"title\" value=\"" + list.title + "\" />\n";
			str += "					<input type=\"hidden\" name=\"desc\" value=\"" + list.desc + "\" />\n";
			str += "					<input type=\"hidden\" name=\"img\" value=\"" + list.img + "\" />\n";
			str += "					<input type=\"hidden\" name=\"price\" value=\"" + list.price + "\" />\n";
			str += "					<input type=\"hidden\" name=\"point\" value=\"" + list.point + "\" />\n";
			str += "					<input type=\"hidden\" name=\"pointper\" value=\"" + list.pointper + "\" />\n";
			str += "					<input type=\"hidden\" name=\"pointday\" value=\"" + list.pointday + "\" />\n";
			str += "					<input type=\"hidden\" name=\"link\" value=\"" + list.link + "\" />\n";
			str += "					<input type=\"hidden\" name=\"pv\" value=\"" + list.pv + "\" />\n";
			str += "				</form>\n";
			str += "				<div class=\"btn\">\n";
			str += "					<span class=\"detail-link\" onClick=\"GoDetail('" + unique_id + "')\">\n";
			str += "						<img class=\"btn\" src=\"http://static.bitcash.jp/bittokuen/shopping/search/201010/bt_detail_off.gif\" alt=\"詳細・購入\" />\n";
			str += "					</span>\n";
			str += "				</div>\n";
			str += "			</div>\n";
			str += "		</div>\n";
			str += "	</div>\n";
			str += "</li>\n";
		}
		$(targetObjXpath).html("<ul>\n" + str + "</ul>\n");

		// 詳細リンクマウスオーバー時のカーソル変更
		$(targetObjXpath + " span.detail-link").hover(
			function(){
				$(this).addClass("detail-hover");
			},
			function(){
				$(this).removeClass("detail-hover");
			}
		);

		// ボタン画像マウスオーバー時の画像変更
		$(targetObjXpath + " img.btn,input.btn[type='image']").hover(
			function(){
				$(this).attr("src",$(this).attr("src").replace("_off.","_on."));
			},
			function(){
				$(this).attr("src",$(this).attr("src").replace("_on.","_off."));
			}
		);
	};


	// ページャー
	this.pagerBlock = function(json,targetObjXpath){
		var result = eval(json);

		// ページャーの表示
		// pager.js の pagerクラスを使用。
		var pagerNum = $(targetObjXpath).parent().children(".pager").length;
		this.pager = [];
		for(var i = 0; i < pagerNum; i++){
			this.pager[i] = new _pager();
			this.pager[i].createPager( $(targetObjXpath).parent().children(".pager:eq(" + i +")"), result["page"], result["info"]["limit"], result["resultCount"] );
			this.pager[i].flipSearchList( result["info"]["keywords"], result["info"]["category"], result["info"]["price_min"], result["info"]["price_max"], result["info"]["limit"], result["info"]["sort_by"], result["info"]["sort_order"], result["info"]["ec"], result["page"], "searchBlock", targetObjXpath, i );
		}
	}

	// ソーター
	this.sorterBlock = function(json,targetObjXpath){
		var result = eval(json);

		// ソート項目のハードリンク表示
		var link = "../shopping/search?k=" + encodeURI(result["info"]["keywords"]) + "&c=" + result["info"]["category"] + "&l=" + result["info"]["limit"] + "&pn=" + result["info"]["price_min"] + "&px=" + result["info"]["price_max"];
		if ( result["info"]["ec"] ) link += "&ec=" + result["info"]["ec"];

		var str = "";

		if ( result["info"]["sort_by"] == "price" && result["info"]["sort_order"] == "desc"){
			str += "<img src=\"http://static.bitcash.jp/bittokuen/shopping/search/201010/sort_expensive.gif\" width=\"391\" height=\"30\" alt=\"価格の高い順\" usemap=\"#sort\" />\n";
		} else if ( result["info"]["sort_by"] == "price" && result["info"]["sort_order"] == "asc"){
			str += "<img src=\"http://static.bitcash.jp/bittokuen/shopping/search/201010/sort_cheep.gif\" width=\"391\" height=\"30\" alt=\"価格の低い順\" usemap=\"#sort\" />\n";
		} else {
			str += "<img src=\"http://static.bitcash.jp/bittokuen/shopping/search/201010/sort_osusume.gif\" width=\"391\" height=\"30\" alt=\"おすすめ順\" usemap=\"#sort\" />\n";
		}

		str += "<map name=\"sort\">\n";
		if ( result["info"]["sort_by"] != "score"){
			str += "<area shape=\"rect\" coords=\"0,0,124,30\" href=\"" + link + "&sb=score&so=desc\" alt=\"おすすめ順\" />\n";
		}
		if ( result["info"]["sort_by"] == "score" || result["info"]["sort_order"] == "asc"){
			str += "<area shape=\"rect\" coords=\"132,0,256,30\" href=\"" + link + "&sb=price&so=desc\" alt=\"価格の高い順\" />\n";
		}
		if ( result["info"]["sort_by"] == "score" || result["info"]["sort_order"] == "desc"){
			str += "<area shape=\"rect\" coords=\"265,0,390,30\" href=\"" + link + "&sb=price&so=asc\" alt=\"価格の低い順\" />\n";
		}
		str += "</map>";

		$(targetObjXpath).parent().children(".sorter").html( str );

		/*
		// ソーターの表示
		var sortNum = $(targetObjXpath).parent().children(".sorter").length;
		this.sorter = [];
		for(var i = 0; i < sortNum; i++){
			this.sorter[i] = new _sorter();
			this.sorter[i].createSorter( $(targetObjXpath).parent().children(".sorter:eq(" + i +")"), result["info"]["sort_by"], result["info"]["sort_order"], 'shpg');
			this.sorter[i].flipSearchList( result["info"]["keywords"], result["info"]["category"], result["info"]["price_min"], result["info"]["price_max"], result["info"]["limit"], result["info"]["sort_by"], result["info"]["sort_order"], result["info"]["ec"], 1, "searchBlock", targetObjXpath, i );
		}
		*/
	}

	// 値段リンク
	this.pricelinkBlock = function(json,targetObjXpath){
		var result = eval(json);

		// 値段範囲のハードリンク表示
		var link = "../shopping/search?k=" + encodeURI(result["info"]["keywords"]) + "&c=" + result["info"]["category"] + "&l=" + result["info"]["limit"] + "&sb=" + result["info"]["sort_by"] + "&so=" + result["info"]["sort_order"];
		if ( result["info"]["ec"] ) link += "&ec=" + result["info"]["ec"];

		var str = "";

		price_min_list = new Array( '', 1000, 5000, 10000, 30000, 50000, '' );
		price_max_list = new Array( 999, 4999, 9999, 29999, 49999, '', '' );
		str += "<div class=\"pricelinkBody\">\n";
		str += "<ul>\n";
		j = price_min_list.length;
		for (i = 0; i < j; i++) {
			if ( result["info"]["price_min"] == price_min_list[i] && result["info"]["price_max"] == price_max_list[i] ) {
				if ( price_min_list[i] == '' ) {
					if ( price_max_list[i] == '' ) {
						str += "<li><strong>指定なし</strong></li>\n";
					} else {
						str += "<li><strong>" + "～" + price_max_list[i] + "円</strong></li>\n";
					}
				} else if ( price_max_list[i] == '' ) {
					str += "<li><strong>" +  price_min_list[i] + "円～</strong></li>\n";
				} else {
					str += "<li><strong>" +  price_min_list[i] + "円～" + price_max_list[i] + "円</strong></li>\n";
				}
			} else {
				if ( price_min_list[i] == '' ) {
					if ( price_max_list[i] == '' ) {
						str += "<li><a href=\"" + link + "\">指定なし</a></li>\n";
					} else {
						str += "<li><a href=\"" + link + "&px=" + price_max_list[i] + "\">" + "～" + price_max_list[i] + "円</a></li>\n";
					}
				} else if ( price_max_list[i] == '' ) {
					str += "<li><a href=\"" + link + "&pn=" + price_min_list[i] + "\">" + price_min_list[i] + "円～</a></li>\n";
				} else {
					str += "<li><a href=\"" + link + "&pn=" + price_min_list[i] + "&px=" + price_max_list[i] + "\">" + price_min_list[i] + "円～" + price_max_list[i] + "円</a></li>\n";
				}
			}
		}
		str += "<ul>\n";
		str += "</div>\n";
		$(targetObjXpath).parent().children(".pricelink").html( str );

		return;
	};

	this.formalize = function(listData){
		obj = {};
		obj.title 		= listData['title'];
		obj.link 		= listData['link'];
   		obj.img 		= listData['img'];
		obj.category 	= listData['category'];
   		obj.desc 		= listData['description'];
		obj.price 		= listData['price'];
		obj.point 		= listData['point'];
		obj.pointper 	= listData['pointper'];
		obj.pointday 	= listData['pointday'];
		obj.ecname 		= listData['merchantName'];
		obj.eccode 		= listData['ecCode'];
		obj.ecid 		= listData['ecid'];
		obj.pv 			= encodeURI(listData['pvImg']);
		return obj;
	}
}

/*
 * 詳細ページへ飛ばす
 */
function GoDetail( tmp ){
	var f=document[tmp];
	//詳細ページの生成先URL（生成後、/detail/にリダイレクト）
	f.action = '/bittokuen/shopping/create/';
	f.target = tmp;
	f.method = 'post';
	window.open( '' , tmp );
	f.submit();
}

