﻿(function($) {

  $.fn.astDeck = function(options) {
    // build main options before element iteration
    var opts = $.extend({}, $.fn.astDeck.defaults, options);
    var countClicks = 0;
    
    //define regex to target the target card
    var regDivTargetTemplate = new RegExp("({index})");
    
    // iterate and reformat each matched element
    return this.each(function() {
      $this = $(this);
      // build element specific options
      var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
            
      // register/identify the widget holder
      $this.addClass("w-astDeck");
	  $this.data('astDeck', { state: "starting" });
	  	  
	  $this.empty().css({'height': o.spreadHeight + 'px'});
	  
	  if (o.startMessage) {
		$(o.selectorDivInfo).html(o.startMessage)	  
	  }
	  for (var i=0; i < o.cardCount ; i++) {
		$this.append('<img src="'+o.imgBack+'" class="w-astDeck-card astCardDeck" id="astCards'+(i+1)+'">');
	  }
	  
	  $this.find('.w-astDeck-card').each(function(i,e) {
		$e = $(e);
		$e.animate({'left' : (i*o.xDecalage)+'px'}, (i*o.SpreadTimeBasic > o.SpreadTimeMax)? o.SpreadTimeMax : i*o.SpreadTimeBasic, function() {
			$(this).css('position', 'absolute');
		});
		$e.click(function(){
				var pluginData = $(this).parents('.w-astDeck').data('astDeck');
				
				if (pluginData.state == "starting") {
					if (o.startConditionalDeckSelector) {
						if (jQuery(o.startConditionalDeckSelector).data('astDeck').state == "finished") {
							pluginData.state = "clickable";
						}
					}
				}
				
				if (pluginData.state != 'clickable') return false;
				countClicks++;
				var targetCardPos = $(o.selectorDivTargetTemplate.replace(regDivTargetTemplate,o.selectorDivTargetOffset + (countClicks-1))).offset();
				var curAbsPos = $(this).offset();
				var curRelPos = $(this).position();
				var posLeft = curRelPos.left + targetCardPos.left - curAbsPos.left;
				var posTop = curRelPos.top + targetCardPos.top - curAbsPos.top;
				
				if(countClicks == o.cardSelectCount){
					pluginData.state = "finished";
					$(o.selectorDivInfo).hide(100, function(){
						$(this).show(500).html(o.endMessage)
					});
					$(this).parent().find("img").unbind();
				}
				$(this).animate({ left: posLeft + 'px', top: posTop + 'px'}, 300, function(){
					$(this).animate({"opacity":"0"},20, function(){$(this).unbind();});
					if (o.chooseCallback) o.chooseCallback();
				});
		});
	  });
	  
	  if (!o.startConditionalDeckSelector) {
		$this.data('astDeck').state = "clickable";
	  }

	  
    });
  };
  

  function debug(message) {
    if (window.console && window.console.log)
      window.console.log(message);
  };
  
  
  
  $.fn.astDeck.defaults = {
    debug: false,
	spreadHeight: 120,
	xOffsetPaquet: 80,
	cardCount: 15,
	cardSelectCount: 3,
	imgBack: 'http://www.astrocenter.fr/fr/Store/images/cardBackA.gif',
	xDecalage: 20,
	SpreadTimeBasic: 100,
	SpreadTimeMax: 900,
	xOffsetTarget: -540,
	yOffsetTarget: -570,
	selectorDivInfo: '.astClickPaquet',
	selectorDivTargetTemplate: "#IMG_Card_{index}_Field",
	selectorDivTargetOffset: 1,
	chooseCallback: null,
	startMessage: null,
	endMessage: 'All cards selected',
	startConditionalDeckSelector: null
  };

})(jQuery);