/**
* jQuery jCart
* @name ajax cart
* @author Łukasz Staliś
* @version 2.0
* @date 2.06.2010
* @category jQuery plugin
* @copyright Mediaambassador.pl
*/

jQuery.fn.extend({
	cartMa: function(type,data){
		var $ = jQuery;
		if($(this).length==0)return;
		var manager= $().cartMa.managerMa?$().cartMa.managerMa:($().cartMa.managerMa = new Array());
		var idC = idGenerator($(this).selector,"cartMa_");
		if(!manager[idC]){
			type = jQuery.extend({
				//all
				id: idC,
				selector: $(this).selector,
				initData: null,
				appendTo:'body',
				sendMethod: "POST", //GET, POST
 				countRef:'',
				priceRef:'',
				cartServer:'',
				offsetX:0,
				offsetY:0,
				showTime:1000,
				scrollTop:true,
				rowGenerator:function(data){
					var elem='<div class="clearfix"><div class="image"><img src="'+data.image+'" alt="'+data.sci_variation_display_name+'" /></div>';
						elem+='<div class="right">';
						elem+='<h4>'+data.sci_variation_display_name+'</h4>';
						elem+='<dl>';
						elem+='<dl><dt>'+data.color+' | '+data.size+'</dt>';
						elem+='<dd>'+data.sci_quantity+'x</dd>';
						elem+='<dd><strong>'+data.sci_sold_price+' zł</strong></dd>';
						elem+='</dl>';
						elem+='</div>';
					return elem;
				},
				beforeSend:function(obj,callback){ callback(); },
				afterSendSuccess:function(obj,callback,data,toShow){ callback(data,toShow); },
				afterSendError:function(obj,callback){ callback(); },
				afterInit:function(obj){ },
				beforeShow:function(obj,callback){ callback(); },
				afterShow:function(obj){},
				beforeHide:function(obj,callback){ callback(); },
				afterHide:function(obj){},
				beforeDestruct:function(obj,callback){ callback(); },
				afterDestruct:function(obj){}			
			},type);
			
			manager[idC]= new cartClass(type);
			
		} else {
			var obj = manager[idC];
			switch(type){
				case 'show':obj.show(data);break;
				case 'hide':obj.hide(data);break;				
				case 'refresh':obj.refresh(data);break;				
				case "beforeSend":case "afterSendSuccess":case "afterSendError":case "afterInit":case "beforeShow":case "afterShow":case "beforeHide":case "afterHide": obj.addHandler(type,data);break;
				case "send": obj.send(data,true);break;
				case 'destruct':obj.destruct(data);break;
			}
			return $("#"+idC);
			
		};
		
		/** podstawowa klasa dostarczająca mechanizmy lighboxowe w któych mogą być wyświetlane dowolne elementy**/
		function cartClass(sets){
			//variable parent definied to use in JQuery and callback this function class properties and method
			var parent = this;
			//public vars
			this.appendTo = sets.appendTo;
			this.sendMethod = sets.sendMethod;		
			this.countRef = sets.countRef;
			this.priceRef = sets.priceRef;
			this.cartServer =sets.cartServer;
			this.offsetX =sets.offsetX;
			this.offsetY =sets.offsetY;
			this.showTime =sets.showTime;
			this.scrollTop =sets.scrollTop;
			this.rowGenerator =sets.rowGenerator;
			this.initData = eval(sets.initData);
			//protected vars
			this.id = sets.id;
			this.selector = sets.selector;
			this.lock = false;
			//methods
			this.show = function(data){
				function showCallback(){
					if(!$('#'+parent.id).hasClass('over')){
						$('#'+parent.id).slideDown(400);
						$('#'+parent.id+' .cartMaMovingArea').css('top',(-1)*$('#'+parent.id+' .cartMaMovingArea').height()).stop().animate({top:0},300);		
					};
					$('#'+parent.id).addClass('over').stopTime("hide");
					parent.afterShow(parent);
				};
				this.beforeShow(this,showCallback);
			}
			this.hide = function(data){
				var timeHide = this.showTime;
				
				if(data!=undefined && data>0){
					timeHide = data<300?300:data;
				};
				
				function hideCallback(){
					$('#'+parent.id).oneTime(timeHide,"hide",function(){
						if($('#'+parent.id).hasClass('over')){
							$('#'+parent.id).removeClass('over');
							$('#'+parent.id+' .cartMaMovingArea').stop().animate({top:(-1)*$('#'+parent.id+' .cartMaMovingArea').height()-10},300,function(){
								$('#'+parent.id).slideUp(300, function () {
									$('#'+parent.id+' .cartTop p').remove();
							    });
							});
							$('#'+parent.id).stopTime('hide');
							parent.afterHide(parent);
						};
					});					
				};
				this.beforeHide(this,hideCallback);
			}
			this.send = function(datas, toShow){
				if(this.lock==true)return;
				this.lock=true;
				function sendCallback(){
					$.ajax ({
						type: parent.sendMethod,
						url: parent.cartServer,
						data: datas,
						cache: false,
						success: function(data){
						$('ul#listCart li span').html('('+data.items_count+' prod. za '+data.items_value+' zł)');
							parent.afterSendSuccess(parent, parent.update,data,toShow);
						},
						error:function(XMLHttpRequest, textStatus, errorThrown){
							function afterSendErrorCallback(){
								$('#'+this.id+' .cartTop p').remove();
								$('#'+this.id+' .cartTop').append('<p class="error">Wystąpił błąd('+textStatus+')</p>');
								parent.show();
								parent.hide();
								if(parent.scrollTop)$(document).scrollTop(0);
								parent.lock= false;
							};
							parent.afterSendError(parent, afterSendErrorCallback);
						},
						dataType: "json"
					});			
				};
				this.beforeSend(this,sendCallback);
			}
			this.update = function(data, toShow){
				$('#'+parent.id+' .cartBottom a').attr('href',data.cart_link.replace(/&amp;/gi,"&"));
				$('#'+parent.id+' .cartBottom span span.maPriceMa').text(data.items_value + ' zł');
				$(parent.selector).find(parent.countRef).text(data.items_count);
				$(parent.selector).find(parent.priceRef).text(data.items_value);
				$('#'+parent.id+' .cartContent').empty();
				var cartList='<p>koszyk jest pusty</p>';
				if(data.items.length>0){
					cartList='<ul>';
					for(var j=0;j<data.items.length;j++)cartList+='<li'+(j==data.items.length-1?' class="end">':'>')+parent.rowGenerator(data.items[j])+'</li>';		
					cartList+='</ul>';
				};
				$('#'+parent.id+' .cartContent').append(cartList);
				$('#'+parent.id+' .cartTop p').remove();
				var type="";
				if(data.error!=null)for(var i=0;i<data.error.length;i++)$('#'+parent.id+' .cartTop').append('<p class="error"><strong>!</strong> '+data.error[i]+'</p>');
				if(data.warning!=null)for(var i=0;i<data.warning.length;i++)$('#'+parent.id+' .cartTop').append('<p class="warning"><strong>!</strong> '+data.warning[i]+'</p>');
				if(data.info!=null)for(var i=0;i<data.info.length;i++)$('#'+parent.id+' .cartTop').append('<p class="info"><strong>!</strong> '+data.info[i]+'</p>');
				 
				if(toShow){
					parent.show();
					parent.hide();
					if(parent.scrollTop)$(document).scrollTop(0);
				};
				parent.lock=false;
			}			
			this.destruct = function(){
				$('#'+this.id).unbind("mouseover",this.showHandler).unbind("mouseout",this.hideHandler);
				$(this.selector).unbind("mouseover",this.showHandler).unbind("mouseout",this.hideHandler);
				
				$('#'+this.id).remove();
				$().managerMa[this.id] = null;				
			}
			this.refresh = function(){
				var off=$(this.selector).offset();
				$('#'+this.id).css({top:off.top+this.offsetY, left:off.left+this.offsetX});
			}
			//events Method
			this.beforeSend = sets.beforeSend;
			this.afterSendSuccess = sets.afterSendSuccess;
			this.afterSendError = sets.afterSendError;
			this.afterInit = sets.afterInit;
			this.beforeShow = sets.beforeShow;
			this.afterShow = sets.afterShow;
			this.beforeHide = sets.beforeHide;
			this.afterHide = sets.afterHide;
			this.beforeDestruct = sets.beforeDestruct;
			this.afterDestruct = sets.afterDestruct;
			
			this.addHandler = function(type,data){
				switch(type){
					case "beforeSend": this.beforeSend=data;break;
					case "afterSendSuccess": this.afterSendSuccess=data;break;
					case "afterSendError": this.afterSendError=data;break;
					case "afterInit": this.afterInit=data;break;
					case "beforeShow": this.beforeShow=data;break;
					case "afterShow": this.afterShow=data;break;
					case "beforeHide": this.beforeHide=data;break;
					case "afterHide": this.afterHide=data;break;
					default: alert('nie ma eventu o podanym typie('+type+')');break;
				};
			}
			//event Handlers
			this.hideHandler = function(){
				parent.hide(0);
				return false;
			}
			this.showHandler = function(){
				parent.show();
				return false;
			}
			
			this.construct = function(sets){
				var off=$(this.selector).position();
				
				$('<div id="'+this.id+'" class="cartMa"><div class="cartMaMovingArea"><div class="cartHead clearfix"><span>Zawartość koszyka</span><a href="#" class="linkClear">ZAMKNIJ</a></div><div class="cartTop"><p class="warning">Trwa aktualizacja koszyka</p></div><div id="cartContent" class="cartContent"><p>koszyk jest pusty</p></div><div class="cartBottom clearfix"><a class="link" href="#">Pokaż koszyk</a><span>Suma:  <span class="maPriceMa"> 0.00 zł</span></span></div></div></div>').appendTo(this.appendTo).bind("mouseover",this.showHandler).bind("mouseout",this.hideHandler);
				
				$(this.selector).bind("mouseover",this.showHandler).bind("mouseout",this.hideHandler);
				
				if(this.initData==null){
					this.send({},false);
				} else {
					this.lock = true;
					this.update(this.initData,false);
				};
				this.afterInit(this);
			}
			this.construct(sets);
		}	
		//generator id 
		function idGenerator(str,pre){
			var exp= new RegExp("[^a-zA-Z0-9]+","g");
			var tpl=str.replace(exp,'');
			return (pre+tpl);
		}
	}
});




