// Strip excess (any leading or trailing and multiple internal) blanks
function strip(STR)
{   var str,pack,part,n

    str=String(STR)
    pack=''
    part=''
    n=0
    while (true)
    {
        ++n
        part=nthword(str,n)
        if (part=='') {break}
        if (pack=='')
           {pack=part}
        else
           {pack=pack+' '+part}
    }
    return pack
}

// Replace all occurances of a substring with another substring
function replace(STR,zap,fix)
{   var i,j,str
    str=STR
    j=zap.length
    while ((i=str.indexOf(zap))>none)
        {str=str.substring(0,i)+fix+str.substring(i+j)}
    return str
}


// Retain only the legal characters
function RetainOnly(STR,LEGAL)
{   var str,legal,i

    str=String(STR)
    legal=String(LEGAL)
    for (i=0;(i<str.length);++i)
    {
        if (legal.indexOf(str.substring(i,i+1))<0)
        {
            str=str.substring(0,i)+' '+str.substring(i+1)
        }
    }
    return strip(str)
}

// Extract the nth word from a string or return a null string.
function nthword(STR,N)
{   var n,str,l,i,j,k

    n=Number(N)
    if (n<1) {return ''}
    str=String(STR)
    l=str.length
    str=str+' # # '
    i=k=0
    j=none
    while ((j<l) && (n>0))
    {
        --n
        k=j+1
        while (k<l)
        {
            if (str.substring(k,k+1)!=' ') {break}
            ++k
        }
        if (k>=l) {return ''}
        j=str.indexOf(' ',k)
     }
     if (n>0) return ''
     return String(str.substring(k,j))
}

// Return the last word in STR
function lastword(STR)
{    var past,next,n

     past=nthword(STR,1)
     next=nthword(STR,2)
     n=2
     while (next!='')
     {
         ++n
         past=next
         next=nthword(STR,n)
     }
     return past
}
