Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javascript form cookies - select only opening cookie for first 10 indexes

I have never used cookies before, so I am using a peice of code I am very unfamiliar with.

It was working all fine, until I noticed just now that for select boxes, it is not working for any values after the tenth index. (for index 10 and above).

I have looked at the cookie stored on my system, and it appears t be saving them correctly. (I saw select10) ETC stored properly.

When it runs onload of body however, it is not loading in the values properly.

Here is the cookie code I am using:

<SCRIPT LANGUAGE="JavaScript">

<!-- Begin

var expDays = 100;
var exp = new Date(); 

exp.setTime(exp.getTime() + (expDays*24*60*60*1000));

function getCookieVal (offset) {  
    var endstr = document.cookie.indexOf (";", offset);  
    if (endstr == -1) { endstr = document.cookie.length; }
    return unescape(document.cookie.substring(offset, endstr));
}



function GetCookie (name) {  
    var arg = name + "=";  
    var alen = arg.length;  
    var clen = document.cookie.length;  
    var i = 0;  

    while (i < clen) {    
        var j = i + alen;    
        if (document.cookie.substring(i, j) == arg) return getCookieVal (j);    
        i = document.cookie.indexOf(" ", i) + 1;    
        if (i == 0) break;   
    }  

    return null;
}



function SetCookie (name, value) {  
    var argv = SetCookie.arguments;  
    var argc = SetCookie.arguments.length;  
    var expires = (argc > 2) ? argv[2] : null;  
    var path = (argc > 3) ? argv[3] : null;  
    var domain = (argc > 4) ? argv[4] : null;  
    var secure = (argc > 5) ? argv[5] : false;  

    document.cookie = name + "=" + escape (value) + 
    ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
    ((path == null) ? "" : ("; path=" + path)) +  
    ((domain == null) ? "" : ("; domain=" + domain)) +    
    ((secure == true) ? "; secure" : "");
}

// use the following code to call it:
//  <body onLoad="cookieForms('open', 'form_1', 'form_2', 'form_n')" onUnLoad="cookieForms('save', 'form_1', 'form_2', 'form_n')">

function cookieForms() {  
    var mode = cookieForms.arguments[0];

    for(f=1; f<cookieForms.arguments.length; f++) {
        formName = cookieForms.arguments[f];

        if(mode == 'open') {    
            cookieValue = GetCookie('saved_'+formName);

            if(cookieValue != null) {
                var cookieArray = cookieValue.split('#cf#');

                if(cookieArray.length == document[formName].elements.length) {
                    for(i=0; i<document[formName].elements.length; i++) {
                        if(cookieArray[i].substring(0,6) == 'select') { document[formName].elements[i].options.selectedIndex = cookieArray[i].substring(7, cookieArray[i].length-1); }
                        else if((cookieArray[i] == 'cbtrue') || (cookieArray[i] == 'rbtrue')) { document[formName].elements[i].checked = true; }
                        else if((cookieArray[i] == 'cbfalse') || (cookieArray[i] == 'rbfalse')) { document[formName].elements[i].checked = false; }
                        else { document[formName].elements[i].value = (cookieArray[i]) ? cookieArray[i] : ''; }
                    }
                }
            }
        }

        if(mode == 'save') {    
            cookieValue = '';

            for(i=0; i<document[formName].elements.length; i++) {
                fieldType = document[formName].elements[i].type;

                if(fieldType == 'password') { passValue = ''; }
                else if(fieldType == 'checkbox') { passValue = 'cb'+document[formName].elements[i].checked; }
                else if(fieldType == 'radio') { passValue = 'rb'+document[formName].elements[i].checked; }
                else if(fieldType == 'select-one') { passValue = 'select'+document[formName].elements[i].options.selectedIndex; }
                else { passValue = document[formName].elements[i].value; }
                cookieValue = cookieValue + passValue + '#cf#';
            }
            cookieValue = cookieValue.substring(0, cookieValue.length-4); // Remove last delimiter
            SetCookie('saved_'+formName, cookieValue, exp);     
        }   
    }
}

//  End -->
</script>

I beleive the problem lies with the following line, found about 3/4 of the way down the code block above (line 68):

if(cookieArray[i].substring(0,6) == 'select') { document[formName].elements[i].options.selectedIndex = cookieArray[i].substring(7, cookieArray[i].length-1); }

Just for reference, here is the opening body tag I am using:

<body style="text-align:center;" onload="cookieForms('open', 'ramsform', 'decksform', 'hullsform', 'crewform', 'shipwrightform'); Swap(crew0z,'crew0i'); Swap(crew1z,'crew1i'); Swap(crew2z,'crew2i'); Swap(crew3z,'crew3i'); Swap(crew4z,'crew4i'); Swap(crew5z,'crew5i'); Swap(crew6z,'crew6i'); Swap(crew7z,'crew7i'); Swap(crew8z,'crew8i'); Swap(crew9z,'crew9i');" onunload="cookieForms('save', 'ramsform', 'decksform', 'hullsform', 'crewform', 'shipwrightform');">

(Please ignore the swap()'s as they are unrelated)

Page I am working on can be found: http://webhostlet.com/POP.htm

like image 964
pingu2k4 Avatar asked Nov 13 '22 14:11

pingu2k4


1 Answers

In both the open and save codes, change:

document[formName].elements[i].options.selectedIndex

to:

document[formName].elements[i].selectedIndex

options is an array of all the options, the selectedIndex property belongs to the select element that contains them.

Change:

cookieArray[i].substring(7, cookieArray[i].length-1)

to:

cookieArray[i].substring(6)

You were off by 1 because you forgot that it's 0-based counting. The second argument isn't needed, it defaults to the rest of the string.

The reason it worked for the first 10 menu items is a quirk of substring: if the second argument is lower than the first, it swaps them! So "select5".substring(7, 6) is treated as "select5".substring(6, 7), which gets the last character of the string. But for the longer strings, it was `"select35".substring(7, 7), which is an empty string.

like image 67
Barmar Avatar answered Nov 15 '22 06:11

Barmar