﻿/* HC.Cookies
**
    examples for use:-

    HC.Cookies.set({
        name: "ben",
        values: ["value1", "value5", "value3", "value6"],
        expires: 7,
        domain: "www.hotelscombined.com"
    });

    HC.Cookies.removeValue("ben", "value5|value1");
    HC.Cookies.addValue("ben", ["value7", "value8"]);
    HC.Cookies.removeValue("ben", "value3");

    // remember to update the other properties after adding or removing values as these properties will be lost..
    HC.Cookies.update({
        name: "ben",
        expires: 7,
        domain: "www.hotelscombined.com"
    });

    myCookie = HC.Cookies.get("ben");
    alert(myCookie.value);
**
*/

HC.Cookies = {

    divider: "|",

    get: function (cookieName) {
        if (document.cookie != null && document.cookie.length > 0) {
            var start = document.cookie.indexOf(cookieName + "=");
            if (start != -1) {
                start = start + cookieName.length + 1;
                var end = document.cookie.indexOf(";", start);
                if (end == -1) {
                    end = document.cookie.length;
                }
                myValue = document.cookie.substring(start, end);
                myValues = myValue.split(this.divider);
                for (var i = 0; i < myValues.length; i++) {
                    myValues[i] = decodeURIComponent(myValues[i]);
                }
                myCookie = {
                    name: cookieName,
                    values: myValues,
                    value: myValues.join(this.divider)
                };
                return myCookie;
            } else {
                return false;
            }
        } else {
            return false;
        }
    },

    buildDateObj: function (myExpires) {
        var date = null;
        switch (typeof (myExpires)) {
            case 'undefined':
                break;
            case 'object':
                // assume date object..
                return myExpires;
                break;
            case 'number':
                // assume number of days from present..
                date = new Date();
                date.setTime(date.getTime() + (myExpires * 24 * 60 * 60 * 1000));
                break;
            default:
                // assume date/time string in UTC..
                if (myExpires != "") {
                    date = new Date(myExpires);
                }
        }
        return date;
    },

    buildCookie: function (myCookie) {
        var cookieStr = "";

        if (typeof (myCookie.name) == "undefined") {
            return false;
        } else {
            cookieStr += $.trim(myCookie.name) + "=";
        }

        if (typeof (myCookie.value) != "undefined") {
            myCookie.values = myCookie.value.split(this.divider);
        }

        if (typeof (myCookie.values) != "undefined" && myCookie.values.length > 0) {
            cookieStr += encodeURIComponent(myCookie.values[0]);
            for (var i = 1; i < myCookie.values.length; i++) {
                cookieStr += this.divider + encodeURIComponent(myCookie.values[i])
            }
        }

        if (typeof (myCookie.expires) != "undefined") {
            var date = this.buildDateObj(myCookie.expires);
            cookieStr += "; expires=" + date.toUTCString();
        }

        if (typeof (myCookie.path) == "undefined") {
            myCookie.path = "/";
        }
        cookieStr += "; path=" + myCookie.path;

        if (typeof (myCookie.secure) != "undefined") {
            if (myCookie.secure) {
                cookieStr += "; secure";
            }
        }
        cookieStr += ";";
        return cookieStr;
    },

    set: function (myCookie) {
        var cookieStr;
        if (document.cookie != null && document.cookie.length > 0) {
            if (cookieStr = this.buildCookie(myCookie)) {
                document.cookie = cookieStr;
            }
            return true;
        } else {
            return false;
        }
    },

    update: function (myCookie) {
        var myExistingCookie = this.get(myCookie.name);
        if (myExistingCookie != null) {
            // alter existing cookie..
            if (typeof (myCookie.value) != "undefined") {
                myExistingCookie.value = myCookie.value;
                delete (myExistingCookie.values);
            }
            if (typeof (myCookie.values) != "undefined") {
                myExistingCookie.values = myCookie.values;
                delete (myExistingCookie.value);  // values overwrites value.
            }
            if (typeof (myCookie.expires) != "undefined") {
                var date = this.buildDateObj(myCookie.expires);
                myExistingCookie.expires = date;
            }
            if (typeof (myCookie.path) != "undefined") {
                myExistingCookie.path = myCookie.path;
            }
            if (typeof (myCookie.domain) != "undefined") {
                myExistingCookie.domain = myCookie.domain;
            }
            if (typeof (myCookie.secure) != "undefined") {
                if (myCookie.secure) {
                    myExistingCookie.secure = true;
                } else {
                    myExistingCookie.secure = false;
                }
            }
            this.set(myExistingCookie);
            return true;
        } else if (typeof (myCookie.value) != "undefined" || typeof (myCookie.values) != "undefined") {
            // create new cookie..
            this.set(myCookie);
            return true;
        } else {
            // no values and no existing cookie, so return false..
            return false;
        }
    },

    remove: function (cookieName) {
        if (document.cookie != null && document.cookie.length > 0) {
            // remove a cookie completely..
            this.set({ name: cookieName, expires: -1 });
            return true;
        } else {
            return false;
        }
    },

    addValue: function (cookieName, cookieValue) {
        if (typeof (cookieValue) == "object") {
            // array of values..
            var myValues = cookieValue;
        } else {
            var myValues = cookieValue.split(this.divider);
        }
        myCookie = this.get(cookieName);
        if (myCookie != null) {
            myCookie.values = myCookie.values.concat(myValues);
            delete (myCookie.value)
            this.set(myCookie);
            return true;
        } else {
            return false;
        }
    },

    removeValue: function (cookieName, cookieValue) {
        if (typeof (cookieValue) == "object") {
            // array of values..
            var myValues = cookieValue;
        } else {
            var myValues = cookieValue.split(this.divider);
        }
        var myCookie = this.get(cookieName);
        //alert("removing value: " + cookieValue + " - cookie's start value is: " + myCookie.value);

        if (myCookie != null) {
            for (var j = 0; j < myValues.length; j++) {
                cookieValue = myValues[j];
                for (var i = 0; i < myCookie.values.length; i++) {
                    if (myCookie.values[i] == cookieValue) {
                        break;
                    }
                }
                if (i < myCookie.values.length) {
                    // value found at index i.
                    myCookie.values.splice(i, 1);
                }
            }
            // update cookie..
            if (myCookie.values.length == 0) {
                // cookie has no values so delete cookie..
                this.remove(cookieName);
            } else {
                // set new values to existing cookie..
                delete (myCookie.value);
                // get options 
                this.set(myCookie);
            }
            return true;
        } else {
            return false;
        }
    },

    hasValue: function (cookieName, cookieValue) {
        var myCookie = this.get(cookieName);
        if (myCookie != null) {
            for (var i = 0; i < myCookie.values.length; i++) {
                if (myCookie.values[i] == cookieValue) {
                    return true;
                }
            }
        }
        return false;
    }
};

