/**
 * jQuery Cookie plugin
 *
 * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */
jQuery.cookie = function (key, value, options) { if (arguments.length > 1 && String(value) !== "[object Object]") { options = jQuery.extend({}, options); if (value === null || value === undefined) { options.expires = -1; } if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setDate(t.getDate() + days); } value = String(value); return (document.cookie = [ encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } options = value || {}; var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent; return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null; };

/**
 *
 * Color picker
 * Author: Stefan Petre www.eyecon.ro
 *
 * Dual licensed under the MIT and GPL licenses
 *
 */
(function ($) { 
var ColorPicker = function () { 
  var ids = {}, 
  inAction, 
  charMin = 65, 
  visible, 
  tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_opacity"><input type="text" maxlength="3" size="3" /></div><div class="colorpicker_submit"></div></div>', 
  defaults = { 
    eventName: 'click', 
    onShow: function () {}, 
    onBeforeShow: function(){}, 
    onHide: function () {}, 
    onChange: function () {}, 
    onSubmit: function () {}, 
    color: 'ff0000',
    opacity: 100, 
    livePreview: true, 
    flat: false 
  }, 
  fillRGBFields = function  (hsb, cal) { 
    var rgb = HSBToRGB(hsb); 
    $(cal).data('colorpicker').fields .eq(1).val(rgb.r).end() .eq(2).val(rgb.g).end() .eq(3).val(rgb.b).end(); 
  }, 
  fillHSBFields = function  (hsb, cal) { 
    $(cal).data('colorpicker').fields .eq(4).val(hsb.h).end() .eq(5).val(hsb.s).end() .eq(6).val(hsb.b).end(); 
  }, 
  fillHexFields = function (hsb, cal) { 
    $(cal).data('colorpicker').fields .eq(0).val(HSBToHex(hsb)).end(); 
  },
  fillOpacityFields = function (hsb, cal) {
    $(cal).data('colorpicker').fields .eq(7).val(rgb.a).end();
  }, 
  setSelector = function (hsb, cal) { 
    $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100})); 
    $(cal).data('colorpicker').selectorIndic.css({ left: parseInt(150 * hsb.s/100, 10), top: parseInt(150 * (100-hsb.b)/100, 10) }); 
  },  
  setHue = function (hsb, cal) { 
    $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10)); 
  }, 
  setCurrentColor = function (hsb, cal) { 
    if($(cal).data('colorpicker').fields .eq(7).val() != 0){
      var rgb = HSBToRGB(hsb);
      var opacity = parseFloat($(cal).data('colorpicker').fields .eq(7).val() / 100);
      $(cal).data('colorpicker').currentColor.css('backgroundColor', 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + opacity + ')');
    } else {
      $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
    } 
  }, 
  setNewColor = function (hsb, cal) { 
    if($(cal).data('colorpicker').fields .eq(7).val() != 0){
      var rgb = HSBToRGB(hsb);
      var opacity = parseFloat($(cal).data('colorpicker').fields .eq(7).val() / 100);
      $(cal).data('colorpicker').newColor.css('backgroundColor', 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + opacity + ')');
    } else {
      $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
    } 
  }, 
  keyDown = function (ev) { 
    var pressedKey = ev.charCode || ev.keyCode || -1; 
    if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) { 
      return false; 
    } 
    var cal = $(this).parent().parent(); 
    if (cal.data('colorpicker').livePreview === true) { 
      change.apply(this); } 
    }, 
  change = function (ev) { 
    var cal = $(this).parent().parent(), col; 
    if (this.parentNode.className.indexOf('_hex') > 0){ 
      cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value)); 
    } else if (this.parentNode.className.indexOf('_hsb') > 0) { 
      cal.data('colorpicker').color = col = fixHSB({ h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10), s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10), b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10) }); 
    } else { 
      cal.data('colorpicker').color = col = RGBToHSB(fixRGB({ r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10), g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10), b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10) })); 
    } 
    
    if (ev) { 
      fillRGBFields(col, cal.get(0)); 
      fillHexFields(col, cal.get(0)); 
      fillHSBFields(col, cal.get(0)); 
    } 
    setSelector(col, cal.get(0)); 
    setHue(col, cal.get(0)); 
    setNewColor(col, cal.get(0));
    alpha = $(cal).data('colorpicker').fields .eq(7).val();
    if(alpha == ''){alpha=0;} 
    cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col),alpha]); 
  }, 
  blur = function (ev) { 
    var cal = $(this).parent().parent(); 
    cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus'); 
  }, 
  focus = function () { 
    charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65; 
    $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus'); 
    $(this).parent().addClass('colorpicker_focus'); 
  }, 
  downIncrement = function (ev) { 
    var field = $(this).parent().find('input').focus(); 
    var current = { el: $(this).parent().addClass('colorpicker_slider'), max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255), y: ev.pageY, field: field, val: parseInt(field.val(), 10), preview: $(this).parent().parent().data('colorpicker').livePreview}; 
    
    $(document).bind('mouseup', current, upIncrement); 
    $(document).bind('mousemove', current, moveIncrement); 
  }, 
  moveIncrement = function (ev) { 
    ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10)))); 
    if (ev.data.preview) { 
      change.apply(ev.data.field.get(0), [true]); 
    } 
    return false; 
    }, 
  upIncrement = function (ev) { 
    change.apply(ev.data.field.get(0), [true]); 
    ev.data.el.removeClass('colorpicker_slider').find('input').focus(); 
    $(document).unbind('mouseup', upIncrement); 
    $(document).unbind('mousemove', moveIncrement); 
    return false; 
  }, 
  downHue = function (ev) { 
    var current = { cal: $(this).parent(), y: $(this).offset().top }; 
    current.preview = current.cal.data('colorpicker').livePreview; 
    $(document).bind('mouseup', current, upHue); 
    $(document).bind('mousemove', current, moveHue); 
  }, 
  moveHue = function (ev) { 
    change.apply( ev.data.cal.data('colorpicker') .fields .eq(4) .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10)) .get(0), [ev.data.preview] ); 
    return false; 
  }, 
  upHue = function (ev) { 
    fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 
    fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 
    $(document).unbind('mouseup', upHue); 
    $(document).unbind('mousemove', moveHue); 
    return false; 
  }, 
  downSelector = function (ev) { 
    var current = { cal: $(this).parent(), pos: $(this).offset() }; 
    current.preview = current.cal.data('colorpicker').livePreview; 
    $(document).bind('mouseup', current, upSelector); 
    $(document).bind('mousemove', current, moveSelector); 
  }, 
  moveSelector = function (ev) { 
    change.apply( ev.data.cal.data('colorpicker') .fields .eq(6) .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10)) .end() .eq(5) .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10)) .get(0), [ev.data.preview] ); 
    return false; 
  }, 
  upSelector = function (ev) { 
    fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); $(document).unbind('mouseup', upSelector); 
    $(document).unbind('mousemove', moveSelector); 
    return false; 
  }, 
  enterSubmit = function (ev) { 
    $(this).addClass('colorpicker_focus'); 
  }, 
  leaveSubmit = function (ev) { 
    $(this).removeClass('colorpicker_focus'); 
  }, 
  clickSubmit = function (ev) { 
    var cal = $(this).parent(); 
    var col = cal.data('colorpicker').color; 
    cal.data('colorpicker').origColor = col; 
    setCurrentColor(col, cal.get(0)); cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el); 
  }, 
  show = function (ev) { 
    var cal = $('#' + $(this).data('colorpickerId')); 
    cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]); 
    var pos = $(this).offset(); 
    var viewPort = getViewport(); 
    var top = pos.top + this.offsetHeight; 
    var left = pos.left; 
    if (top + 176 > viewPort.t + viewPort.h) { 
      top -= this.offsetHeight + 176; 
    } 
    if (left + 356 > viewPort.l + viewPort.w) { 
      left -= 356; 
    } 
    cal.css({left: left + 'px', top: top + 'px'}); 
    if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) { 
      cal.show(); 
    } 
    $(document).bind('mousedown', {cal: cal}, hide); 
    return false; 
  }, 
  hide = function (ev) { 
    if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) { 
      if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) { 
        ev.data.cal.hide(); 
      } 
      $(document).unbind('mousedown', hide); 
    } 
  }, 
  isChildOf = function(parentEl, el, container) { 
    if (parentEl == el) { 
      return true; 
    } 
    if (parentEl.contains) { 
      return parentEl.contains(el); 
    } 
    if ( parentEl.compareDocumentPosition ) { 
      return !!(parentEl.compareDocumentPosition(el) & 16); 
    } 
    var prEl = el.parentNode; 
    while(prEl && prEl != container) { 
      if (prEl == parentEl) return true; 
      prEl = prEl.parentNode; 
    } 
    return false; 
  }, 
  getViewport = function () { 
    var m = document.compatMode == 'CSS1Compat'; 
    return { l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft), t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop), w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth), h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight) }; 
  }, 
  fixHSB = function (hsb) { 
    return { h: Math.min(360, Math.max(0, hsb.h)), s: Math.min(100, Math.max(0, hsb.s)), b: Math.min(100, Math.max(0, hsb.b)) }; 
  }, 
  fixRGB = function (rgb) { 
    return { r: Math.min(255, Math.max(0, rgb.r)), g: Math.min(255, Math.max(0, rgb.g)), b: Math.min(255, Math.max(0, rgb.b)) }; 
  }, 
  fixHex = function (hex) { 
    var len = 6 - hex.length; 
    if (len > 0) { 
      var o = []; 
      for (var i=0; i<len; i++) { 
        o.push('0'); 
      } 
      o.push(hex); 
      hex = o.join(''); 
    } 
    return hex; 
  }, 
  HexToRGB = function (hex) { 
    var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16); 
    return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)}; }, HexToHSB = function (hex) { return RGBToHSB(HexToRGB(hex)); 
  }, 
  RGBToHSB = function (rgb) { 
    var hsb = { h: 0, s: 0, b: 0 }; 
    var min = Math.min(rgb.r, rgb.g, rgb.b); 
    var max = Math.max(rgb.r, rgb.g, rgb.b); 
    var delta = max - min; hsb.b = max; 
    if (max != 0) { } hsb.s = max != 0 ? 255 * delta / max : 0; 
    if (hsb.s != 0) { 
      if (rgb.r == max) { 
        hsb.h = (rgb.g - rgb.b) / delta; 
      } else if (rgb.g == max) { 
        hsb.h = 2 + (rgb.b - rgb.r) / delta; 
      } else { 
        hsb.h = 4 + (rgb.r - rgb.g) / delta; 
      } 
    } else { 
      hsb.h = -1; 
    } 
    hsb.h *= 60; 
    if (hsb.h < 0) { 
      hsb.h += 360; 
    } 
    hsb.s *= 100/255; 
    hsb.b *= 100/255; 
    return hsb; 
  }, 
  HSBToRGB = function (hsb) { 
    var rgb = {}; 
    var h = Math.round(hsb.h); 
    var s = Math.round(hsb.s*255/100); 
    var v = Math.round(hsb.b*255/100); 
    if(s == 0) { 
      rgb.r = rgb.g = rgb.b = v; 
    } else { 
      var t1 = v; 
      var t2 = (255-s)*v/255; 
      var t3 = (t1-t2)*(h%60)/60; 
      if(h==360) h = 0; 
      if(h<60) {
        rgb.r=t1;	rgb.b=t2; rgb.g=t2+t3
      } else if(h<120) {
        rgb.g=t1; rgb.b=t2;	rgb.r=t1-t3
      } else if(h<180) {
        rgb.g=t1; rgb.r=t2;	rgb.b=t2+t3
      } else if(h<240) {
        rgb.b=t1; rgb.r=t2;	rgb.g=t1-t3
      } else if(h<300) {
        rgb.b=t1; rgb.g=t2;	rgb.r=t2+t3
      } else if(h<360) {
        rgb.r=t1; rgb.g=t2;	rgb.b=t1-t3
      } else {
        rgb.r=0; rgb.g=0;	rgb.b=0
      } 
    } 
    return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)}; 
  }, 
  RGBToHex = function (rgb) { 
    var hex = [ rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16) ]; 
    $.each(hex, function (nr, val) { 
      if (val.length == 1) { 
        hex[nr] = '0' + val; } 
    }); 
    return hex.join(''); 
  }, 
  HSBToHex = function (hsb) { 
    return RGBToHex(HSBToRGB(hsb)); 
  }, 
  restoreOriginal = function () { 
    var cal = $(this).parent(); 
    var col = cal.data('colorpicker').origColor; 
    cal.data('colorpicker').color = col; 
    fillRGBFields(col, cal.get(0)); fillHexFields(col, cal.get(0)); fillHSBFields(col, cal.get(0)); setSelector(col, cal.get(0)); setHue(col, cal.get(0)); setNewColor(col, cal.get(0)); 
  }; 
  return { init: function (opt) { 
    opt = $.extend({}, defaults, opt||{}); 
    if (typeof opt.color == 'string') { 
      opt.color = HexToHSB(opt.color); 
    } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) { 
      opt.color = RGBToHSB(opt.color); 
    } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) { 
      opt.color = fixHSB(opt.color); 
    } else { 
      return this; 
    } 
    return this.each(function () { 
      if (!$(this).data('colorpickerId')) { 
        var options = $.extend({}, opt); 
        options.origColor = opt.color; 
        var id = 'collorpicker_' + parseInt(Math.random() * 1000); 
        $(this).data('colorpickerId', id); 
        var cal = $(tpl).attr('id', id); 
        if (options.flat) { 
          cal.appendTo(this).show(); 
        } else { 
          cal.appendTo(document.body); 
        } 
        options.fields = cal .find('input') .bind('keyup', keyDown) .bind('change', change) .bind('blur', blur) .bind('focus', focus); cal .find('span').bind('mousedown', downIncrement).end() .find('>div.colorpicker_current_color').bind('click', restoreOriginal); 
        options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector); 
        options.selectorIndic = options.selector.find('div div'); 
        options.el = this; 
        options.hue = cal.find('div.colorpicker_hue div'); 
        
        cal.find('div.colorpicker_hue').bind('mousedown', downHue); 
        options.newColor = cal.find('div.colorpicker_new_color'); 
        options.currentColor = cal.find('div.colorpicker_current_color'); 
        cal.data('colorpicker', options); 
        
        cal.find('div.colorpicker_submit') .bind('mouseenter', enterSubmit) .bind('mouseleave', leaveSubmit) .bind('click', clickSubmit); 
        fillRGBFields(options.color, cal.get(0)); 
        fillHSBFields(options.color, cal.get(0)); 
        fillHexFields(options.color, cal.get(0)); 
        setHue(options.color, cal.get(0)); 
        setSelector(options.color, cal.get(0)); 
        setCurrentColor(options.color, cal.get(0)); 
        setNewColor(options.color, cal.get(0)); 
        if (options.flat) { 
          cal.css({ position: 'relative', display: 'block' }); 
        } else { 
          $(this).bind(options.eventName, show); 
        } 
      } 
    }); 
  }, 
  showPicker: function() { 
    return this.each( function () { 
      if ($(this).data('colorpickerId')) { 
        show.apply(this); 
      } 
    }); 
  }, 
  hidePicker: function() { 
    return this.each( function () { 
      if ($(this).data('colorpickerId')) { 
        $('#' + $(this).data('colorpickerId')).hide(); 
      } 
    }); 
  }, 
  setColor: function(col) { 
    if (typeof col == 'string') { 
      col = HexToHSB(col); 
    } else if (col.r != undefined && col.g != undefined && col.b != undefined) { 
      col = RGBToHSB(col); 
    } else if (col.h != undefined && col.s != undefined && col.b != undefined) { 
      col = fixHSB(col); 
    } else { 
      return this; 
    } 
    return this.each(function(){ 
      if ($(this).data('colorpickerId')) { 
        var cal = $('#' + $(this).data('colorpickerId')); 
        cal.data('colorpicker').color = col; 
        cal.data('colorpicker').origColor = col; 
        fillRGBFields(col, cal.get(0)); 
        fillHSBFields(col, cal.get(0)); 
        fillHexFields(col, cal.get(0)); 
        setHue(col, cal.get(0)); setSelector(col, cal.get(0)); setCurrentColor(col, cal.get(0)); setNewColor(col, cal.get(0)); 
      } 
    }); 
  } 
}; }(); 

$.fn.extend({ ColorPicker: ColorPicker.init, ColorPickerHide: ColorPicker.hidePicker, ColorPickerShow: ColorPicker.showPicker, ColorPickerSetColor: ColorPicker.setColor }); })(jQuery);


/**
 * Cookies on steroids
 * https://gist.github.com/1184183
 *
 * Copyright (c) 2011 Cifro Nix (about.me/Cifro)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

var Cookies = { cookieName: 'cookiesOnSteroids', jquery: {}, cookiePlugin: {}, path: '/', data: {}, get: function(key){ return this.load(key); }, set: function(key, value){ this.data[key] = value; this.save(); return value; }, reset: function(){ this.data = {}; this.cookiePlugin(this.cookieName, null, {path: this.path}); }, load: function(key){ var data = JSON.parse(this.cookiePlugin(this.cookieName)); if(data == null){ return null; } this.data = data; if(key == undefined){ return this.data; }else{ if(this.data[key] != undefined) return this.data[key]; else return null; } }, save: function(data){ if(data != undefined){ this.data = this.jquery.extend(this.data, data); } var opt = {path: this.path}; var temp = JSON.parse(this.cookiePlugin(this.cookieName)); if(temp == null){ this.cookiePlugin(this.cookieName, JSON.stringify(this.data), opt); }else{ var mergedData = this.jquery.extend(temp, this.data); this.cookiePlugin(this.cookieName, JSON.stringify(mergedData), opt); } } }