/*!

* jquery.tagcloud.js
* A Simple Tag Cloud Plugin for JQuery
*
* https://github.com/addywaddy/jquery.tagcloud.js
* created by Adam Groves
*/

(function($) {

/*global jQuery*/
"use strict";

var compareWeights = function(a, b)
{
  return a - b;
};

// Converts hex to an RGB array
var toRGB = function(code) {
  if (code.length === 4) {
    code = code.replace(/(\w)(\w)(\w)/gi, "\$1\$1\$2\$2\$3\$3");
  }
  var hex = /(\w{2})(\w{2})(\w{2})/.exec(code);
  return [parseInt(hex[1], 16), parseInt(hex[2], 16), parseInt(hex[3], 16)];
};

// Converts an RGB array to hex
var toHex = function(ary) {
  return "#" + jQuery.map(ary, function(i) {
    var hex =  i.toString(16);
    hex = (hex.length === 1) ? "0" + hex : hex;
    return hex;
  }).join("");
};

var colorIncrement = function(color, range) {
  return jQuery.map(toRGB(color.end), function(n, i) {
    return (n - toRGB(color.start)[i])/range;
  });
};

var tagColor = function(color, increment, weighting) {
  var rgb = jQuery.map(toRGB(color.start), function(n, i) {
    var ref = Math.round(n + (increment[i] * weighting));
    if (ref > 255) {
      ref = 255;
    } else {
      if (ref < 0) {
        ref = 0;
      }
    }
    return ref;
  });
  return toHex(rgb);
};

$.fn.tagcloud = function(options) {

  var opts = $.extend({}, $.fn.tagcloud.defaults, options);
  var tagWeights = this.map(function(){
    return $(this).attr("rel");
  });
  tagWeights = jQuery.makeArray(tagWeights).sort(compareWeights);
  var lowest = tagWeights[0];
  var highest = tagWeights.pop();
  var range = highest - lowest;
  if(range === 0) {range = 1;}
  // Sizes
  var fontIncr, colorIncr;
  if (opts.size) {
    fontIncr = (opts.size.end - opts.size.start)/range;
  }
  // Colors
  if (opts.color) {
    colorIncr = colorIncrement (opts.color, range);
  }
  return this.each(function() {
    var weighting = $(this).attr("rel") - lowest;
    if (opts.size) {
      $(this).css({"font-size": opts.size.start + (weighting * fontIncr) + opts.size.unit});
    }
    if (opts.color) {
      $(this).css({"color": tagColor(opts.color, colorIncr, weighting)});
    }
  });
};

$.fn.tagcloud.defaults = {
  size: {start: 14, end: 18, unit: "pt"}
};

})(jQuery);