// JavaScript Document

// The constructor function: creates a cookie object for the specified

// document, with a specified name and optional attributes.

// Arguments:

//   document: The Document object that the cookie is stored for. Required.

//   name:     A string that specifies a name for the cookie. Required.

//   hours:    An optional number that specifies the number of hours from now

//             that the cookie should expire.

//   path:     An optional string that specifies the cookie path attribute.

//   domain:   An optional string that specifies the cookie domain attribute.

//   secure:   An optional Boolean value that, if true, requests a secure cookie.

//

function Cookie(document, name, hours, path, domain, secure)

{

    // All the predefined properties of this object begin with '$'

    // to distinguish them from other properties which are the values to

    // be stored in the cookie.

    this.$document = document;

    this.$name = name;

    if (hours)

        this.$expiration = new Date((new Date()).getTime() + hours*3600000);

    else this.$expiration = null;

    if (path) this.$path = path; else this.$path = null;

    if (domain) this.$domain = domain; else this.$domain = null;

    if (secure) this.$secure = true; else this.$secure = false;

}

// This function is the store() method of the Cookie object.

Cookie.prototype.store = function () {

    // First, loop through the properties of the Cookie object and

    // put together the value of the cookie. Since cookies use the

    // equals sign and semicolons as separators, we'll use colons

    // and ampersands for the individual state variables we store 

    // within a single cookie value. Note that we escape the value

    // of each state variable, in case it contains punctuation or other

    // illegal characters.

    var cookieval = "";

    for(var prop in this) {

        // Ignore properties with names that begin with '$' and also methods.

        if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function')) 

            continue;

        if (cookieval != "") cookieval += '&';

        cookieval += prop + ':' + this[prop];

    }

	// cookieval=escape(encrypt_cookie(cookieval));

	//cookieval=escape(cookieval);

    // Now that we have the value of the cookie, put together the 

    // complete cookie string, which includes the name and the various

    // attributes specified when the Cookie object was created.

    var cookie = this.$name + '=' + cookieval;

    if (this.$expiration)

        cookie += '; expires=' + this.$expiration.toGMTString();

    if (this.$path) cookie += '; path=' + this.$path;

    if (this.$domain) cookie += '; domain=' + this.$domain;

    if (this.$secure) cookie += '; secure';

    // Now store the cookie by setting the magic Document.cookie property.

    this.$document.cookie = cookie;

}

// This function is the load() method of the Cookie object.

Cookie.prototype.load = function() { 

    // First, get a list of all cookies that pertain to this document.

    // We do this by reading the magic Document.cookie property.

    var allcookies = this.$document.cookie;

    if (allcookies == "") return false;

    // Now extract just the named cookie from that list.

    var start = allcookies.indexOf(this.$name + '=');

    if (start == -1) return false;   // Cookie not defined for this page.

    start += this.$name.length + 1;  // Skip name and equals sign.

    var end = allcookies.indexOf(';', start);

    if (end == -1) end = allcookies.length;

    var cookieval = allcookies.substring(start, end);

	// cookieval=decrypt_cookie(unescape(cookieval));

	//cookieval=unescape(cookieval);

    // Now that we've extracted the value of the named cookie, we've

    // got to break that value down into individual state variable 

    // names and values. The name/value pairs are separated from each

    // other by ampersands, and the individual names and values are

    // separated from each other by colons. We use the split method

    // to parse everything.

    var a = cookieval.split('&');	    // Break it into array of name/value pairs.

    for(var i=0; i < a.length; i++)  // Break each pair into an array.

        a[i] = a[i].split(':');

    // Now that we've parsed the cookie value, set all the names and values

    // of the state variables in this Cookie object. Note that we unescape()

    // the property value, because we called escape() when we stored it.

    for(var i = 0; i < a.length; i++) {

        this[a[i][0]] = a[i][1];

    }

    // We're done, so return the success code.

    return true;

}

// This function is the remove() method of the Cookie object.

Cookie.prototype.remove = function() {

    var cookie;

    cookie = this.$name + '=';

    if (this.$path) cookie += '; path=' + this.$path;

    if (this.$domain) cookie += '; domain=' + this.$domain;

    cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';

    this.$document.cookie = cookie;

}

var legal_characters = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~&#8364;????¡­???¡ë???????¡®¡¯¡°¡±?¨C¡ª???????? ?¡é¡ê¡è£¤|¡ì¡§?a??-?¡¥¡ã¡À23¡ä¦Ì?¡¤?1o?????¨¤¨¢??????¨¨¨¦¨º?¨¬¨ª??D?¨°¨®???¡Á?¨´¨²?¨¹YT?¨¤¨¢a?????¨¨¨¦¨º?¨¬¨ª??e?¨°¨®???¡Â?¨´¨²?¨¹yt?"

var keytext="ad;flkjasd;flkj";

var keytext_index = 0;

function encrypt_cookie(cookie_value) {

    var cookie_character

    var character_location

    var encrypted_location

    var encrypted_character

    var encrypt_key

    

    // Reset the keytext index

    keytext_index = 0

    // This variable holds the encrypted cookie characters

    var encrypted_string = ""

    

    // Run through each character in the cookie value

    for (var counter = 0; counter < cookie_value.length; counter++) {

    

        // Get the current cookie character

        cookie_character = cookie_value.substring(counter, counter + 1)

        

        // Get the character's location in the string of legal characters

        character_location = legal_characters.indexOf(cookie_character)

        

        // XOR the character location with the generated encrypt_key

        encrypt_key = generate_key();

        encrypted_location = character_location ^ encrypt_key

        

        // Use the encrypted location to specify the encrypted character within the string of legal characters

        encrypted_character = legal_characters.substring(encrypted_location, encrypted_location + 1)

        

        // Add the encrypted character to the string

        encrypted_string += encrypted_character 

        

    }

    return encrypted_string

}

function decrypt_cookie(encrypted_string) {

    var cookie_character

    var character_location

    var encrypted_location

    var encrypted_character

    var encrypt_key

    // Reset the keytext index

    keytext_index = 0

    

    // This variable holds the decrypted cookie value

    var cookie_value = ""

    

    // Run through each character in the encrypted string

    for (var counter = 0; counter < encrypted_string.length; counter++) {

    

        // Get the current encrypted character

        encrypted_character = encrypted_string.substring(counter, counter + 1)

        

        // Get the character's location in the string of legal characters

        encrypted_location = legal_characters.indexOf(encrypted_character)

        

        // XOR the character location with the generated encrypt_key

        encrypt_key = generate_key();

        character_location = encrypted_location ^ encrypt_key

        

        // Use the character location to specify the plain text character within the string of legal characters

        cookie_character = legal_characters.substring(character_location, character_location + 1)

        

        // Add the plain text character to the string

        cookie_value += cookie_character 

        

    }

    return cookie_value

}

//var keytext = prompt("Enter the keytext (no spaces):","password")

function generate_key() {

    // Get the current keytext character

    var keytext_character = keytext.substring(keytext_index, keytext_index + 1)

    

    // Increment the keytext_index and reset if necessary

    keytext_index++

    if (keytext_index == keytext.length) {

        keytext_index = 0

    }

        

    // Get the character's location in the string of legal characters

    keytext_location = legal_characters.indexOf(keytext_character)

    

    // Make sure the key is >= 2 and <= 31

    var encrypt_key = (keytext_location % 30) + 2

    

    return encrypt_key

 

}
