//
// 最近チェックした商品 Widget 表示制御用Javascript
//
// 本スクリプトは以下に依存します。
// jquery
// jquery.cookie
// m2p_login
// m2plib
//
// スクリプトが機能するためには、画面onload時(ready)に wgtrecent_initを
// 呼び出す必要があります。
//
// 2011.1.11 暫定。画面表示の詳細などは未実装

/**
 * デフォルトのランキング表示件数.
 */
var wgtrecent_default_count = 5;

/**
 * クッキー設定情報(必要に応じて利用者が上書きすることを想定).
 */
var WGTRECENT_COOKIE_CONFIG = {
		"domain":  '.m2plus.com',
		"path":    '/',
		"expires": ''
}

/**
 * 非ログイン状態で使用するGUID
 */
var wgtrecent_guid = '';

/**
 * 最近チェックした商品ウィジェット制御モジュール.
 * 複数のウィジェットを同時表示するためにスクリプトをクラス化.
 * 
 * GUIDの生成や取得に関しては、クラス内に実装せず外部関数を呼び出しています。
 * (複数のウィジェットが存在してもGUIDは同じものを使用するので)
 * 
 * @param content_div_id String		商品リストを表示するDIVのID.
 * @param item_template_id String	1商品のHTMLテンプレート領域のID.
 * @param btn_show_id String		[すべて表示]ボタンのID.
 * @param btn_hide_id String		[５件のみ表示]ボタンのID.
 * @param store String ストア識別ID
 * @param ikey String 商品ID
 */
var WgtRecent = function(content_div_id, item_template_id, btn_show_id, btn_hide_id, store, ikey) {

	// 画面HTML要素の保持
	this.content_div   = $('#'+ content_div_id);		// 商品リストを表示するDIV
	this.item_template = $('#'+ item_template_id);	// 1商品のHTMLテンプレート
	this.btn_show      = $('#'+ btn_show_id);			// すべて表示
	this.btn_hide      = $('#'+ btn_hide_id);			// ５件のみ表示
	
	this.store = store;		// ストア識別子
	this.ikey  = ikey;		// 商品ID	

	// 自インスタンスを格納する
	WgtRecent.holder[store] = this;
	
	/**
	 * 最近チェックした商品をを全件表示する.
	 * @return
	 */
	this.show_all = function () {
		this.content_div.children('[class=wgt_item]').show();
	};

	/**
	 * 最近チェックした商品の表示を縮める.
	 * 対象要素の取得にclass名を仕様しているので、デザイン変更でクラス名を
	 * 変える場合は注意。
	 */
	this.show_narrow = function () {
		var items = this.content_div.children('[class=wgt_item]');
		
		for (var i=0; i< items.length; i++) {
			if ( i < wgtrecent_default_count ) {
				$(items[i]).show();
			} else {
				$(items[i]).hide();
			}
		}
	};

	/**
	 * 折りたたみ表示の設定をクッキーに保存する.
	 * 所定のプレフィックス＋ストア識別子をキーとして、全景表示の場合は1をクッキーに保存します。
	 * クッキーのドメインが.m2plus.comの場合は、homeと各ストアの表示設定が連動します。
	 * もし、連動させたくない場合は、ドメインをホストにすることで解決できるはず。
	 * 
	 * @param dispall 全件表示かどうか 全件表示の場合trueを指定
	 */
	this.save_showstate = function (dispall) {
		if (dispall) {
			$.cookie( 'wgtrecnt_showstate_'+ this.store, '1', WGTRECENT_COOKIE_CONFIG );
		} else {
			$.cookie( 'wgtrecnt_showstate_'+ this.store, null, WGTRECENT_COOKIE_CONFIG );
		}
	};

	/**
	 * 折りたたみ表示の設定をクッキーから取得する.
	 * @return 全件表示の場合true
	 */
	this.load_showstate = function () {
		return (!! $.cookie('wgtrecnt_showstate_'+ this.store) );
	};
	
	/**
	 * 表示エリアの商品数を取得する.
	 * @param target
	 * @return
	 */
	this.get_itemcount = function () {
		var items = this.content_div.children('[class=wgt_item]');
		
		return (!! items) ? items.length : 0;
	};
	
	/**
	 * 「すべて表示」「５件のみ表示」の表示を更新する.
	 * @return
	 */
	this.refresh_content = function () {
		// 商品件数が既定以下なら表示折りたたみボタンを非表示としてイベント設定も不要
		if ( this.get_itemcount() <= wgtrecent_default_count ) {
			this.btn_show.hide();
			this.btn_hide.hide();
			
			return;
		}
		
		// 折りたたみ表示の初期化（クッキーに保持されている設定で復元）
		if ( this.load_showstate() ) {
			this.btn_show.click();
		} else {
			this.btn_hide.click();
		}
	};
	
	/**
	 * サーバーからのデータ取得成功時コールバック.
	 * @param json
	 * @param status
	 */
	this.query_ok = function (json, status) {
		// TODO エラー確認など

		var self = WgtRecent.get(store);
		// 既存の表示をクリア
		self.content_div.html('');
		
		// 戻りデータを画面へ反映
		for ( var i=1; i <= json.count; i++ ) {
			// 商品情報を生成し、表示欄の子要素として追加する.
//			self.item_template.children('img', 'a').attr('src', json['iconurl_'+i]);
//			self.item_template.children('a:eq(1)').html( json['name_'+i]);
//			self.item_template.children('a').attr('href', json['url_'+i]);
			$('img', self.item_template).attr('src', json['iconurl_'+i]);
			$('[class=item_name]', self.item_template).html(json['name_'+i]);
			$('a', self.item_template).attr('href', json['url_'+i]);
			
			var inner = self.item_template.clone();

			inner.removeAttr('id');			
			if ( i <= wgtrecent_default_count ) {
				inner.css('display', '');
			}
			
			self.content_div.append(inner);
		}
		
		// 商品リストの折りたたみ状態と「すべて表示」「５件のみ表示」ボタンの初期化
		self.refresh_content();
	};

	/**
	 * サーバーアクセスエラー時コールバック.
	 * ウィジェットのリスト表示欄にエラーメッセージを表示する.
	 * @param status
	 */
	this.query_ng = function (status) {
		var self = WgtRecent.get(store);

		// エラー表示
		self.content_div.html('ただいま、<br />ご利用できません。');
		
		self.btn_show.hide();
		self.btn_hide.hide();
	};
	
	/**
	 * サーバーへアクセスし、最近チェックした商品データを更新・取得する.
	 * @param maddr String メールアドレス
	 * @param self WgtRecent 必ず自分を指定する
	 * @return
	 */
	this.query_bymail = function (maddr) {
		var self = WgtRecent.get(store);
		
		var params  = 'maddr='+ maddr;
		params += '&'
		params += 'ikey='+ self.ikey;
		params += '&'
		params += 'store='+ self.store;
		params += '&'
		params += 'guid='+ wgtrecent_guid;		// グローバル変数を参照
		    
		// recent.cgi 呼び出し
		$.jsonp( { 
			url       : 'http://ssl.m2plus.com/cgi-bin/user/recent.cgi?'+ params + '&callback=?',
			success   : self.query_ok,
			error     : self.query_ng,
			cache     : false,
			pageCache : false
		} );
	};
	
	/**
	 * GUIDを指定してサーバーから最近チェックした情報を更新・取得する.
	 * @return
	 */
	this.query_byguid = function () {
		var self = WgtRecent.get(store);
		
		var params = 'guid='+ wgtrecent_guid;
		params += '&'
		params += 'ikey='+ self.ikey;
		params += '&'
		params += 'store='+ self.store;
		
		// recent.cgi 呼び出し
		$.jsonp( { 
			url       : 'http://ssl.m2plus.com/cgi-bin/user/recent.cgi?'+ params +'&callback=?',
			success   : self.query_ok,
			error     : self.query_ng,
			cache     : false,
			pageCache : false
		} );
	};
	
	/**
	 * ログイン時に呼び出されるコールバック.
	 * (ログインもジュールのコメントも参照)
	 * GUIDに関する処理は外部関数を呼び出しています。
	 * @param user
	 */
	this.login_callback = function (user) {
		// GUIDをクッキーからロード(無ければ空データで処理)
		wgtrecent_load_guid();

		// メールアドレス(アカウント)指定でサーバーアクセス
		WgtRecent.get(store).query_bymail(user.maddr);

		// GUIDのクリア
		wgtrecent_clear_guid();
	};

	/**
	 * ログアウト時に呼び出されるコールバック.
	 * @param store ストア識別ID
	 * @return
	 */
	this.logout_callback = function () {
		// GUIDをクッキーからロード(無ければ新規作成)
		wgtrecent_load_guid() || wgtrecent_generate_guid();
		
		// GUID指定でサーバーアクセス
		WgtRecent.get(store).query_byguid();
	};

	
	// ----- 初期化処理 -----
	
	// すべて表示ボタンイベント設定
	this.btn_show.click( 
		function(e){
			var self = WgtRecent.get(store);

			self.show_all();
			self.save_showstate(true);
			
			self.btn_show.hide();
			self.btn_hide.show();
			
			return false;
	    }
	);
	
	// ５件のみ表示ボタンイベント設定
	this.btn_hide.click( 
		function(e){
			var self = WgtRecent.get(store);
			
			self.show_narrow();
			self.save_showstate(false);
			
			self.btn_show.show();
			self.btn_hide.hide();
			
			return false;
	    }
	);
	
	// ログイン・ログアウトコールバックを設定する(初期化完了後いずれかが実行される。ログインモジュールのコメントも参照。)
	m2plogin_add_logincallback( WgtRecent.get(store).login_callback );
	m2plogin_add_logoutcallback( WgtRecent.get(store).logout_callback );
};	

/**
 * 生成したインスタンスを保持する格納容器.
 * WgtRecentのコンストラクタを呼ぶと、storeID : オブジェクト 形式で自動的に格納されます.
 */
WgtRecent.holder = {};

/**
 * ストア名を指定してインスタンスを取得する.
 * 外部モジュールや画面要素のコールバックで自分を渡したい際に使用する.
 */
WgtRecent.get = function(store) {
	return WgtRecent.holder[store];
};

// WgtRecent クラス定義ここまで



/**
 * 最近チェックした商品ウィジェットの初期化.
 * 表示エリアのHTML要素情報と、対象ストアなどをそれぞれ指定します。
 * 引数の商品idを指定するとその商品を「見た」ことになります。
 * 
 * @param content_div_id String		商品リストを表示するDIVのID.
 * @param item_template_id String	1商品のHTMLテンプレート領域のID.
 * @param btn_show_id String		[すべて表示]ボタンのID.
 * @param btn_hide_id String		[５件のみ表示]ボタンのID.
 * @param store String 対象ストア識別ID.
 * @param ikey String 対象商品識別ID.
 * @return
 */
function wgtrecent_init(content_div_id, item_template_id, btn_show_id, btn_hide_id, store, ikey) {
	// 指定ストア用の制御モジュールを生成
	var manager = new WgtRecent(content_div_id, item_template_id, btn_show_id, btn_hide_id, store, ikey);
}

/**
 * GUIDがクッキーに保存されていれば復元する.
 * @return String GUID (クッキーに存在しない場合は空文字列)
 */
function wgtrecent_load_guid() {
	wgtrecent_guid = $.cookie('wgtrecent_guid') || '';
	return wgtrecent_guid;
}

/**
 * GUIDを生成する（仮）.
 * @return 
 */
function wgtrecent_generate_guid() {
	// 新規GUIDの生成.
	wgtrecent_guid = UUID.generate().toString();
	// クッキーへ保存
	$.cookie( 'wgtrecent_guid', wgtrecent_guid, WGTRECENT_COOKIE_CONFIG )
	
	return wgtrecent_guid;
}

/**
 * GUIDをクリアする.
 * 専用変数とクッキーからクリアします
 * @return
 */
function wgtrecent_clear_guid() {
	wgtrecent_guid = '';
	$.cookie( 'wgtrecent_guid', null, WGTRECENT_COOKIE_CONFIG )	
}

