// カートウィジェット制御JavaScript
//
// 本スクリプトは以下のライブラリに依存します。
//    jquery.js
//    jquery.cookie.js
//    m2plib.js
//    m2plogin.js
//
// 本スクリプトはカートウィジェットのUI制御を実装しており、
// ショッピングカートの実態は サーバーのcarthandle.cgi で実装しています。
// (旧版はカートをjavascriptで実装していましたが、サーバー実装に変更されています) 
//
// 本スクリプトの利用者はページ表示の最初に wgtcart_initを呼び出す必要があります。
//
// 注文確認画面（決済画面）への遷移は、必ずログイン画面を経由します。
// その際、カートの内容や認証情報は、formのデータではなく セッション情報によって
// ログイン後の画面のcgiへ引き渡されます。
//
// また、注文（決済）完了後にカートの内容をクリアするのは、本スクリプトの
// 責任範囲外となります。

/**
 * カートにデフォルト表示する最大注文数.
 * (越えると省略され、[すべて表示する]が表示される)
 */
var WGTCART_MAX_DISPLAY = 5;

/**
 * カートに入れることのできる商品の最大数.
 */
var WGTCART_MAX_AMOUNT  = 999;

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

/**
 * 処理中フラグ.
 */
var wgtcart_busyflg = false;

/**
 * カート内容をすべて表示するかどうかのモードフラグ.
 * (値はクッキーに保持・復元されます)
 */
var wgtcart_allflg = false;


/**
 * ショッピングカートの初期化.
 * 画面表示の際に、一度だけ呼ばれることを想定しています。
 * 
 * サーバーでエラーメッセージが設定されている場合は alertダイアログを表示するため、
 * 他のウィジェットなどを初期化した後に実行する事を推奨します。
 * (画面の表示が崩れた状態になるとまずいため)
 * 
 * @param backurl String カート操作後にリダイレクトするURL。省略すると現在ページ
 */
function wgtcart_init(backurl) {
	wgtcart_busyflg = true;
	
	// 自身の表示情報をクッキーからロード.
	wgtcart_loadcookie();

	// ５件・全件表示更新
	wgtcart_refresh();
	
	// ボタン・リンクへのイベント設定
	$('#wgt_cart_showall').click( wgtcart_showall );
	$('#wgt_cart_showmin').click( wgtcart_showmin );
	$('#wgt_cart_removeall').click( wgtcart_clearall );
	
	var url = (!! backurl) ? backurl : wgtcart_url();
	
	$('#wgt_cart_control [name=backurl]').val( url );
	$('#wgt_cart_form [name=backurl]').val( url );
	$('#wgt_cart_paybtn').click( function() { $('#wgt_cart_form').submit(); } );
	
	// 明細のボタン・リンクへのイベント設定
	for (var i=1; i <= wgtcart_linecount(); i++) {
		$('#wgt_cart_inc_' + i).click( wgtcart_increase );
		$('#wgt_cart_dec_' + i).click( wgtcart_decrease );
		$('#wgt_cart_del_' + i).click( wgtcart_remove );
	}
	
	wgtcart_busyflg = false;
	
	// ログインモジュールへのイベント登録
	m2plogin_add_logincallback( wgtcart_login );
	m2plogin_add_logoutcallback( wgtcart_logout );	

	// エラーメッセージの表示(サーバーでセットされていたら)
	wgtcart_showerror();
}

/**
 * 現在ページのURLを、余分なパラメータ無しで取得する.
 * (cgiに渡すパラメータ backurlの値となるURL文字列を想定)
 */
function wgtcart_url() {
	var url = location.href;

	// cgiの場合は t=xxxの後ろを除去
	if ( url.indexOf('.cgi') > 0 ) {
		var locparam = url.indexOf('&t=');
		
		if ( locparam >= 0 ) {
			return url.substring( 0, locparam );
		} else {
			return url;
		}		
	}

	// htmlの場合は単純にクエリ文字列を取り除く
	var locparam = url.indexOf( '?' );

	if ( locparam >= 0 ) {
		return url.substring( 0, locparam );
	} else {
		return url;
	}		
}

/**
 * カートの商品件数（合計個数なので、明細行数ではない点に注意).
 * @return Number 件数
 */
function wgtcart_count() {
	var target = $('#wgt_cart_totalcount');
	
	if ( ! target.attr('id') ) {
		return 0;
	}
	
	return Number( $('#wgt_cart_totalcount').html() );
}

/**
 * カートの明細行数.
 * @return Number 明細行数
 */
function wgtcart_linecount() {
	return  $('#wgt_cart_exist').find('.cart_item').length;
}

/**
 * 明細の指定行の商品ID(ikey)を取得する.
 * @paran num String 明細行番号
 */
function wgtcart_lineikey(num) {
	return $('#wgt_cart_ikey_' + num).html();
}

/**
 * DOM idから末尾の数字を取得する.
 */
function wgtcart_cropnumber(id) {
	if ( ! id || id.lastIndexOf('_') < 0 ) {
		return '';
	}
	
	return id.substring( id.lastIndexOf('_') +1 );
}

/**
 * カートの折りたたみ表示(５件・全件)を再描画.
 * @return
 */
function wgtcart_refresh() {
	// 商品なし
	if ( wgtcart_linecount() == 0 ) {
		$('#wgt_cart_listcontrol').hide();
		return;
	}

	// ５件以下の場合は表示不要
	if ( wgtcart_linecount() <= WGTCART_MAX_DISPLAY ) {
		$('#wgt_cart_listcontrol').hide();
		return;
	} 

	$('#wgt_cart_listcontrol').show();
	wgtcart_refresh_impl();
}

/**
 * カートの折りたたみ表示制御（実装）.
 */
function wgtcart_refresh_impl() {
	if (wgtcart_allflg) {
		$('#wgt_cart_exist').children('.cart_item').show();
		
		$('#wgt_cart_showall').hide();
		$('#wgt_cart_showmin').show();
	} else {
		$('#wgt_cart_exist').children('.cart_item:gt(4)').hide();

		$('#wgt_cart_showall').show();
		$('#wgt_cart_showmin').hide();
	}	
}

/**
 * 全件表示へ変更する.
 */
function wgtcart_showall() {
	wgtcart_allflg = true;
	wgtcart_savecookie();
	
	wgtcart_refresh_impl();
}

/**
 * ５件表示へ変更する.
 */
function wgtcart_showmin() {
	wgtcart_allflg = false;
	wgtcart_savecookie();
	
	wgtcart_refresh_impl();
}


/**
 * カートに商品を追加する.
 * @param ikey String 商品ID
 * @return 
 */
function wgtcart_add(ikey) {

	var url = 'http://' + location.hostname + '/crosssell.html';

	if ( wgtcart_busyflg ) return;
	
	wgtcart_busyflg = true;
	
	if ( wgtcart_checkmax() ) {

	  if ( $('#alpha_item').size() > 0 ) {
	      $('#wgt_cart_control [name=backurl]').val( url );
	      $('#wgt_cart_form [name=backurl]').val( url );
	  }
	  $('#wgt_cart_control [name=cmd]').val( 'ADD' );
	  $('#wgt_cart_control [name=ikey]').val( ikey );
	  $('#wgt_cart_control').submit();
	}
	
	// フラグのクリアはリダイレクトに任せる.
}


/**
 * カート内の商品数が最大値に到達していないかどうかのチェック.
 * 商品を追加可能な場合にtrueを返します。
 * @return boolean 最大数に達していない場合true
 */
function wgtcart_checkmax() {
	if ( wgtcart_count() >= WGTCART_MAX_AMOUNT ) {
		alert('カートの商品数が限度数('+ WGTCART_MAX_AMOUNT +')に達しています。' +"\n"+ 'お手数ですが２回にわけてご購入ください。');
		return false;
	}
	
	return true;
}

/**
 * カートの商品を１減らす.
 * @return
 */
function wgtcart_decrease() {
	if ( wgtcart_busyflg ) return;
	
	wgtcart_busyflg = true;

	var num = wgtcart_cropnumber( this.id );

	$('#wgt_cart_control [name=cmd]').val( 'SUB' );
	$('#wgt_cart_control [name=ikey]').val( wgtcart_lineikey(num) );
	$('#wgt_cart_control').submit();

	// フラグのクリアはリダイレクトに任せる.
}

/**
 * カートの商品を１増やす.
 * @return
 */
function wgtcart_increase() {
	if ( wgtcart_busyflg ) return;
	
	wgtcart_busyflg = true;
	
	var num = wgtcart_cropnumber( this.id );

	if ( wgtcart_checkmax() ) {
		$('#wgt_cart_control [name=cmd]').val( 'ADD' );
		$('#wgt_cart_control [name=ikey]').val( wgtcart_lineikey(num) );
		
		$('#wgt_cart_control').submit();
	}

	// フラグのクリアはリダイレクトに任せる.
}

/**
 * カートから商品を削除する
 */
function wgtcart_remove() {
	if ( wgtcart_busyflg ) return;
	
	wgtcart_busyflg = true;

	var num = wgtcart_cropnumber( this.id );

	$('#wgt_cart_control [name=cmd]').val( 'DEL' );
	$('#wgt_cart_control [name=ikey]').val( wgtcart_lineikey(num) );
	$('#wgt_cart_control').submit();

	// フラグのクリアはリダイレクトに任せる.
}

/**
 * カート内容をすべて削除する.
 * @return
 */
function wgtcart_clearall() {
	if ( wgtcart_busyflg ) return;
	
	wgtcart_busyflg = true;
		
	if ( confirm('カートの商品をすべて削除します。よろしいですか？') ) {
		$('#wgt_cart_control [name=cmd]').val( 'CLR' );
		$('#wgt_cart_control').submit();
	} else {
		wgtcart_busyflg = false;	
	}

	// 削除実行の場合、フラグのクリアはリダイレクトに任せる.
}

/**
 * カート表示情報をクッキーへ保存.
 */
function wgtcart_savecookie() {
	$.cookie( 'wgtcart_allflg',    (wgtcart_allflg    || ''), WGTCART_COOKIE_CONFIG);
}

/**
 * クッキーから情報を復元.
 * @return
 */
function wgtcart_loadcookie() {
	wgtcart_allflg    = $.cookie('wgtcart_allflg')    || false;
}

/**
 * ログアウト処理のコールバック関数.
 * ログインモジュールにイベント登録する関数です.
 * @return
 */
function wgtcart_logout() {
	// ユーザーのメールアドレスを消す
	$('#wgt_cart_form [name=maddr]').val( '' );
}
/**
 * ログイン処理のコールバック関数.
 * ログインモジュールにイベント登録する関数です.
 * @return
 */
function wgtcart_login(json) {
	// ユーザーのメールアドレスを消す
	$('#wgt_cart_form [name=maddr]').val( json.maddr );
}

/**
 * サーバーでエラーメッセージがセットされている場合ダイアログを表示する.
 */
function wgtcart_showerror() {
	var msg = jQuery.trim( $('#wgt_cart_errmsg').html() );
	
	if ( !! msg && msg.length > 0 ) {
		alert(msg);
	}
}


