$.extend( $.Isotope.prototype, {
	animationEngine : 'best-available',
    _marginalRowsReset : function() {
      this.marginalRows = {
        x : 0,
        y : 0,
        height : 0,
        currentCategory : null
      };
    },

    _marginalRowsLayout : function( $elems ) {
		var lastRowContainer=-1;
      var instance = this,
          containerWidth = (instance.options.minWidth!=undefined && instance.options.minWidth!=-1) ? Math.max(this.element.width(),instance.options.minWidth) : this.element.width(),
          sortBy = this.options.sortBy,
          props = this.marginalRows;
		var mediaQueryFlag=0;	
			if(containerWidth<=768 ) mediaQueryFlag= 2;
			if(containerWidth<=420 ) mediaQueryFlag =1;
			
		var marginalCollapsed=mediaQueryFlag==1;
		var ignoreEmpty=mediaQueryFlag==2;
		var currentRowExpandingItems=[];

		var maxHeightColumnsInRow=0;
    var elementDoesntFitInRow=false;


      $elems.each( function(index) {
        var $this = $(this);
		if(ignoreEmpty && $(this).hasClass("empty")) return true;
		if($(this).hasClass("empty") && marginalCollapsed) return true;
		
		var gutter=containerWidth*instance.options.gutterRelative;
		var atomW = $this.outerWidth(true);
		var atomH = $this.outerHeight(true);
		var category = $.data( this, 'isotope-sort-data' )[ sortBy ];
		var currentRowContainer;
		var x, y;
		var newRowFlag=false;
		var newMarginalFlag=false;
		
		//if(index==0) alert(gutter);
		currentRowContainer=$(this).parent().index();
		newRowFlag=lastRowContainer!=currentRowContainer;
		newMarginalFlag=$(this).hasClass("marginal");

		var marginalWidth=$(this).parent().find(".marginal").width();
    var alignBottomInRow=$this.hasClass("alignBottomInRow");

    if(newRowFlag){
      maxHeightColumnsInRow = parseInt(Math.max.apply(null, $(this).parent().find(".columns .innerHeightMeasure").map(function (){
                                                                return $(this).outerHeight(true);
                                                              }).get()),10);
    }
		if(marginalCollapsed){
			marginalWidth=0;
		}
      elementDoesntFitInRow=false;

        if ((newMarginalFlag || newRowFlag)) {
          // next marginal, new row container
          currentRowExpandingItems=[];
          props.x = newMarginalFlag ? 0 : marginalWidth+gutter;
          props.y = props.height+gutter;
          props.currentCategory = category;
        } else if ( props.x !== 0 && atomW + props.x > containerWidth ) {
          // if this element cannot fit in the current row
          props.x = marginalWidth+gutter;
          props.y = props.height+gutter;
          elementDoesntFitInRow=true;
         

        }

         if(alignBottomInRow && !marginalCollapsed && !elementDoesntFitInRow ){
            props.y = maxHeightColumnsInRow-atomH;
          }

        // position the atom
        

        instance._pushPosition( $this, props.x, props.y );

        props.height = Math.max( props.y + atomH, props.height )+((newRowFlag && !marginalCollapsed) ? parseInt($(this).parent().css("margin-bottom"), 10) : 0);
        

        
        props.x += atomW+gutter;
		    lastRowContainer=currentRowContainer;

      });
    },

    _marginalRowsGetContainerSize : function () {
      return { height : this.marginalRows.height };
    },

    _marginalRowsResizeChanged : function() {
      return true;
    },
 	
	_getSorter : function( elem, sortBy ) {
      return Number($.data( elem, 'isotope-sort-data' )[ sortBy ]);
    },

  });
