<!-- The <sort-sk> custom element declaration.

Allows sorting the members of the indicated element by
the values of the data attributes.

Add children to <sort-sk> that generate click events and that
have child content, such as button or paper-button elements.
Add a data-key attribute to each child element that indicates
which data-* attribute the children should be sorted on.

Note that all sorting is done numerically, not alphabetically.

Additionally a single child element can have a data-default attribute
with a value of "up" or "down" to indicate the default sorting
that already exists in the data.

An example usage, that will present two buttons to sort
the contents of div#stuffToBeSorted.

        <sort-sk target=stuffToBeSorted>
          <paper-button data-key="clustersize"
              data-default=down>Cluster Size </paper-button>
          <paper-button data-key="stepsize">Step Size </paper-button>
        </sort-sk>
        <div id=stuffToBeSorted>
          <div data-clustersize=10 data-stepsize=0.5></div>
          <div data-clustersize=50 data-stepsize=1.2></div>
          ...
        </div>


  Attributes:
    target - The id of the container element whose children are to be sorted.

-->
<polymer-element name="sort-sk" attributes="target">
  <template>
    <content></content>
  </template>
  <script>
    (function(){
      // The states to move each button through on a click.
      var toggle = {
        "":                "arrow-drop-down",
        "arrow-drop-down": "arrow-drop-up",
        "arrow-drop-up":   "arrow-drop-down",
      }

      Polymer({
        ready: function() {
          var that = this;
          // Start by appending a core-icon to each clickable child and
          // registering for the click event.
          $$('[data-key]', this).forEach(function(ele) {
            var ico = document.createElement('core-icon');
            ele.appendChild(ico);
            ele.addEventListener('click', that.clickHandler.bind(that));
          });

          // Handle a default value if one has been set.
          var def = $$$('[data-default]', this);
          if (def) {
            var defIcon = $$$('core-icon', def);
            defIcon.style.visibility = 'initial';
            defIcon.icon = 'arrow-drop-' + def.dataset.default;
          }
        },

        clickHandler: function(e) {
          var ico = $$$('core-icon', e.target);

          // Set the children elements icons to reflect the new sorting order.
          ico.icon = toggle[ico.icon];
          ico.style.visibility = "initial";
          $$('[data-key]', this).forEach(function(ele) {
            if (ele.dataset.key !== e.target.dataset.key) {
              $$$('core-icon', ele).style.visibility= "hidden";
            }
          });

          // Remember the direction we are sorting in.
          var up = (ico.icon.indexOf("-up") > -1);

          // Sort the children of the element at #target.
          var sortBy = e.target.dataset.key;
          var container = $$$('#'+this.target);
          var elements = [];
          var children = container.children;
          for (var i=0; i<children.length; i++) {
            var ele = children[i];
            elements.push({
              value: +ele.dataset[sortBy],
              node: ele
            });
          }
          elements.sort(function(x, y) {
            if (up) {
              return x.value - y.value;
            } else {
              return y.value - x.value;
            }
          });
          elements.forEach(function(i) {
            container.appendChild(i.node);
          });
        }
      });
    })();
  </script>
</polymer-element>

