/**
 * Polifill for the localStorage and sessionStorage
 * Based on Remy Sharp's  Storage polyfill - thanks
 *
 * @module qui/classes/storage/Polyfill
 * @author www.pcsg.de (Henning Leutz)
 */

/* jshint ignore:start */
define('qui/classes/storage/Polyfill', function() {
    'use strict';

    if (typeof window.localStorage !== 'undefined' &&
        typeof window.sessionStorage !== 'undefined') {
        return;
    }

    var Storage = function(type) {
        function createCookie(name, value, days)
        {
            var date, expires;

            if (days) {
                date = new Date();
                date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                expires = '; expires=' + date.toGMTString();
            } else {
                expires = '';
            }

            document.cookie = name + '=' + value + expires + '; path=/';
        }

        function readCookie(name)
        {
            var i, c,

                nameEQ = name + '=',
                ca = document.cookie.split(';');

            for (i = 0; i < ca.length; i++) {
                c = ca[i];

                while (c.charAt(0) == ' ') {
                    c = c.substring(1, c.length);
                }

                if (c.indexOf(nameEQ) === 0) {
                    return c.substring(nameEQ.length, c.length);
                }
            }

            return null;
        }

        function setData(data)
        {
            data = JSON.stringify(data);

            if (type == 'session') {
                window.name = data;
            } else {
                createCookie('localStorage', data, 365);
            }
        }

        function clearData()
        {
            if (type == 'session') {
                window.name = '';

            } else {
                createCookie('localStorage', '', 365);
            }
        }

        function getData()
        {
            var data = type == 'session' ? window.name : readCookie('localStorage');
            return data ? JSON.parse(data) : {};
        }

        // initialise if there's already data
        var data = getData();

        return {
            length: 0,

            clear: function() {
                data = {};
                this.length = 0;
                clearData();
            },

            getItem: function(key) {
                return data[key] === undefined ? null : data[key];
            },

            key: function(i) {
                // not perfect, but works
                var ctr = 0;
                for (var k in data) {
                    if (ctr == i) {
                        return k;
                    } else {
                        ctr++;
                    }
                }

                return null;
            },

            removeItem: function(key) {
                delete data[key];
                this.length--;
                setData(data);
            },

            setItem: function(key, value) {
                data[key] = value + ''; // forces the value to a string
                this.length++;
                setData(data);
            }
        };
    };

    if (typeof window.localStorage === 'undefined') {
        window.localStorage = new Storage('local');
    }

    if (typeof window.sessionStorage === 'undefined') {
        window.sessionStorage = new Storage('session');
    }

    return Storage;
});
/* jshint ignore:end */