enmi12/glossaire/_posts/custom-layout-modes/2011-12-05-big-graph.html
changeset 0 d970ebf37754
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/enmi12/glossaire/_posts/custom-layout-modes/2011-12-05-big-graph.html	Wed Nov 06 03:21:17 2013 +0000
@@ -0,0 +1,196 @@
+---
+title: BIG Graph
+layout: default
+category: custom-layout-modes
+---
+
+<section id="copy">
+  <p><a href="../docs/extending-isotope.html">Custom layout mode</a> to replicate the Flash interface of <a href="http://big.dk">big.dk</a>. Similiar to <a href="category-rows.html">Category rows</a>, item elements are grouped by their sorting data into columns.</p>
+
+{% highlight javascript %}
+
+$container.isotope({
+  layoutMode: 'bigGraph',
+  bigGraph: {
+    columnWidth: 45, // size of item
+    rowHeight: 45, // size of item
+    maxRows: 11, // max number of items vertically
+    gutterWidth: { // width of gutter, needs to match getSortData names
+      year: 0,
+      scale: 60,
+      program: 40,
+      status: 60,
+      title: 0
+    }
+  },
+  // options...
+});
+
+{% endhighlight %}
+
+  <p>To use this layout mode, grab the <code>$.Isotope.prototype</code> methods from the script at the bottom of this page's source.</p>
+
+</section>
+
+<section id="options" class="clearfix">
+
+    <h3>Sort</h3>
+
+    <ul id="sort-by" class="option-set clearfix" data-option-key="sortBy">
+      <li><a href="#sortBy=year" data-option-value="year" class="selected" data>Chronological</a></li>
+      <li><a href="#sortBy=title" data-option-value="title">Alphabetical</a></li>
+      <li><a href="#sortBy=program" data-option-value="program">Programmatic</a></li>
+      <li><a href="#sortBy=scale" data-option-value="scale">Scale</a></li>
+      <li><a href="#sortBy=status"  data-option-value="status">Status</a></li>
+    </ul>
+
+</section> <!-- #options -->
+
+<div id="container" class="big-graph clearfix">
+  
+</div> <!-- #container -->
+
+
+<script src="../{{ site.jquery_js }}"></script>
+<script src="../{{ site.isotope_js }}"></script>
+<script src="../js/make-big-graph-projects.js"></script> 
+<script>
+
+  // categoryRows custom layout mode
+  $.extend( $.Isotope.prototype, {
+
+    _bigGraphReset : function() {
+      this.bigGraph = {
+        x : 0,
+        y : 0,
+        height : 0,
+        column: 0,
+        row: 0,
+        gutter: 0,
+        currentCategory : null
+      };
+    },
+
+    _bigGraphLayout : function( $elems ) {
+      var instance = this,
+          containerWidth = this.element.width(),
+          bigGraphOpts = this.options.bigGraph,
+          sortBy = this.options.sortBy,
+          elemsGroup = {},
+          props = this.bigGraph;
+
+      // group item elements into categories based on their sorting data
+      $elems.each( function() {
+        var category = $.data( this, 'isotope-sort-data' )[ sortBy ];
+        elemsGroup[ category ] = elemsGroup[ category ] || [];
+        elemsGroup[ category ].push( this );
+      });
+  
+      var group, groupName, groupMaxRows, groupLen,
+          gutterWidth = bigGraphOpts.gutterWidth[ sortBy ],
+          x, y;
+      // for each group...
+      for ( groupName in elemsGroup ) {
+        group = elemsGroup[ groupName ];
+        groupLen = group.length;
+        // make groups look nice, by limiting rows, makes for blockier blocks
+        groupMaxRows = groupLen / Math.ceil( groupLen / bigGraphOpts.maxRows );
+
+        $.each( group, function( i, elem ) {
+          x = props.column * bigGraphOpts.columnWidth + props.gutter * gutterWidth;
+          y = (bigGraphOpts.maxRows - props.row - 1) * bigGraphOpts.rowHeight;
+          instance._pushPosition( $(elem), x, y );
+          
+          if ( props.row >= groupMaxRows - 1 ) {
+            // start a new column
+            props.row = 0;
+            props.column++;
+          } else {
+            props.row++;
+          }
+        });
+        // start a new group
+        if ( props.row > 0 ) {
+          props.row = 0;
+          props.column++;
+        }
+        props.gutter++;
+      }
+      props.gutter--;
+      props.width = props.column * bigGraphOpts.columnWidth + props.gutter * gutterWidth;
+    },
+
+    _bigGraphGetContainerSize : function () {
+      bigGraphOpts = this.options.bigGraph;
+      this.bigGraph.column++;
+      return {
+        width: this.bigGraph.width,
+        height: bigGraphOpts.maxRows * bigGraphOpts.rowHeight
+      };
+    },
+
+    _bigGraphResizeChanged : function() {
+      return false;
+    }
+
+  });
+
+
+  $(function(){
+    
+    // -------- dynamically create items ---------------- //
+    
+    var i = 120,
+        projects = [];
+    
+    while (i--) {
+      projects.push( makeBigGraphProject() );
+    }
+
+    var $container = $('#container');
+    
+    $container.append( $( projects.join('') ) );
+    
+    // -------- isotope ---------------- //
+    
+    $container.isotope({
+      itemSelector: '.project',
+      layoutMode: 'bigGraph',
+      bigGraph: {
+        columnWidth: 45, // size of item
+        rowHeight: 45, // size of item
+        maxRows: 11, // max number of items vertically
+        gutterWidth: { // width of gutter, needs to match getSortData names
+          year: 0,
+          scale: 0,
+          program: 35,
+          status: 80,
+          title: 0
+        }
+      },
+      sortBy: 'year',
+      getSortData: {
+        year: function( $elem ) {
+          return $elem.attr('data-year');
+        },
+        scale: function( $elem ) {
+          return $elem.attr('data-scale');
+        },
+        program: function( $elem ) {
+          return $elem.attr('data-program');
+        },
+        status: function( $elem ) {
+          return $elem.attr('data-status');
+        },
+        title: function( $elem ) {
+          var chara = $elem.find('p').text()[0];
+          return isNaN( parseInt( chara ) ) ? chara : '0';
+        }
+      }
+    });
+      
+    {% include option-set-buttons.js %}
+
+    
+  });
+</script>