// session management using cookies

function vvvFindValueForKey(databaseLine, key) 
{
     key += '='
     lastTokenIndex = -1;
     tokenIndex = databaseLine.indexOf("|", 0);
     while (tokenIndex >= 0)
     {
         token = databaseLine.substring(lastTokenIndex+1, tokenIndex);
         if (token && token.indexOf(key) == 0)
         {
             return token.substring(key.length, tokenIndex);
         }
         lastTokenIndex = tokenIndex;
         tokenIndex = databaseLine.indexOf("|", lastTokenIndex+1);
     };
}

function vvvGetValueForKey(key) 
{
    var databaseLine = vvvGetUserDetailsCookie();
    return vvvFindValueForKey(databaseLine,key);
}

function vvvUpdateValueForKey(databaseLine, key, value) 
{
    key += '='
    updatedLine = '';
    lastTokenIndex = 0;
    tokenIndex = databaseLine.indexOf("|", lastTokenIndex);
    found = false;
    while (lastTokenIndex < databaseLine.length)
    {
         if (tokenIndex < 0)
         {
            // do the last remaining token
             tokenIndex = databaseLine.length;
         }
         token = databaseLine.substring(lastTokenIndex, tokenIndex);
         //alert(token);
         if (token && token.indexOf(key) == 1)
         {
            updatedLine += '|';
            updatedLine += key;
            updatedLine += value;
            found = true;
            //alert("Found existing - replaced");
         }
         else
         {
            updatedLine += token;
         }
         lastTokenIndex = tokenIndex;
         if (lastTokenIndex < databaseLine.length) tokenIndex = databaseLine.indexOf("|", lastTokenIndex+1);
    };
     if (!found)
     {
            updatedLine += key;
            updatedLine += value;
            updatedLine += '|';
     }         
    
    return updatedLine;
}

function vvvPutValueForKey(key, value) 
{
    vvvUpdateValueForKey(vvvGetUserDetailsCookie(),key,value);
}



function vvvStoreForm(thisForm)
{
    databaseLine = vvvGetUserDetailsCookie();
    for (i=0; i<thisForm.length; i++)
    {
        element = thisForm.elements[i];
        if (element.type == "hidden")
        {
            //alert("element " + element.name + " is not editable so not stored");
        }
        else
        {
            databaseLine = vvvStoreFormElement(databaseLine, element);
        }
    }
    //alert(databaseLine);
    vvvSaveUserDetailsCookie(databaseLine);
}



function vvvStoreFormElement(databaseLine, element)
{
    if (element != null)
    {
        if ((element.type == "text" || element.type == "textarea") && element.value != null && element.value.length > 0)
        {
            databaseLine = vvvUpdateValueForKey(databaseLine,element.name,element.value);
        }
        else if (element.type == "select-one" && element.selectedIndex != null)
        {
            databaseLine = vvvUpdateValueForKey(databaseLine,element.name,element.selectedIndex);
            databaseLine = vvvUpdateValueForKey(databaseLine,element.name + "value",element.options[element.selectedIndex].value);
        }
    }
    return databaseLine;
}


function vvvRestoreForm(thisForm)
{
    databaseLine = vvvGetUserDetailsCookie();
    for (i=0; i<thisForm.length; i++)
    {
        element = thisForm.elements[i];
        //alert("element.type=" + element.type + ", element.name=" + element.name + ", element.value=" + element.value );
        vvvRestoreFormElement(databaseLine, element);
    }
}



function vvvClearForm(thisForm)
{
    databaseLine = vvvGetUserDetailsCookie();
    for (i=0; i<thisForm.length; i++)
    {
        element = thisForm.elements[i];
        databaseLine = vvvUpdateValueForKey(databaseLine, element.name, ""); 
    }
    vvvSaveUserDetailsCookie(databaseLine);    
}


function vvvRestoreFormElement(databaseLine, element)
{
    if (element != null)
    {
        if ((element.type == "text" || element.type == "textarea") && (element.value == null || element.value.length == 0))
        {
            newValue = vvvFindValueForKey(databaseLine, element.name);
            if (newValue != null)
            {
                element.value = vvvFindValueForKey(databaseLine, element.name);
                //alert("newValue for " + element.name + " is " + element.value);
            }
        }
        else if (element.type == "select-one")
        {
            newValue = vvvFindValueForKey(databaseLine, element.name);
            if (newValue != null)
            {
                element.selectedIndex = newValue;
            }
        }
    }
}



function vvvGetUserDetailsCookie()
{
   databaseLine = GetCookie("VvvUserDetails");
   if (databaseLine == null || databaseLine.length == 0) databaseLine = '|';
   return databaseLine;
}

function vvvSaveUserDetailsCookie(databaseLine)
{
    DeleteCookie("VvvUserDetails", "/");
    SetCookie("VvvUserDetails", databaseLine, null, "/");
}


function vvvDisplayHiddenField(key,value)
{
   strOutput = "<input type=\"hidden\" name=\"" + key + "\" value=\"" + value + "\"/>\n";
   //strOutput = "" + key + "=" + value + "<br/>";
   document.write(strOutput);
   document.close();
}

/* Dumps all the stored variables into the form as hidden fields so they will be sent to the server, but only the fields that are not already in the form */
function vvvDumpHiddenFields(thisForm)
{
    databaseLine = vvvGetUserDetailsCookie();   
    lastTokenIndex = 0;
    tokenIndex = databaseLine.indexOf("|", lastTokenIndex);
    while (lastTokenIndex < databaseLine.length)
    {
         if (tokenIndex < 0)
         {
             // do the last remaining token
             tokenIndex = databaseLine.length;
         }
         token = databaseLine.substring(lastTokenIndex, tokenIndex);
         
         equalsIndex = token.indexOf("=", 0);
         if (equalsIndex > 0)
         {
             key = token.substring(1, equalsIndex);
             value = token.substring(equalsIndex + 1, token.length);
             if (!vvvFormContainsElementAlready(thisForm,key))
             {
                vvvDisplayHiddenField(key,value);
             }
         }         
         lastTokenIndex = tokenIndex;
         if (lastTokenIndex < databaseLine.length) tokenIndex = databaseLine.indexOf("|", lastTokenIndex+1);
    };
}


/* Return true if the form already has a field with that name */
function vvvFormContainsElementAlready(thisForm,elementName)
{
    for (i=0; i<thisForm.length; i++)
    {
        element = thisForm.elements[i];
        if (element.name == elementName)
        {
            return true;
        }
    }
    return false;
}


