/**
 * Copyright (c) 2005 - 2010, James Auldridge
 * All rights reserved.
 *
 * Licensed under the BSD, MIT, and GPL (your choice!) Licenses:
 *  http://code.google.com/p/cookies/wiki/License
 *
 */
var jaaulde = window.jaaulde || {};
jaaulde.utils = jaaulde.utils || {};
jaaulde.utils.cookies = (function() {
    var resolveOptions,
    assembleOptionsString,
    parseCookies,
    constructor,
    defaultOptions = {
        expiresAt: null,
        path: '/',
        domain: null,
        secure: false
    };
    resolveOptions = function(options) {
        var returnValue,
        expireDate;
        if (typeof options !== 'object' || options === null) {
            returnValue = defaultOptions;
        } else
        {
            returnValue = {
                expiresAt: defaultOptions.expiresAt,
                path: defaultOptions.path,
                domain: defaultOptions.domain,
                secure: defaultOptions.secure
            };
            if (typeof options.expiresAt === 'object' && options.expiresAt instanceof Date) {
                returnValue.expiresAt = options.expiresAt;
            } else if (typeof options.hoursToLive === 'number' && options.hoursToLive !== 0) {
                expireDate = new Date();
                expireDate.setTime(expireDate.getTime() + (options.hoursToLive * 60 * 60 * 1000));
                returnValue.expiresAt = expireDate;
            }
            if (typeof options.path === 'string' && options.path !== '') {
                returnValue.path = options.path;
            }
            if (typeof options.domain === 'string' && options.domain !== '') {
                returnValue.domain = options.domain;
            }
            if (options.secure === true) {
                returnValue.secure = options.secure;
            }
        }
        return returnValue;
    };
    assembleOptionsString = function(options) {
        options = resolveOptions(options);
        return ((typeof options.expiresAt === 'object' && options.expiresAt instanceof Date ? '; expires=' + options.expiresAt.toGMTString() : '') + '; path=' + options.path + (typeof options.domain === 'string' ? '; domain=' + options.domain: '') + (options.secure === true ? '; secure': ''));
    };
    parseCookies = function() {
        var cookies = {},
        i,
        pair,
        name,
        value,
        separated = document.cookie.split(';'),
        unparsedValue;
        for (i = 0; i < separated.length; i = i + 1) {
            pair = separated[i].split('=');
            name = pair[0].replace(/^\s*/, '').replace(/\s*$/, '');
            try
            {
                value = decodeURIComponent(pair[1]);
            } catch(e1) {
                value = pair[1];
            }
            if (typeof JSON === 'object' && JSON !== null && typeof JSON.parse === 'function') {
                try
                {
                    unparsedValue = value;
                    value = JSON.parse(value);
                } catch(e2) {
                    value = unparsedValue;
                }
            }
            cookies[name] = value;
        }
        return cookies;
    };
    constructor = function() {};
    constructor.prototype.get = function(cookieName) {
        var returnValue,
        item,
        cookies = parseCookies();
        if (typeof cookieName === 'string') {
            returnValue = (typeof cookies[cookieName] !== 'undefined') ? cookies[cookieName] : null;
        } else if (typeof cookieName === 'object' && cookieName !== null) {
            returnValue = {};
            for (item in cookieName) {
                if (typeof cookies[cookieName[item]] !== 'undefined') {
                    returnValue[cookieName[item]] = cookies[cookieName[item]];
                } else
                {
                    returnValue[cookieName[item]] = null;
                }
            }
        } else
        {
            returnValue = cookies;
        }
        return returnValue;
    };
    constructor.prototype.filter = function(cookieNameRegExp) {
        var cookieName,
        returnValue = {},
        cookies = parseCookies();
        if (typeof cookieNameRegExp === 'string') {
            cookieNameRegExp = new RegExp(cookieNameRegExp);
        }
        for (cookieName in cookies) {
            if (cookieName.match(cookieNameRegExp)) {
                returnValue[cookieName] = cookies[cookieName];
            }
        }
        return returnValue;
    };
    constructor.prototype.set = function(cookieName, value, options) {
        if (typeof options !== 'object' || options === null) {
            options = {};
        }
        if (typeof value === 'undefined' || value === null) {
            value = '';
            options.hoursToLive = -8760;
        } else if (typeof value !== 'string') {
            if (typeof JSON === 'object' && JSON !== null && typeof JSON.stringify === 'function') {
                value = JSON.stringify(value);
            } else
            {
                throw new Error('cookies.set() received non-string value and could not serialize.');
            }
        }
        var optionsString = assembleOptionsString(options);
        document.cookie = cookieName + '=' + encodeURIComponent(value) + optionsString;
    };
    constructor.prototype.del = function(cookieName, options) {
        var allCookies = {},
        name;
        if (typeof options !== 'object' || options === null) {
            options = {};
        }
        if (typeof cookieName === 'boolean' && cookieName === true) {
            allCookies = this.get();
        } else if (typeof cookieName === 'string') {
            allCookies[cookieName] = true;
        }
        for (name in allCookies) {
            if (typeof name === 'string' && name !== '') {
                this.set(name, null, options);
            }
        }
    };
    constructor.prototype.test = function() {
        var returnValue = false,
        testName = 'cT',
        testValue = 'data';
        this.set(testName, testValue);
        if (this.get(testName) === testValue) {
            this.del(testName);
            returnValue = true;
        }
        return returnValue;
    };
    constructor.prototype.setOptions = function(options) {
        if (typeof options !== 'object') {
            options = null;
        }
        defaultOptions = resolveOptions(options);
    };
    return new constructor();
})(); (function() {
    if (window.jQuery) { (function($) {
            $.cookies = jaaulde.utils.cookies;
            var extensions = {
                cookify: function(options) {
                    return this.each(function() {
                        var i,
                        nameAttrs = ['name', 'id'],
                        name,
                        $this = $(this),
                        value;
                        for (i in nameAttrs) {
                            if (!isNaN(i)) {
                                name = $this.attr(nameAttrs[i]);
                                if (typeof name === 'string' && name !== '') {
                                    if ($this.is(':checkbox, :radio')) {
                                        if ($this.attr('checked')) {
                                            value = $this.val();
                                        }
                                    } else if ($this.is(':input')) {
                                        value = $this.val();
                                    } else
                                    {
                                        value = $this.html();
                                    }
                                    if (typeof value !== 'string' || value === '') {
                                        value = null;
                                    }
                                    $.cookies.set(name, value, options);
                                    break;
                                }
                            }
                        }
                    });
                },
                cookieFill: function() {
                    return this.each(function() {
                        var n,
                        getN,
                        nameAttrs = ['name', 'id'],
                        name,
                        $this = $(this),
                        value;
                        getN = function() {
                            n = nameAttrs.pop();
                            return !! n;
                        };
                        while (getN()) {
                            name = $this.attr(n);
                            if (typeof name === 'string' && name !== '') {
                                value = $.cookies.get(name);
                                if (value !== null) {
                                    if ($this.is(':checkbox, :radio')) {
                                        if ($this.val() === value) {
                                            $this.attr('checked', 'checked');
                                        } else
                                        {
                                            $this.removeAttr('checked');
                                        }
                                    } else if ($this.is(':input')) {
                                        $this.val(value);
                                    } else
                                    {
                                        $this.html(value);
                                    }
                                }
                                break;
                            }
                        }
                    });
                },
                cookieBind: function(options) {
                    return this.each(function() {
                        var $this = $(this);
                        $this.cookieFill().change(function() {
                            $this.cookify(options);
                        });
                    });
                }
            };
            $.each(extensions,
            function(i) {
                $.fn[i] = this;
            });
        })(window.jQuery);
    }
})();