

/**
 * Ajaxカートスクリプト
 *
 * ver 1.00		2011.02.13 / Shinya Chitose
 *
 * 	アニメーション関数（playAnimation）を追加。
 * 	FireFoxでresponseXMLが4096byteで分割されてしまうことで
 * 	Ajaxカートが途中から切れたり、HTMLタグが文字化けする問題を解決。
 *
 * ver 1.00		2010.11.16 / Shinya Chitose
 *
 * 	初版。
 *
 * @author		Shinya Chitose <chitose@dispatch-base.com>
 * @copyright	Dispatch Base Sole Proprietorship.
 */


// クラスを以下の変数名で定義する
var EdAjaxCart	= new _DjcAjaxCart();

// jQueryが読み込まれていたら、
// マウス座標を取得するトリックを組み込む。
if (typeof(jQuery) == 'function') {
	/**
	 * 当初は$(xx).clickで指定していたが、
	 * EdAjaxCart.playAnimation よりも後に座標が記録されてしまうので
	 * clickよりも早いタイミングで実行されるmouseoverに変更した。
	 */
	$(document).ready(function(){
		$("input[name^=ajaxButton][type=button]").mouseover(function(e){
			EdAjaxCart.mouseY	= e.clientY;
		});
	});
}

// 変数名・関数名バッティング防止の為、カプセル化する
function _DjcAjaxCart()
{
	
	/**
	 * 「買い物かごへ」をクリックした時の座標を記録しておく変数
	 *
	 * @access	public
	 * @var		integer
	 */
	this.mouseY;
	
	
	/**
	 * コンストラクタ
	 *
	 * @access	private
	 * @return	void
	 */
	this.constructor = function ()
	{
		this.url	= 'http://dev.dispatch-base.com/numajiri2ecdespx2'
					+ '/dsa/exclusive/converter/ajax_cart.php';
		
		/*@cc_on
		@if (@_jscript_version >= 5)
			try {
				this.objXmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					this.objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (E) {
					this.objXmlHttp = false;
				}
			}
		@else
			this.objXmlHttp = false;
		@end @*/
		
		if (! this.objXmlHttp && typeof(XMLHttpRequest) != 'undefined') {
			try {
				this.objXmlHttp = new XMLHttpRequest();
				this.objXmlHttp.overrideMimeType("text/xml"); 
			} catch (e) {
				this.objXmlHttp = false;
			}
		}
		
		// アニメーション画像のID属性
		this.animationImgId	= 'animationImgIdFromJquery';
	}
	
	
	/**
	 * Ajaxカートを更新する。
	 *
	 * @access	public
	 * @param	object		送信するフォームのname属性
	 * @return	void
	 */
	this.update = function (formName)
	{
		var i, elements;
		
		// 引数をクラス変数に登録
		this.Oform	= document.forms[formName];
		
		// 指定フォーム内のPOSTデータをコピーする。
		this.postData	= '';
		for (i = 0; i < this.Oform.elements.length; i++) {
			elements		 = this.Oform.elements[i];
			this.postData	+= '&' + elements.name + '='
							// 全てをエンコードする encodeURIComponent関数を使う。
							// http://javascript.dohow.jp/blog/2007/12/encodeuri.html
							+ encodeURIComponent(elements.value);
		}
		
		this.url	= this.Oform.action;
		
		// 何故かwww.ver2demo.ec-despx.comがver2demo.ec-despx.comになってしまい
		// 「書き込みできません」エラーが発生したので置換
		this.url	= this.url.replace('//ver2demo', '//www.ver2demo');
		
		// Ajax通信用のPHPにPOSTデータを送信する。
		this.objXmlHttp.open(
			'POST', this.url + '?' + this._addTimestamp(), true
		);
		this.objXmlHttp.setRequestHeader(
			'content-type',
			'application/x-www-form-urlencoded;charset=UTF-8'
			);	// ↑がないと正しくPOST通信できない。
		this.objXmlHttp.send(this.postData);
		
		// onreadystatechange にはカプセル化された関数を代入できない為、プライベート関数を呼び出す
		this.objXmlHttp.onreadystatechange = _rewriteHtmlWithAjaxCartResponse;
	}
	
	// delete は使えない
	this.del = function (formName, productSeq)
	{
		if (productSeq == 'all') {
			this.url	= document.forms[formName].action + '?clearCart=1'
						+ this._addTimestamp();
		} else {
			this.url	= document.forms[formName].action + '?deleteId=' +  encodeURIComponent(productSeq)
						+ this._addTimestamp();
		}
		// 何故かwww.ver2demo.ec-despx.comがver2demo.ec-despx.comになってしまい
		// 「書き込みできません」エラーが発生したので置換
		this.url	= this.url.replace('//ver2demo', '//www.ver2demo');
		
		this.objXmlHttp.open(
			'GET', this.url, true
		);
		// onreadystatechange にはカプセル化された関数を代入できない為、プライベート関数を呼び出す
		this.objXmlHttp.onreadystatechange = _rewriteHtmlWithAjaxCartResponse;
		
		this.objXmlHttp.send(null);
	}
	
	
	
	/**
	 * タイムスタンプを追加する
	 *
	 * 	Ajax通信する際にURIが同じだとキャッシュが残る可能性が高いので
	 * 	a.com/ → a.com/?ts=[現在時刻] とすることで
	 * 	キャッシュを残さず処理するようにする。
	 *
	 * @access	private
	 * @return	void
	 */
	this._addTimestamp = function ()
	{
		var ret	= new Date();
		ret		= ret.getTime();
		ret		= '&ts=' + ret;
		return ret;
	}
	
	
	/**
	 * 画像をカートに入れたように見せかけるアニメーション
	 *
	 * @access		public
	 * @param		string		オブジェクトID
	 * @reference	http://hkom.blog1.fc2.com/blog-entry-567.html
	 * @reference	http://www.mikage.to/jquery/jquery_ref.html
	 * @reference	http://www.zachstronaut.com/posts/2009/08/07/jquery-animate-css-rotate-scale.html
	 * @return		void
	 */
	this.playAnimation = function (baseImgId)
	{
		// jQueryモジュールがなければ処理しない。
		if (typeof(jQuery) !== 'function') { return; }
		
		// 先にアニメーション中のオブジェクトがあった場合、削除する。
		$('#'+this.animationImgId).remove();
		
		// アニメーションを開始させる親要素（DIV）のID
		var animationFrame	= baseImgId.replace('imgForAjax', 'ajaxImgFrame');
		
		// 商品のメイン画像をアニメーションフレームに子要素として追加する。
		var img		= $('#'+baseImgId).clone().appendTo('#'+animationFrame);
		
		// クローン要素にはIDが指定されていないので、追加する。
		img.attr('id', this.animationImgId);
		
		// 画像の位置を取得
		var topMove	= 0;
		topMove	= this.mouseY - 350;
		topMove	= (0 < topMove ) ? topMove : 0;
		
		// CSSをセットし、アニメーション開始
		img.css('position', 'absolute');
		img.css('top', '0');
		img.animate( { rotate: '+=720deg', left: 550, top: '-'+topMove+'px', width: 50, opacity: 0.0}, 800);
		
		// setTimeout関数を指定しても、アニメーションせず
		// すぐに消えてしまうので、jQuery.timersを使用した。
		$(document).oneTime(1000, function(){ img.remove();});
	}
	
	
	// コンストラクタを実行
	this.constructor();
	return this;
	
}


// ========================== 以下、プライベート関数 ===========================


/**
 * Ajax通信のレスポンスから画面を更新する。
 *
 * @access	private
 * @return	void
 */
_rewriteHtmlWithAjaxCartResponse = function ()
{
	// グローバル変数をコピーする。
	var myCls	= EdAjaxCart;
	
	/**
	 * XMLを読み込みできない場合は処理中断
	 *
	 * if (! (myCls.objXmlHttp.readyState == 4 && typeof(myCls.objXmlHttp.responseText) == 'string'))
	 *
	 * statusを見ると、mozilla でハングするので responseText を判別するようにしてみたが、
	 * Netscape 7.1 以下では問題を解決できないので、一般的な status == 200 で対応
	 */
	if (! (myCls.objXmlHttp.readyState == 4 && myCls.objXmlHttp.status == 200)) { return false; }
	
	var xml = myCls.objXmlHttp.responseXML;
	
	// データ取得に失敗した場合は処理中断
	if (! xml.documentElement) { return false; }
	
	// 2011.02.13 FireFoxの4096byte分割問題回避
	// @reference	http://www.trekdevel.net/archives/24
	if (typeof(xml.normalize) != "undefined") {
		// 下記のメソッドを実行すると分割されたノードを結合できるらしい。
		xml.normalize();
	}
	
	// カートフレームを上書きする。
	document.getElementById('ajaxCart').innerHTML
		= xml.getElementsByTagName('cart_html').item(0).firstChild.data;
	
	// colorBlendモジュールが読み込まれている場合のみ直近に追加したカートを点滅させる
	if (typeof(jQuery.fn.colorBlend) == 'function') {
		$(".LatestAdd td").colorBlend(
			[{colorList:["white", "skyblue"],fps:24, cycles:2,param:"background-color"}]
		);
	}
	
	return true;
}


