/**
 * การใช้งาน plug-in ตัวนี้ เราไม่ต้องทำอะไรเลย  สิ่งที่ต้องทำคือกำหนด css ก่อนสำหรับ cart แล้วที่เหลือ script ตัวนี้จะจัดการเอง  ทั้งการ append cart เข้ากับ body ก็จะทำเองทั้งหมด
 * 
 * method ต่างๆ
 * $("div#myShoppingCart").data("ToggleFnc")() << เป็น method ที่จะเรียกสั่งให้ cart visible หรือ hide
 * $("div#myShoppingCart").data("addItem")(itemId)
 * 
 * ## การสร้างปุ่มสำหรับเปิด และปิด cart ##
 * ให้เรากำหนด html element ที่ต้องการให้กดเพือ เปิดปิด cart ด้วย class='CartToggleButton'
 */
(function($) {
	$.fn.myShoppingCart = function(custom_conf){
		var conf = {cart_url:'http://www.beautyintrend.com/module/ajax/cart.ajax.php',SessionParam:null};
		if (custom_conf) $.extend(conf, custom_conf);
		this.each(function(){
			var $cartObj = $(this);
			$cartObj.hide();
			$cartObj.data("config",conf);
			mySPC_BuildHeader($cartObj);
			mySPC_BuildBody($cartObj);
			mySPC_BuildFunction($cartObj);
			//_mySPC_BuildCartToggleButton($cartObj); ยกเลิกเพราะคิดว่าไม่จำเป็น			
		});
	}
	function mySPC_BuildBody($cartObj){
		var $bodyObj = $("<div id='CartBody'>Loading...</div>");		
		$cartObj.append($bodyObj);
		/* ใช้ตอนที่เรากลัง test อยู่ว่า cart มัน error เพราะอะไร */
		/* ข้อความสำหรับรับ feedback จากลูกค้า หาก cart error */
		var url = 'http://www.beautyintrend.com/module/script/submitErrorReport.php?subject=found_cart_error';
		$bodyObj.append("<a href='"+url+"'  target='_blank'>กรุณากดที่นี่</a> เนื่องจากหากท่านพบข้อความนี้แสดงว่าระบบ Cart มีปัญหา กรุณา <a href='"+url+"' target='_blank'>Click ที่ข้อความนี้</a>");
		$bodyObj.append("เพื่อส่ง Error ไปยังร้านค้าเพื่อให้เราทำการแก้ไขโดยเร็วที่สุดค่ะ");
		$("a",$bodyObj).click( function(e){
			window.location.href = "http://www.beautyintrend.com";
		});
		/* ############################ */
	}
	function mySPC_BuildHeader($cartObj){
		var $headerObj = $("<div id='CartHeader'><div id='CartTitle'></div><div id='CloseButton'></div></div>");
		$cartObj.append($headerObj);
		$cartObj.draggable({ 
			handle: $headerObj,
			zIndex:2700,
			opacity:0.8,
			 iframeFix: true , 
			 containment: 'body',
			 cursor: 'crosshair',
			 scroll: false
		});
		mySPC_BuildCloseButton($cartObj,$headerObj);		
	}
	function mySPC_BuildCloseButton($cartObj,$headerObj){
		$("div#CloseButton",$headerObj).click( function(){
			$cartObj.data("ToggleFnc")(2);	
		});
	}
	function mySPC_SubmitCartOperation($cartObj,op,params){
//		alert("Submit cart op=["+op+"]");
		var data = {
				'op':op
		};
		$.extend(data, params);
		$.extend(data, $cartObj.data("config")["SessionParam"]);
		var requestAjax = $.ajax({
			'type':'POST',
			'async':false,
			'global':false,
			'cache':false,
			'url':$cartObj.data("config")['cart_url'],
			'data':data,
			'dataType':'html',
			'success': function(data) {
				$("div#CartBody",$cartObj).html(data);
				mySPC_reRenderCart($cartObj);
				$cartObj.data("recheckReturnHtmlFromAjax")();
			},
			'error' : function(XMLHttpRequest, textStatus, errorThrown){
				if (textStatus == "error") {
					var msg = "ขออภัยค่ะ พบข้อผิดพลาดในระบบตระกร้าสินค้า กรุณาลองใหม่อีกครั้งค่ะ\n";
					alert(msg + 'Error :: '+XMLHttpRequest.status+" ["+XMLHttpRequest.statusText+"]");
				}
				$("div#CartBody",$cartObj).html("<div class='cartError'>มีข้อผิดพลาดในการเชื่อต่อกับระบบ Shopping Cart กรุณาลองใหม่อีกครั้งค่ะ</div>");
				var msg = 'Status : '+textStatus+"\n";
				if( XMLHttpRequest ){ msg += 'Request Error :: '+XMLHttpRequest.status + "[" + XMLHttpRequest.statusText+"]\n"; }
				if( errorThrown ){ msg += 'errorThrown '+errorThrown+"\n"; }
				mySPC_sendErrorReport($cartObj,"Cart Ajax Request Error",msg);
			}
		});
	}

	function mySPC_sendErrorReport($cartObj,subject,msg){
		if( $(window).data("SendError") ){
			var errData = {
					'errType':'CartError',
					'errSubject':subject,
					'errMsg':msg,
					'errUrl':'cart.ajax.php'
			};
			$(window).data("SendError")(errData);
		}
	}
	function mySPC_reRenderCart($cartObj){		
		$("span.input_qty",$cartObj).each( function(){
			var id=$(this).attr('id');
			var qty = $(this).text().replace(/\D/g,'');
			var $input = $("<input type='text' class='input_qty'/>");
			$input.attr('id',id);
			$input.val(qty);
			$input.data("confirmed_value",qty);
			$input.blur( function(e){
				$(this).val( $input.data("confirmed_value") );
			});
			$input.keypress( function(e){
				if( e.which == 13 ){
					var new_qty = $input.val().replace(/\D/g,'');
					$input.data("confirmed_value",new_qty);
					$cartObj.data("setItemQty")(id,new_qty);
				}
			});
			$(this).replaceWith($input);
		});
		$(".inc_item_button",$cartObj).each( function(){ //สร้างปุ่ม เพิ่มจำนวนสินค้า
			var id=$(this).attr('id');
			$(this).attr('title','เพิ่มจำนวนสินค้า');
			$(this).click( function(){ $cartObj.data("addItem")(id); });
		});
		$(".desc_item_button",$cartObj).each( function(){ //สร้างปุ่ม ลดจำนวนสินค้า
			var id=$(this).attr('id');
			$(this).attr('title','ลดจำนวนสินค้า');
			$(this).click( function(){ $cartObj.data("reduceItem")(id); }); 
		});
		$(".remove_item_button",$cartObj).each( function(){ //สร้างปุ่ม remove item			
			var id=$(this).attr('id');
			$(this).attr('title','ยกเลิกทั้งหมด');
			$(this).click( function(){ if( confirm('ยืนยันการยกเลิกสินค้าชนิดนี้') ){ $cartObj.data("removeItem")(id); } });			
		});		
		if( $(".last_action_item",$cartObj).length > 0 ){
			var newScrollTop = $(".last_action_item",$cartObj).position().top - $(".last_action_item",$cartObj).parent().position().top;
			$("div#ListBody",$cartObj).scrollTop( newScrollTop );
		}
	}
	function mySPC_BuildFunction($cartObj){
		/* ########## Start Recheck Return Html From ajax script ###### */
		$cartObj.data("recheckReturnHtmlFromAjax",function(itemId,qty){
			if( $("div#CartBody div#CartItemList").length <= 0 ){
				var errSubject = "พบข้อผิดพลาดหลังจากได้รับค่าจาก cart.ajax";
				var errMsg = "no html in div#CartBody";
				if( $("div#CartBody").length > 0 ){ errMsg = $("div#CartBody").html(); }
				mySPC_sendErrorReport($cartObj,errSubject,errMsg);
			}			
		});
		/* ########## End Recheck Return Html From ajax script ####### */
		/* ########## START setItemQty() method ############ */
		$cartObj.data("setItemQty",function(itemId,qty){
			$cartObj.data("ToggleFnc")(1);
			var params = {"itemId":itemId,"qty":qty}; 
			mySPC_SubmitCartOperation($cartObj,'setItemQty',params);
		});
		/* ############ END setItemQty() method ############ */
		/* ########## START removeItem() method ############ */
		$cartObj.data("removeItem",function(itemId){
			$cartObj.data("ToggleFnc")(1);
			var params = {"itemId":itemId}; 
			mySPC_SubmitCartOperation($cartObj,'removeItem',params);
		});
		/* ############ END removeItem() method ############ */
		/* ########## START reduceItem() method ############ */
		$cartObj.data("reduceItem",function(itemId){
			$cartObj.data("ToggleFnc")(1);
			var params = {"itemId":itemId}; 
			mySPC_SubmitCartOperation($cartObj,'reduceItem',params);
		});
		/* ############ END reduceItem() method ############ */
		/* ########## START addItem() method ############ */
		$cartObj.data("addItem",function(itemId){
			$cartObj.data("ToggleFnc")(1);
			var params = {"itemId":itemId}; 
			mySPC_SubmitCartOperation($cartObj,'addItem',params);
		});
		/* ############ END addItem() method ############ */
		/* ########## START reloadCart() method ############ */
		$cartObj.data("reloadCart",function(){
			var params = {}; 
			mySPC_SubmitCartOperation($cartObj,'reloadCart',params);
		});
		/* ############ END reloadCart() method ############ */
		$cartObj.data("ToggleFnc",function(mode){ //mode : 0 = toggle , 1 = show , 2 = off
			var speed = 0;
//			var newTop = $("body").scrollTop() + Math.floor( ($(window).height()-$cartObj.height())/2 ); // แบบจัดกลาง 
//			var newLeft = $("body").scrollLeft()+ Math.floor( ($(window).width()-$cartObj.width() )/2 ); //แบบจัดกลาง 
			var isVisible = $cartObj.is(":visible");
			if( mode == 0 ){
				if( isVisible ){ mode = 2; }else{ mode = 1; }
			}
			if( isVisible && mode == 2 ){ // กรณีที่ CLOSE  มี condition นี้เท่านั้น
				$cartObj.animate({opacity: 'hide'},{duration:speed});
			}else if( mode == 1  ){ //case นี้คือ move อย่างเดียว
				var offset = {left:0,top:0};
					offset.left = parseInt('0'+$cartObj.css('left').replace(/[\D]/g,''),10)-2000; // - 2000 เพื่อให้กลายเป็น position ที่เป็น relative กับ body หรือ absolute นั้นหล่ะ
					offset.top = parseInt('0'+$cartObj.css('top').replace(/[\D]/g,''),10)-2000; // ที่ต้องมี '0'+ เพราะว่าใน ie $cartObj.css('top') มัน return มาเป็น auto พอเข้า replace ก็จะได้ empty string ดังนั้นเลยต้องเติม 0 ไว้ข้างหน้าและบังคับ parserInt สั่งให้แปรในระบบฐาน 10 
				var new_offset = {left:offset.left,top:offset.top};
				var cart_width = $cartObj.width();
				var cart_height = $cartObj.height();
				var move_margin = 20; //จำนวน pixel ที่จะให้เว้นกับขอบ window
				var bound_x = {min:$("body").scrollLeft(),max:$("body").scrollLeft()+$(window).width()};
				var bound_y = {min:$("body").scrollTop(),max:$("body").scrollTop()+$(window).height()};
				/* แก้ไขแกน x ก่อน */				
//				alert(offset.top+' x '+offset.left);
//				alert(bound_x.min+' > '+bound_x.max);
				if( offset.left < bound_x.min ){
//					alert('a');
					new_offset.left = bound_x.min+move_margin;
				}else if( offset.left > ( bound_x.max-cart_width/2 ) ){
//					alert('b');
					new_offset.left = bound_x.max-cart_width-move_margin;
				}
				if( offset.top < bound_y.min ){
//					alert('c');
					new_offset.top= bound_y.min + move_margin;
				}else if( offset.top > ( bound_y.max-cart_height/2 ) ){
//					alert('d');
					new_offset.top = bound_y.max - cart_height - move_margin;
//					alert( offset.top+'>'+new_offset.top);
				}
//				alert(new_offset.top+' x '+new_offset.left);
				if( isVisible ){
					$cartObj.animate( {left:new_offset.left+2000,top:new_offset.top+2000} ,{duration:speed});
				}else{
					$cartObj.css('left',(new_offset.left+2000)+'px');
					$cartObj.css('top',(new_offset.top+2000)+'px');
					$cartObj.animate( {opacity:'show'} ,{duration:speed});
				}
			}
		});
	}
	/* เรายกเลิกเอาไว้ เพราะคิดว่าไม่จำเป็นแล้ว ปุ่ม View Cart นั้นเราจะไปใช้ให้มันเรียก cart_show() เอง */
	// ยกเลิกโดยการสั่งไม่ให้เรียก fucntion นี้จาก main function ด้านบน
	function _mySPC_BuildCartToggleButton($cartObj){
		/* ทำหน้าที่สร้างให้ element ใดๆ ที่เป็น class .CartToggleButton ให้เป็นการเรียก $cartObj.data("ToggleFnc")();	 เสมอ */
		$(".CartToggleButton").css('cursor','pointer');
		$(".CartToggleButton").click(function(){				
			$cartObj.data("ToggleFnc")(1); 
//			$cartObj.data("addItem")(1); 			
		}); // << เรียกหลังสุดเพราะมันต้องสร้าง funciton ให้ครบก่อน
	}	
})(jQuery);
function initMyShoppingCart(conf){
	var $containerObj = $("<div style='position: absolute;left:-2000px;top:-2000px'></div>");
	var $cartObj = $("<div id='myShoppingCart'></div>");
	$cartObj.myShoppingCart(conf);
	$containerObj.append($cartObj);
	$("body").append($containerObj);
return $cartObj;
}
