Roo/bootstrap/LayoutMasonry.js
[roojs1] / Roo / bootstrap / LayoutMasonry.js
1 /**
2  *
3  * This is based on 
4  * http://masonry.desandro.com
5  *
6  * The idea is to render all the bricks based on vertical width...
7  *
8  * The original code extends 'outlayer' - we might need to use that....
9  * 
10  */
11
12
13 /**
14  * @class Roo.bootstrap.LayoutMasonry
15  * @extends Roo.bootstrap.Component
16  * Bootstrap Layout Masonry class
17  * 
18  * @constructor
19  * Create a new Element
20  * @param {Object} config The config object
21  */
22
23 Roo.bootstrap.LayoutMasonry = function(config){
24     Roo.bootstrap.LayoutMasonry.superclass.constructor.call(this, config);
25     
26     this.bricks = [];
27     
28 };
29
30 Roo.extend(Roo.bootstrap.LayoutMasonry, Roo.bootstrap.Component,  {
31     
32     /**
33      * @cfg {Boolean} isLayoutInstant = no animation?
34      */   
35     isLayoutInstant : false, // needed?
36    
37     /**
38      * @cfg {Number} boxWidth  width of the columns
39      */   
40     boxWidth : 450,
41     
42     /**
43      * @cfg {Number} padWidth padding below box..
44      */   
45     padWidth : 10, 
46     
47     /**
48      * @cfg {Number} gutter gutter width..
49      */   
50     gutter : 10, 
51     
52     /**
53      * @cfg {Boolean} isAutoInitial defalut true
54      */   
55     isAutoInitial : true, 
56     
57     containerWidth: 0,
58     
59     /**
60      * @cfg {Boolean} isHorizontal defalut false
61      */   
62     isHorizontal : false, 
63
64     currentSize : null,
65     
66     tag: 'div',
67     
68     cls: '',
69     
70     bricks: null, //CompositeElement
71     
72     cols : 1,
73     
74     _isLayoutInited : false,
75     
76 //    isAlternative : false, // only use for vertical layout...
77     
78     /**
79      * @cfg {Number} alternativePadWidth padding below box..
80      */   
81     alternativePadWidth : 50, 
82     
83     getAutoCreate : function(){
84         
85         var cfg = {
86             tag: this.tag,
87             cls: 'blog-masonary-wrapper ' + this.cls,
88             cn : {
89                 cls : 'mas-boxes masonary'
90             }
91         };
92         
93         return cfg;
94     },
95     
96     getChildContainer: function( )
97     {
98         if (this.boxesEl) {
99             return this.boxesEl;
100         }
101         
102         this.boxesEl = this.el.select('.mas-boxes').first();
103         
104         return this.boxesEl;
105     },
106     
107     
108     initEvents : function()
109     {
110         var _this = this;
111         
112         if(this.isAutoInitial){
113             Roo.log('hook children rendered');
114             this.on('childrenrendered', function() {
115                 Roo.log('children rendered');
116                 _this.initial();
117             } ,this);
118         }
119     },
120     
121     initial : function()
122     {
123         this.currentSize = this.el.getBox(true);
124         
125         Roo.EventManager.onWindowResize(this.resize, this); 
126
127         if(!this.isAutoInitial){
128             this.layout();
129             return;
130         }
131         
132         this.layout();
133         
134         return;
135         //this.layout.defer(500,this);
136         
137     },
138     
139     resize : function()
140     {
141         Roo.log('resize');
142         
143         var cs = this.el.getBox(true);
144         
145         if (this.currentSize.width == cs.width && this.currentSize.x == cs.x ) {
146             Roo.log("no change in with or X");
147             return;
148         }
149         
150         this.currentSize = cs;
151         
152         this.layout();
153         
154     },
155     
156     layout : function()
157     {   
158         this._resetLayout();
159         
160         var isInstant = this.isLayoutInstant !== undefined ? this.isLayoutInstant : !this._isLayoutInited;
161         
162         this.layoutItems( isInstant );
163       
164         this._isLayoutInited = true;
165         
166     },
167     
168     _resetLayout : function()
169     {
170         if(this.isHorizontal){
171             this.horizontalMeasureColumns();
172             return;
173         }
174         
175         this.verticalMeasureColumns();
176         
177     },
178     
179     verticalMeasureColumns : function()
180     {
181         this.getContainerWidth();
182         
183 //        if(Roo.lib.Dom.getViewWidth() < 768 && this.isAlternative){
184 //            this.colWidth = Math.floor(this.containerWidth * 0.8);
185 //            return;
186 //        }
187         
188         var boxWidth = this.boxWidth + this.padWidth;
189         
190         if(this.containerWidth < this.boxWidth){
191             boxWidth = this.containerWidth
192         }
193         
194         var containerWidth = this.containerWidth;
195         
196         var cols = Math.floor(containerWidth / boxWidth);
197         
198         this.cols = Math.max( cols, 1 );
199         
200         var totalBoxWidth = this.cols * boxWidth - this.padWidth;
201         
202         var avail = Math.floor((containerWidth - totalBoxWidth) / this.cols);
203         
204         this.colWidth = boxWidth + avail - this.padWidth;
205         
206         this.unitWidth = Math.floor((this.colWidth - (this.gutter * 2)) / 3);
207     },
208     
209     horizontalMeasureColumns : function()
210     {
211         this.getContainerWidth();
212         
213         var boxWidth = this.boxWidth;
214         
215         if(this.containerWidth < boxWidth){
216             boxWidth = this.containerWidth;
217         }
218         
219         this.unitWidth = Math.floor((boxWidth - (this.gutter * 2)) / 3);
220         
221         this.el.setHeight(boxWidth);
222         
223     },
224     
225     getContainerWidth : function()
226     {
227         this.containerWidth = this.el.getBox(true).width;  //maybe use getComputedWidth
228     },
229     
230     layoutItems : function( isInstant )
231     {
232         var items = Roo.apply([], this.bricks);
233         
234         if(this.isHorizontal){
235             this._horizontalLayoutItems( items , isInstant );
236             return;
237         }
238         
239 //        if(Roo.lib.Dom.getViewWidth() < 768 && this.isAlternative){
240 //            this._verticalAlternativeLayoutItems( items , isInstant );
241 //            return;
242 //        }
243         
244         this._verticalLayoutItems( items , isInstant );
245         
246     },
247     
248     _verticalLayoutItems : function ( items , isInstant)
249     {
250         if ( !items || !items.length ) {
251             return;
252         }
253         
254         var standard = [
255             ['xs', 'xs', 'xs', 'tall'],
256             ['xs', 'xs', 'tall'],
257             ['xs', 'xs', 'sm'],
258             ['xs', 'xs', 'xs'],
259             ['xs', 'tall'],
260             ['xs', 'sm'],
261             ['xs', 'xs'],
262             ['xs'],
263             
264             ['sm', 'xs', 'xs'],
265             ['sm', 'xs'],
266             ['sm'],
267             
268             ['tall', 'xs', 'xs', 'xs'],
269             ['tall', 'xs', 'xs'],
270             ['tall', 'xs'],
271             ['tall']
272         ];
273         
274         var queue = [];
275         
276         var boxes = [];
277         
278         var box = [];
279         
280         Roo.each(items, function(item, k){
281             
282             switch (item.size) {
283                 case 'md' :
284                 case 'md-left' :
285                 case 'md-right' :
286                 case 'wide' :
287                     
288                     if(box.length){
289                         boxes.push(box);
290                         box = [];
291                     }
292                     
293                     boxes.push([item]);
294                     
295                     break;
296                     
297                 case 'xs' :
298                 case 'sm' :
299                 case 'tall' :
300                     
301                     box.push(item);
302                     
303                     break;
304                 default :
305                     break;
306                     
307             }
308             
309         }, this);
310         
311         if(box.length){
312             boxes.push(box);
313             box = [];
314         }
315         
316         var filterPattern = function(box, length)
317         {
318             if(!box.length){
319                 return;
320             }
321             
322             var match = false;
323             
324             var pattern = box.slice(0, length);
325             
326             var format = [];
327             
328             Roo.each(pattern, function(i){
329                 format.push(i.size);
330             }, this);
331             
332             Roo.each(standard, function(s){
333                 
334                 if(String(s) != String(format)){
335                     return;
336                 }
337                 
338                 match = true;
339                 return false;
340                 
341             }, this);
342             
343             if(!match && length == 1){
344                 return;
345             }
346             
347             if(!match){
348                 filterPattern(box, length - 1);
349                 return;
350             }
351                 
352             queue.push(pattern);
353
354             box = box.slice(length, box.length);
355
356             filterPattern(box, 4);
357
358             return;
359             
360         }
361         
362         Roo.each(boxes, function(box, k){
363             
364             if(!box.length){
365                 return;
366             }
367             
368             if(box.length == 1){
369                 queue.push(box);
370                 return;
371             }
372             
373             filterPattern(box, 4);
374             
375         }, this);
376         
377         this._processVerticalLayoutQueue( queue, isInstant );
378         
379     },
380     
381 //    _verticalAlternativeLayoutItems : function( items , isInstant )
382 //    {
383 //        if ( !items || !items.length ) {
384 //            return;
385 //        }
386 //
387 //        this._processVerticalAlternativeLayoutQueue( items, isInstant );
388 //        
389 //    },
390     
391     _horizontalLayoutItems : function ( items , isInstant)
392     {
393         if ( !items || !items.length || items.length < 3) {
394             return;
395         }
396         
397         items.reverse();
398         
399         var eItems = items.slice(0, 3);
400         
401         items = items.slice(3, items.length);
402         
403         var standard = [
404             ['xs', 'xs', 'xs', 'wide'],
405             ['xs', 'xs', 'wide'],
406             ['xs', 'xs', 'sm'],
407             ['xs', 'xs', 'xs'],
408             ['xs', 'wide'],
409             ['xs', 'sm'],
410             ['xs', 'xs'],
411             ['xs'],
412             
413             ['sm', 'xs', 'xs'],
414             ['sm', 'xs'],
415             ['sm'],
416             
417             ['wide', 'xs', 'xs', 'xs'],
418             ['wide', 'xs', 'xs'],
419             ['wide', 'xs'],
420             ['wide']
421         ];
422         
423         var queue = [];
424         
425         var boxes = [];
426         
427         var box = [];
428         
429         Roo.each(items, function(item, k){
430             
431             switch (item.size) {
432                 case 'md' :
433                 case 'md-left' :
434                 case 'md-right' :
435                 case 'tall' :
436                     
437                     if(box.length){
438                         boxes.push(box);
439                         box = [];
440                     }
441                     
442                     boxes.push([item]);
443                     
444                     break;
445                     
446                 case 'xs' :
447                 case 'sm' :
448                 case 'wide' :
449                     
450                     box.push(item);
451                     
452                     break;
453                 default :
454                     break;
455                     
456             }
457             
458         }, this);
459         
460         if(box.length){
461             boxes.push(box);
462             box = [];
463         }
464         
465         var filterPattern = function(box, length)
466         {
467             if(!box.length){
468                 return;
469             }
470             
471             var match = false;
472             
473             var pattern = box.slice(0, length);
474             
475             var format = [];
476             
477             Roo.each(pattern, function(i){
478                 format.push(i.size);
479             }, this);
480             
481             Roo.each(standard, function(s){
482                 
483                 if(String(s) != String(format)){
484                     return;
485                 }
486                 
487                 match = true;
488                 return false;
489                 
490             }, this);
491             
492             if(!match && length == 1){
493                 return;
494             }
495             
496             if(!match){
497                 filterPattern(box, length - 1);
498                 return;
499             }
500                 
501             queue.push(pattern);
502
503             box = box.slice(length, box.length);
504
505             filterPattern(box, 4);
506
507             return;
508             
509         }
510         
511         Roo.each(boxes, function(box, k){
512             
513             if(!box.length){
514                 return;
515             }
516             
517             if(box.length == 1){
518                 queue.push(box);
519                 return;
520             }
521             
522             filterPattern(box, 4);
523             
524         }, this);
525         
526         
527         var prune = [];
528         
529         var pos = this.el.getBox(true);
530         
531         var minX = pos.x;
532         
533         var maxX = pos.right - this.unitWidth * 3 - this.gutter * 2 - this.padWidth;
534         
535         Roo.each(queue, function(box){
536             
537             var mx = 0;
538             
539             Roo.each(box, function(b){
540                 
541                 b.el.setVisibilityMode(Roo.Element.DISPLAY);
542                 b.el.show();
543
544                 mx = Math.max(mx, b.x);
545                 
546             }, this);
547             
548             maxX = maxX - this.unitWidth * mx - this.gutter * (mx - 1) - this.padWidth;
549             
550             
551         }, this);
552         
553         
554         
555         
556         var x = maxX;
557         
558         var queue = [];
559         
560         var box = [];
561         var size = 0;
562         var hit_end = false;
563         
564         Roo.each(items, function(item, k){
565             
566             item.el.setVisibilityMode(Roo.Element.DISPLAY);
567             item.el.show();
568             
569             if(hit_end){
570                 item.el.hide();
571                 return;
572             }
573             
574             if(size + item.y > 3){
575                 queue.push(box);
576                 box = [];
577                 size = 0;
578                 maxX = x;
579             }
580             
581             var width = Math.floor(this.unitWidth * item.x + (this.gutter * (item.x - 1)) + item.el.getPadding('lr'));
582             
583             x = Math.min(x, maxX - width - this.padWidth);
584             
585             if(x < minX){
586                 item.el.hide();
587                 hit_end = true;
588                 return;
589             }
590             
591             size = size + item.y;
592             
593             box.push(item);
594             
595             
596         }, this);
597         
598         if(box.length){
599             queue.push(box);
600         }
601         
602         this._processHorizontalLayoutQueue( queue, eItems, isInstant );
603     },
604     
605     /** Sets position of item in DOM
606     * @param {Element} item
607     * @param {Number} x - horizontal position
608     * @param {Number} y - vertical position
609     * @param {Boolean} isInstant - disables transitions
610     */
611     _processVerticalLayoutQueue : function( queue, isInstant )
612     {
613         var pos = this.el.getBox(true);
614         var x = pos.x;
615         var y = pos.y;
616         var maxY = [];
617         
618         for (var i = 0; i < this.cols; i++){
619             maxY[i] = pos.y;
620         }
621         
622         Roo.each(queue, function(box, k){
623             
624             var col = k % this.cols;
625             
626             Roo.each(box, function(b,kk){
627                 
628                 b.el.position('absolute');
629                 
630                 var width = Math.floor(this.unitWidth * b.x + (this.gutter * (b.x - 1)) + b.el.getPadding('lr'));
631                 var height = Math.floor(this.unitWidth * b.y + (this.gutter * (b.y - 1)) + b.el.getPadding('tb'));
632                 
633                 if(b.size == 'md-left' || b.size == 'md-right'){
634                     width = Math.floor(this.unitWidth * (b.x - 1) + (this.gutter * (b.x - 2)) + b.el.getPadding('lr'));
635                     height = Math.floor(this.unitWidth * (b.y - 1) + (this.gutter * (b.y - 2)) + b.el.getPadding('tb'));
636                 }
637                 
638                 b.el.setWidth(width);
639                 b.el.setHeight(height);
640                 
641             }, this);
642             
643             for (var i = 0; i < this.cols; i++){
644                 
645                 if(maxY[i] < maxY[col]){
646                     col = i;
647                     continue;
648                 }
649                 
650                 col = Math.min(col, i);
651                 
652             }
653             
654             x = pos.x + col * (this.colWidth + this.padWidth);
655             
656             y = maxY[col];
657             
658             var positions = [];
659             
660             switch (box.length){
661                 case 1 :
662                     positions = this.getVerticalOneBoxColPositions(x, y, box);
663                     break;
664                 case 2 :
665                     positions = this.getVerticalTwoBoxColPositions(x, y, box);
666                     break;
667                 case 3 :
668                     positions = this.getVerticalThreeBoxColPositions(x, y, box);
669                     break;
670                 case 4 :
671                     positions = this.getVerticalFourBoxColPositions(x, y, box);
672                     break;
673                 default :
674                     break;
675             }
676             
677             Roo.each(box, function(b,kk){
678                 
679                 b.el.setXY([positions[kk].x, positions[kk].y], isInstant ? false : true);
680                 
681                 var sz = b.el.getSize();
682                 
683                 maxY[col] = Math.max(maxY[col], positions[kk].y + sz.height + this.padWidth);
684                 
685             }, this);
686             
687         }, this);
688         
689         var mY = 0;
690         
691         for (var i = 0; i < this.cols; i++){
692             mY = Math.max(mY, maxY[i]);
693         }
694         
695         this.el.setHeight(mY - pos.y);
696         
697     },
698     
699 //    _processVerticalAlternativeLayoutQueue : function( items, isInstant )
700 //    {
701 //        var pos = this.el.getBox(true);
702 //        var x = pos.x;
703 //        var y = pos.y;
704 //        var maxX = pos.right;
705 //        
706 //        var maxHeight = 0;
707 //        
708 //        Roo.each(items, function(item, k){
709 //            
710 //            var c = k % 2;
711 //            
712 //            item.el.position('absolute');
713 //                
714 //            var width = Math.floor(this.colWidth + item.el.getPadding('lr'));
715 //
716 //            item.el.setWidth(width);
717 //
718 //            var height = Math.floor(this.colWidth * item.y / item.x + item.el.getPadding('tb'));
719 //
720 //            item.el.setHeight(height);
721 //            
722 //            if(c == 0){
723 //                item.el.setXY([x, y], isInstant ? false : true);
724 //            } else {
725 //                item.el.setXY([maxX - width, y], isInstant ? false : true);
726 //            }
727 //            
728 //            y = y + height + this.alternativePadWidth;
729 //            
730 //            maxHeight = maxHeight + height + this.alternativePadWidth;
731 //            
732 //        }, this);
733 //        
734 //        this.el.setHeight(maxHeight);
735 //        
736 //    },
737     
738     _processHorizontalLayoutQueue : function( queue, eItems, isInstant )
739     {
740         var pos = this.el.getBox(true);
741         
742         var minX = pos.x;
743         var minY = pos.y;
744         
745         var maxX = pos.right;
746         
747         this._processHorizontalEndItem(eItems, maxX, minX, minY, isInstant);
748         
749         var maxX = maxX - this.unitWidth * 3 - this.gutter * 2 - this.padWidth;
750         
751         Roo.each(queue, function(box, k){
752             
753             Roo.each(box, function(b, kk){
754                 
755                 b.el.position('absolute');
756                 
757                 var width = Math.floor(this.unitWidth * b.x + (this.gutter * (b.x - 1)) + b.el.getPadding('lr'));
758                 var height = Math.floor(this.unitWidth * b.y + (this.gutter * (b.y - 1)) + b.el.getPadding('tb'));
759                 
760                 if(b.size == 'md-left' || b.size == 'md-right'){
761                     width = Math.floor(this.unitWidth * (b.x - 1) + (this.gutter * (b.x - 2)) + b.el.getPadding('lr'));
762                     height = Math.floor(this.unitWidth * (b.y - 1) + (this.gutter * (b.y - 2)) + b.el.getPadding('tb'));
763                 }
764                 
765                 b.el.setWidth(width);
766                 b.el.setHeight(height);
767                 
768             }, this);
769             
770             if(!box.length){
771                 return;
772             }
773             
774             var positions = [];
775             
776             switch (box.length){
777                 case 1 :
778                     positions = this.getHorizontalOneBoxColPositions(maxX, minY, box);
779                     break;
780                 case 2 :
781                     positions = this.getHorizontalTwoBoxColPositions(maxX, minY, box);
782                     break;
783                 case 3 :
784                     positions = this.getHorizontalThreeBoxColPositions(maxX, minY, box);
785                     break;
786                 default :
787                     break;
788             }
789             
790             Roo.each(box, function(b,kk){
791                 
792                 b.el.setXY([positions[kk].x, positions[kk].y], isInstant ? false : true);
793                 
794                 maxX = Math.min(maxX, positions[kk].x - this.padWidth);
795                 
796             }, this);
797             
798         }, this);
799         
800     },
801     
802     _processHorizontalEndItem : function(eItems, maxX, minX, minY, isInstant)
803     {
804         Roo.each(eItems, function(b,k){
805             
806             b.size = (k == 0) ? 'sm' : 'xs';
807             b.x = (k == 0) ? 2 : 1;
808             b.y = (k == 0) ? 2 : 1;
809             
810             b.el.position('absolute');
811             
812             var width = Math.floor(this.unitWidth * b.x + (this.gutter * (b.x - 1)) + b.el.getPadding('lr'));
813                 
814             b.el.setWidth(width);
815             
816             var height = Math.floor(this.unitWidth * b.y + (this.gutter * (b.y - 1)) + b.el.getPadding('tb'));
817             
818             b.el.setHeight(height);
819             
820         }, this);
821
822         var positions = [];
823         
824         positions.push({
825             x : maxX - this.unitWidth * 2 - this.gutter,
826             y : minY
827         });
828         
829         positions.push({
830             x : maxX - this.unitWidth,
831             y : minY + (this.unitWidth + this.gutter) * 2
832         });
833         
834         positions.push({
835             x : maxX - this.unitWidth * 3 - this.gutter * 2,
836             y : minY
837         });
838         
839         Roo.each(eItems, function(b,k){
840             
841             b.el.setXY([positions[k].x, positions[k].y], isInstant ? false : true);
842
843         }, this);
844         
845     },
846     
847     getVerticalOneBoxColPositions : function(x, y, box)
848     {
849         var pos = [];
850         
851         var rand = Math.floor(Math.random() * ((4 - box[0].x)));
852         
853         if(box[0].size == 'md-left'){
854             rand = 0;
855         }
856         
857         if(box[0].size == 'md-right'){
858             rand = 1;
859         }
860         
861         pos.push({
862             x : x + (this.unitWidth + this.gutter) * rand,
863             y : y
864         });
865         
866         return pos;
867     },
868     
869     getVerticalTwoBoxColPositions : function(x, y, box)
870     {
871         var pos = [];
872         
873         if(box[0].size == 'xs'){
874             
875             pos.push({
876                 x : x,
877                 y : y + ((this.unitWidth + this.gutter) * Math.floor(Math.random() * box[1].y))
878             });
879
880             pos.push({
881                 x : x + (this.unitWidth + this.gutter) * (3 - box[1].x),
882                 y : y
883             });
884             
885             return pos;
886             
887         }
888         
889         pos.push({
890             x : x,
891             y : y
892         });
893
894         pos.push({
895             x : x + (this.unitWidth + this.gutter) * 2,
896             y : y + ((this.unitWidth + this.gutter) * Math.floor(Math.random() * box[0].y))
897         });
898         
899         return pos;
900         
901     },
902     
903     getVerticalThreeBoxColPositions : function(x, y, box)
904     {
905         var pos = [];
906         
907         if(box[0].size == 'xs' && box[1].size == 'xs' && box[2].size == 'xs'){
908             
909             pos.push({
910                 x : x,
911                 y : y
912             });
913
914             pos.push({
915                 x : x + (this.unitWidth + this.gutter) * 1,
916                 y : y
917             });
918             
919             pos.push({
920                 x : x + (this.unitWidth + this.gutter) * 2,
921                 y : y
922             });
923             
924             return pos;
925             
926         }
927         
928         if(box[0].size == 'xs' && box[1].size == 'xs'){
929             
930             pos.push({
931                 x : x,
932                 y : y
933             });
934
935             pos.push({
936                 x : x,
937                 y : y + ((this.unitWidth + this.gutter) * (box[2].y - 1))
938             });
939             
940             pos.push({
941                 x : x + (this.unitWidth + this.gutter) * 1,
942                 y : y
943             });
944             
945             return pos;
946             
947         }
948         
949         pos.push({
950             x : x,
951             y : y
952         });
953
954         pos.push({
955             x : x + (this.unitWidth + this.gutter) * 2,
956             y : y
957         });
958
959         pos.push({
960             x : x + (this.unitWidth + this.gutter) * 2,
961             y : y + (this.unitWidth + this.gutter) * (box[0].y - 1)
962         });
963             
964         return pos;
965         
966     },
967     
968     getVerticalFourBoxColPositions : function(x, y, box)
969     {
970         var pos = [];
971         
972         if(box[0].size == 'xs'){
973             
974             pos.push({
975                 x : x,
976                 y : y
977             });
978
979             pos.push({
980                 x : x,
981                 y : y + (this.unitWidth + this.gutter) * 1
982             });
983             
984             pos.push({
985                 x : x,
986                 y : y + (this.unitWidth + this.gutter) * 2
987             });
988             
989             pos.push({
990                 x : x + (this.unitWidth + this.gutter) * 1,
991                 y : y
992             });
993             
994             return pos;
995             
996         }
997         
998         pos.push({
999             x : x,
1000             y : y
1001         });
1002
1003         pos.push({
1004             x : x + (this.unitWidth + this.gutter) * 2,
1005             y : y
1006         });
1007
1008         pos.push({
1009             x : x + (this.unitWidth + this.gutter) * 2,
1010             y : y + (this.unitWidth + this.gutter) * 1
1011         });
1012
1013         pos.push({
1014             x : x + (this.unitWidth + this.gutter) * 2,
1015             y : y + (this.unitWidth + this.gutter) * 2
1016         });
1017
1018         return pos;
1019         
1020     },
1021     
1022     getHorizontalOneBoxColPositions : function(maxX, minY, box)
1023     {
1024         var pos = [];
1025         
1026         if(box[0].size == 'md-left'){
1027             pos.push({
1028                 x : maxX - this.unitWidth * (box[0].x - 1) - this.gutter * (box[0].x - 2),
1029                 y : minY
1030             });
1031             
1032             return pos;
1033         }
1034         
1035         if(box[0].size == 'md-right'){
1036             pos.push({
1037                 x : maxX - this.unitWidth * (box[0].x - 1) - this.gutter * (box[0].x - 2),
1038                 y : minY + (this.unitWidth + this.gutter) * 1
1039             });
1040             
1041             return pos;
1042         }
1043         
1044         var rand = Math.floor(Math.random() * (4 - box[0].y));
1045         
1046         pos.push({
1047             x : maxX - this.unitWidth * box[0].x - this.gutter * (box[0].x - 1),
1048             y : minY + (this.unitWidth + this.gutter) * rand
1049         });
1050         
1051         return pos;
1052         
1053     },
1054     
1055     getHorizontalTwoBoxColPositions : function(maxX, minY, box)
1056     {
1057         var pos = [];
1058         
1059         pos.push({
1060             x : maxX - this.unitWidth * box[0].x - this.gutter * (box[0].x - 1),
1061             y : minY
1062         });
1063
1064         pos.push({
1065             x : maxX - this.unitWidth * box[1].x - this.gutter * (box[1].x - 1),
1066             y : minY + (this.unitWidth + this.gutter) * (3 - box[1].y)
1067         });
1068         
1069         return pos;
1070         
1071     },
1072     
1073     getHorizontalThreeBoxColPositions : function(maxX, minY, box)
1074     {
1075         var pos = [];
1076         
1077         pos.push({
1078             x : maxX - this.unitWidth,
1079             y : minY
1080         });
1081         
1082         pos.push({
1083             x : maxX - this.unitWidth,
1084             y : minY - this.unitWidth - this.gutter
1085         });
1086         
1087         pos.push({
1088             x : maxX - this.unitWidth,
1089             y : minY - (this.unitWidth + this.gutter) * 2
1090         });
1091         
1092         return pos;
1093         
1094     }
1095     
1096 });
1097
1098  
1099
1100