$(function() {
  var loadimagecache = {};

  $.extend({
    request : function(get) {
      var re = new RegExp('[\\?&]'+get+'=([^&]*)(?:&|$)');
      var ret = re.exec(location.href);
      if (ret) {
        return unescape(ret[1]);
      } else {
        return false;
      }
    },
    coordinate : function(events, func) {
      var triggered = 0;

      return function() {
        if (++triggered == events) {
          func();
        }
      };
    },
    loadimage : function(src, func) {
      if (typeof(loadimagecache[src]) != "undefined") {
        func.apply(loadimagecache[src]);
        return loadimagecache[src];
      }
  
      var img = new Image();
      $(img).bind("load", function() {
        loadimagecache[src] = img;
        func.apply(img);
      });
      img.src = src;
      return img;
    },
    cookie : function (key, value, options) {
      if (arguments.length > 1 && (value === null || typeof value !== "object")) {
        options = jQuery.extend({}, options);
        if (value === null) {
          options.expires = -1;
        }
        if (typeof options.expires === 'number') {
          var days = options.expires, t = options.expires = new Date();
          t.setDate(t.getDate() + days);
        }
        return (document.cookie = [
          encodeURIComponent(key), '=',
          options.raw ? String(value) : encodeURIComponent(String(value)),
          options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
          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;
    }
  });
});
