/**
 * 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);
    }
})();
