//==========================================================
//	ファイル名称	：favorite_list.js
//	ファイル略称	：お気に入りリスト制御用JavaScriptファイル
//	処理概要		：クッキー管理により、お気に入りリストの制御を行う。
//					：（商品コード、商品名称、画像URL情報を管理）
//					：※．要prototype.js、scriptaculous.js
//					：※．PHPSPOT開発日誌さんのcookiemanager.jsのソースを含んでいます。
//	作成日			：2007/03/24
//	作成者			：Copyright (C) 2007 rakupla.com - All Rights Reserved
//	更新履歴		：-
//==========================================================

// 汚いソースですが、もしも参考にしてご自身のサイトで使用される場合には、
// http:rakupla.com/ へのリンクを貼っていただけるとうれしいです。


// 【Function一覧】
// ① FavoriteList_Load			onLoadイベント時に呼び出され、お気に入りリストをクッキーから読み込み、表示する。
// ② FavoriteList_Save			onUnLoadイベント時に呼び出され、お気に入りリストをクッキーへ保存する。
// ③ FavoriteList_Add			パラメータで指定された情報をお気に入りリストへ追加する。
// ④ FavoriteList_Clear		お気に入りリストから１件削除する。
// ⑤ FavoriteList_ClearAll		お気に入りリストを全件削除する。


// 【使用手順】
/*
	手順①：外部ファイル読み込み
		<script type="text/javascript" src="/bin_js/prototype.js"></script>
		<script type="text/javascript" src="/bin_js/scriptaculous/scriptaculous.js"></script>
		<script type="text/javascript">
			var myStartEffect = function(element) {
				element._opacity = Element.getOpacity(element);
				new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
				//new Effect.Highlight(element, {});
			}
		</script>
	手順②：表示先 要素
		<ul id="[お気に入りリスト 親要素ID]"></ul>
	手順③：onLoad、onUnLoadイベントハンドリング
		<script language="javascript">
			window.onload = function() {
				FavoriteList_Load( '[お気に入りリスト 親要素ID]' );			// クッキーから読み出し（＆表示）
			}
			window.onunload = function() {
				FavoriteList_Save( '[お気に入りリスト 親要素ID]' );			// クッキーへ保存
			}
		</script>
		
		※．例えばブラウザの戻るボタンで戻った場合にも処理が行われるようにする為、読み込みはonLoadイベントで行うのが良さそうです
*/





// 							cookiemanager.jsソース
// ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
/* Browser Detection
----------------------------------------------------------------------------- */
var _BROWSER_IS_IE =
    (document.all
     && window.ActiveXObject
     && navigator.userAgent.toLowerCase().indexOf("msie") > -1
     && navigator.userAgent.toLowerCase().indexOf("opera") == -1);

/**
 * I hate navigator string based browser detection too, but when Opera alone
 * chokes on cookies containing double quotes...
 */
var _BROWSER_IS_OPERA =
    (navigator.userAgent.toLowerCase().indexOf("opera") != -1);

/* CookieManager Object
----------------------------------------------------------------------------- */
/**
 * Provides a simple interface for creating, retrieving and clearing cookies.
 *
 * @author Jonathan Buchanan
 * @version 0.8
 * @dependencies $() in Core.js
 */
CookieManager = Class.create();
CookieManager.prototype =
{
    /**
     * Determines if this object will use IE's proprietary userData behaviour
     * instead of cookies for storage.
     */
    userDataForIE: false,

    initialize: function(userDataForIE)
    {
        this.cookieShelfLife = 365;
        this.userDataForIE = userDataForIE;

        // Internet Explorer has a cookie handling bug - if the *combined size*
        // of all cookies stored for a given domain is greater than 4096 bytes,
        // document.cookie will return an empty string. Until this is fixed , we
        // will fall back on IE's proprietary userData behaviour.
        if (_BROWSER_IS_IE && this.userDataForIE)
        {
            this.IE_CACHE_NAME = "storage";
            if ($(this.IE_CACHE_NAME) == null)
            {
                var div = document.createElement("DIV");
                div.id = this.IE_CACHE_NAME;
                document.body.appendChild(div);
            }
            this.store = $(this.IE_CACHE_NAME);
            this.store.style.behavior = "url('#default#userData')";
        }
    },

    /**
     * Returns the value of a cookie with the given name, or <code>null</code>
     * if no such cookie exists.
     */
    getCookie: function(aCookieName)
    {
        var result = null;
        if (_BROWSER_IS_IE && this.userDataForIE)
        {
            this.store.load(this.IE_CACHE_NAME);
            result = this.store.getAttribute(aCookieName);
        }
        else
        {
            for (var i = 0; i < document.cookie.split('; ').length; i++)
            {
                var crumb = document.cookie.split('; ')[i].split('=');
                if (crumb[0] == aCookieName && crumb[1] != null)
                {
                    result = crumb[1];
                    break;
                }
            }
        }

        if (_BROWSER_IS_OPERA && result != null)
        {
            result = result.replace(/%22/g, '"');
        }

        result = unescape(  result);															// デコード処理を追加		by Rakupla.com
        return result;
    },

    /**
     * Sets a cookie with the given name and value.
     */
    setCookie: function(aCookieName, aCookieValue)
    {
        aCookieValue = escape(aCookieValue);												// エンコード処理を追加		by Rakupla.com

        if (_BROWSER_IS_IE && this.userDataForIE)
        {
            this.store.setAttribute(aCookieName, aCookieValue);
            this.store.save(this.IE_CACHE_NAME);
        }
        else
        {
            if (_BROWSER_IS_OPERA)
            {
                aCookieValue = aCookieValue.replace(/"/g, "%22");
            }
            var date = new Date();
            date.setTime(date.getTime() + (this.cookieShelfLife * 24*60*60*1000));
            var expires = '; expires=' + date.toGMTString();
            document.cookie = aCookieName + '=' + aCookieValue + expires + '; path=/';
        }
    },

    /**
     * Clears the cookie with the given name.
     */
    clearCookie: function(aCookieName)
    {
        if (_BROWSER_IS_IE && this.userDataForIE)
        {
            this.store.load(this.IE_CACHE_NAME);
            this.store.removeAttribute(aCookieName);
            this.store.save(this.IE_CACHE_NAME);
        }
        else
        {
            document.cookie =
                aCookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
        }
    }
}
// ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲




	//----------------------------------------------------------
	//		グローバル変数宣言＆初期設定
	//----------------------------------------------------------
	var manager		= new CookieManager();			// Cookie Manager オブジェクト生成
	
	
	//----------------------------------------------------------
	//	処理名称	：FavoriteList_Load
	//	処理略称	：お気に入りリスト初期ロード処理
	//	処理概要	：onLoadイベント時に呼び出され、お気に入りリストをクッキーから読み込み、表示する。
	//	パラメータ	：① arg_Id					お気に入りリスト 親要素ID
	//	復帰値		：-
	//	作成日		：2007/03/24
	//	作成者		：Copyright (C) 2007 rakupla.com - All Rights Reserved
	//	更新履歴	：-
	//----------------------------------------------------------
	function FavoriteList_Load( arg_Id )
	{
		var str_Html			= '';
		$(arg_Id).innerHTML		= '';
		
		// ① クッキーから取得した文字列を",,"で分割し、配列へ格納（最大0-9の10要素分）
		var arr_ItemCode	=	manager.getCookie('ItemCode').split(',,').slice(0,10);
		var arr_ItemName	=	manager.getCookie('ItemName').split(',,').slice(0,10);
		var arr_ImageUrl	=	manager.getCookie('ImageUrl').split(',,').slice(0,10);
		
		if ( arr_ItemCode && 'null' != arr_ItemCode[0] )
		{
			for ( i=0; i<arr_ItemCode.length; i++ )
			{
				str_Html	= '<li style="width:100%; padding:2px 0 5px 0; cursor:s-resize; color:#f0f0f0; font-size:9px;" onmouseover="this.style.background=\'#004BC8\';" onmouseout="this.style.background=\'\';">';
				str_Html	+= '<span style="float:right; cursor:pointer;" onclick="FavoriteList_Clear(\'' + arg_Id + '\',this.parentNode);">[×]</span>';
				str_Html	+= '<img src="' + arr_ImageUrl[i] + '" onerror="this.src=\'/bin_images/now_printing_middle.png\';"></img>';
				str_Html	+= '<br>';
				str_Html	+= '<a href="/item/' + arr_ItemCode[i] + '.html" style="color:#f0f0f0; font-size:9px;" alt="クリア">' + arr_ItemName[i] + '</a>';
				str_Html	+= '<input type="hidden" name="ItemCode" value="' + arr_ItemCode[i] + '"></input>';
				str_Html	+= '<input type="hidden" name="ItemName" value="' + arr_ItemName[i] + '"></input>';
				str_Html	+= '<input type="hidden" name="ImageUrl" value="' + arr_ImageUrl[i] + '"></input>';
				str_Html	+= '</li>';
				$(arg_Id).innerHTML += str_Html;
			}
			
			str_Html	= '<br style="clear: both;">';
			$(arg_Id).innerHTML += str_Html;
			
			// ULタグのSortable指定（script.aculo.usの機能）
			Sortable.create(arg_Id, {
				starteffect:myStartEffect,
				delay:500
			});
		}
		
		return;
	}
	
	
	//----------------------------------------------------------
	//	処理名称	：FavoriteList_Save
	//	処理略称	：お気に入りリスト保存処理
	//	処理概要	：onUnLoadイベント時に呼び出され、お気に入りリストをクッキーへ保存する。
	//	パラメータ	：① arg_Id					お気に入りリスト 親要素ID
	//	復帰値		：-
	//	作成日		：2007/03/24
	//	作成者		：Copyright (C) 2007 rakupla.com - All Rights Reserved
	//	更新履歴	：-
	//----------------------------------------------------------
	function FavoriteList_Save( arg_Id )
	{
		var str_ItemCode = '';
		var str_ItemName = '';
		var str_ImageUrl = '';
		
		// お気に入りリスト（LIタグ）を配列へ格納
		var str_NodeList	= $(arg_Id).getElementsByTagName('li');
		var arr_Nodes		= $A(str_NodeList);
		
		// 変数へ格納してゆく
		arr_Nodes.each( function( node ){
			// ２回転目以降は、区切り文字として",,"を挿入
			if ( '' != str_ItemCode )
			{
				str_ItemCode	+= ',,';
				str_ItemName	+= ',,';
				str_ImageUrl	+= ',,';
			}
			
			var arr_Input	= node.getElementsByTagName('input');
			str_ItemCode	+= $A(arr_Input)[0].value;
			str_ItemName	+= $A(arr_Input)[1].value;
			str_ImageUrl	+= $A(arr_Input)[2].value;
		});
		
		// クッキーへ格納
		manager.setCookie('ItemCode', str_ItemCode);			// 商品コード
		manager.setCookie('ItemName', str_ItemName);			// 商品名称
		manager.setCookie('ImageUrl', str_ImageUrl);			// 画像URL
		
		return;
	}
	
	
	//----------------------------------------------------------
	//	処理名称	：FavoriteList_Add
	//	処理略称	：お気に入りリスト追加処理
	//	処理概要	：パラメータで指定された情報をお気に入りリストへ追加する。
	//	パラメータ	：① arg_ItemCode			追加する商品コード 文字列
	//				：② arg_ItemName			追加する商品名称 文字列
	//				：③ arg_ImageUrl			追加する画像URL 文字列
	//				：④ arg_Id					お気に入りリスト 親要素ID
	//	復帰値		：-
	//	作成日		：2007/03/24
	//	作成者		：Copyright (C) 2007 rakupla.com - All Rights Reserved
	//	更新履歴	：-
	//----------------------------------------------------------
	// 【重要】当処理のようにLIタグ自体は新たに生成し直さないと、Sortableでエラーが出る
	function FavoriteList_Add( arg_ItemCode, arg_ItemName, arg_ImageUrl, arg_Id )
	{
		var str_Html;
		
		// お気に入りリスト（LIタグ）を配列へ格納
		var str_NodeList	= $(arg_Id).getElementsByTagName('li');
		var arr_Nodes		= $A(str_NodeList);
		
		// 最後尾の1件をここで落とす
		while( 9 < arr_Nodes.length)
		{
			arr_Nodes.pop();
		}
		
		// HTML作成
		// ① 今回追加分
		var str_Html_tmp_S	= '<li style="width:100%; padding:2px 0 5px 0; cursor:s-resize; color:#f0f0f0; font-size:9px;" onmouseover="this.style.background=\'#004BC8\';" onmouseout="this.style.background=\'\';">';

		var str_Html_tmp	= '<span style="float:right; cursor:pointer;" onclick="FavoriteList_Clear(\'' + arg_Id + '\',this.parentNode);">[×]</span>';
		str_Html_tmp	+= '<img src="' + arg_ImageUrl + '" onerror="this.src=\'/bin_images/now_printing_middle.png\';"></img>';
		str_Html_tmp	+= '<br>';
		str_Html_tmp	+= '<a href="/item/' + arg_ItemCode + '.html" style="color:#f0f0f0; font-size:9px;" alt="クリア">' + arg_ItemName + '</a>';
		str_Html_tmp	+= '<input type="hidden" name="ItemCode" value="' + arg_ItemCode + '"></input>';
		str_Html_tmp	+= '<input type="hidden" name="ItemName" value="' + arg_ItemName + '"></input>';
		str_Html_tmp	+= '<input type="hidden" name="ImageUrl" value="' + arg_ImageUrl + '"></input>';
		
		var str_Html_tmp_E	= '</li>';
		
		// 追加
		str_Html	= str_Html_tmp_S + str_Html_tmp + str_Html_tmp_E;
		
		// ② 元々表示されていた分	※．前述処理にて１件減らしてある状態
		arr_Nodes.each( function( node ){
			// 追加
			str_Html	+= str_Html_tmp_S + node.innerHTML + str_Html_tmp_E;
//					alert(node.nodeName + '■' + node.innerHTML);
		});
		
		
		// 作成したHTML文字列を格納する		※．上記②でのnode参照が終わったので、やっと元オブジェクトをいじれます
		$(arg_Id).innerHTML = str_Html;
		
		// ULタグのSortable指定（script.aculo.usの機能）
		Sortable.create(arg_Id, {
			starteffect:myStartEffect,
			delay:500
		});
		
		// 追加したエレメントを拡大しながら出現（script.aculo.usの機能）
//				var obj_FirstNode	= $(arg_Id).firstChild;
//				obj_FirstNode.visualEffect('Grow');
		return;
	}
	
	
	//----------------------------------------------------------
	//	処理名称	：FavoriteList_Clear
	//	処理略称	：お気に入りリスト削除処理
	//	処理概要	：お気に入りリストから１件削除する。
	//	パラメータ	：① arg_Id					お気に入りリスト 親要素ID
	//				：② arg_DelElement			削除対象の要素
	//	復帰値		：-
	//	作成日		：2007/03/24
	//	作成者		：Copyright (C) 2007 rakupla.com - All Rights Reserved
	//	更新履歴	：-
	//----------------------------------------------------------
	function FavoriteList_Clear( arg_Id, arg_DelElement )
	{
		// 縮小して消す（script.aculo.usの機能）
// 下記removeを待ち合わせないとeffect意味無し･･･
//		$(arg_DelElement).visualEffect('Squish');
		
		// 該当要素を削除（prototype.jsの機能）			※．outerHTML=''は、FireFoxで使用できない為、removeで！
		$(arg_DelElement).remove();
		
		return;
	}
	
	
	//----------------------------------------------------------
	//	処理名称	：FavoriteList_ClearAll
	//	処理略称	：お気に入りリスト全件削除処理
	//	処理概要	：お気に入りリストを全件削除する。
	//	パラメータ	：① arg_Id					お気に入りリスト 親要素ID
	//	復帰値		：-
	//	作成日		：2007/03/24
	//	作成者		：Copyright (C) 2007 rakupla.com - All Rights Reserved
	//	更新履歴	：-
	//----------------------------------------------------------
	function FavoriteList_ClearAll( arg_Id )
	{
		manager.clearCookie('ItemCode');
		manager.clearCookie('ItemName');
		manager.clearCookie('ImageUrl');
		// 一覧表示
		FavoriteList_Load( arg_Id );
		return;
	}



