jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        jQuery.cookie._set(name, value == null ? null : encodeURIComponent(value), options);
    } else { // only name given, get cookie
        var cookieValue = jQuery.cookie._get(name);
        if (cookieValue != null) {
            cookieValue = decodeURIComponent(cookieValue);
        }
        return cookieValue;
    }
};
jQuery.cookie._get = function(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = cookie.substring(name.length + 1);
                break;
            }
        }
    }
    return cookieValue;
}
jQuery.cookie._set = function(name, value, options) {
    options = options || {};
    if (value === null) {
        value = '';
        options.expires = -1;
    }
    var expires = '';
    if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
        var date;
        if (typeof options.expires == 'number') {
            date = new Date();
            date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
        } else {
            date = options.expires;
        }
        expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
    }
    // CAUTION: Needed to parenthesize options.path and options.domain
    // in the following expressions, otherwise they evaluate to undefined
    // in the packed version for some reason...
    var path = options.path ? '; path=' + (options.path) : '';
    var domain = options.domain ? '; domain=' + (options.domain) : '';
    var secure = options.secure ? '; secure' : '';
    document.cookie = [name, '=', value, expires, path, domain, secure].join('');
}
jQuery.cookie.sub = function(name, itemName, value, options) {
    var cookie = jQuery.cookie._get(name);
    if (cookie) {
        var items = cookie.split('&');
        if (typeof value != 'undefined') { // name and value given, set cookie
            var valArray = new Array();
            for (var i = 0; i < items.length; i++) {
                var itemCookie = jQuery.trim(items[i]);
                if (itemCookie.substring(0, itemName.length + 1) != (itemName + '=')) {
                    valArray.push(itemCookie);
                }
            }
            if (value != null) {
                valArray.push(itemName + '=' + encodeURIComponent(value));
            }
            jQuery.cookie._set(name, valArray.join('&'), options);
        } else { // only name given, get cookie
            var cookieValue = null;
            for (var i = 0; i < items.length; i++) {
                var itemCookie = jQuery.trim(items[i]);
                if (itemCookie.substring(0, itemName.length + 1) == (itemName + '=')) {
                    cookieValue = itemCookie.substring(itemName.length + 1);
                    break;
                }
            }
            if (cookieValue != null) {
                cookieValue = decodeURIComponent(cookieValue);
            }
            return cookieValue;
        }
    } else {
        return null;
    }
};
