function getUserdata(key,subkey,subkey_val){
    
    if (! key){          
        bbcjs.trace("getUserdata: Error: no key passed, returning false",1);
        return false;
    }   
    
    bbcjs.trace("getUserdata: Key passed: " + key); 
            
    var fetched = script_output.primary_user.fetched;  
    
     //has user passed a subkey?
    if (subkey){
    
        bbcjs.trace("getUserdata: passed subkey = '" + subkey + "'",3);                   
        
        //create new regex to look for subkey followed by equals and optionally a comma
        var key_equals = new RegExp("(" + subkey + "=)[^,]*(,)?","g");
        
        //create new regex to look for subkey only followed by comma or end of string
         var key_only = new RegExp("(" + subkey + ")\\b(,|$)","g");          

   
        //does the key already hold this subkey with equals?
        if (fetched[key].match(key_equals)){      
        
            var key_equals_str = fetched[key].match(key_equals).toString();            
            
            bbcjs.trace("getUserdata: getUserdata: subkey found with equals: " + key_equals_str,3);
            
            var value = key_equals_str.split("=")[1];                       
            bbcjs.trace("getUserdata: returning value: '" + value + "'",3); 
            return value;                  
                                                 
        }else if(fetched[key].match(key_only)){
        
            var key_only_str = fetched[key].match(key_only).toString(); 
                     
            bbcjs.trace("getUserdata: subkey found on it's own = '" + key_only_str + "'",3);   
                
            var value = key_only_str;                       
            bbcjs.trace("getUserdata: returning value: '" + value + "'",3);   
            return value;
         }else{                    
            bbcjs.trace("getUserdata: subkey not found returning value: '" + value + "'",3);  
            return value;
         }
     }else{           
    bbcjs.trace("getUserdata: returning value: '" + fetched[key] + "'",3);   
    
    return fetched[key];
    }
   
}

function editUserdata(key,subkey,subkey_val,overwrite){
    
     if (! key){          
        bbcjs.trace("editUserdata: Error: no key passed, returning false",1);
        return false;
    }
    
    var fetched = script_output.primary_user.fetched;
    var update = false;
    var value = "";
    var match = false;  
    overwrite = overwrite ? overwrite : false; 

    
       
        
        //does key already exist?
        if (typeof fetched[key] != "undefined"){
            bbcjs.trace("editUserdata: key '" + key + "' holds this value: '" + fetched[key] + "'",3);
            
            if (isNaN(fetched[key])){
            
                //has user passed a subkey?
                if (subkey){
                
                    bbcjs.trace("editUserdata: passed subkey = '" + subkey + "'",3);                   
                    
                    //create new regex to look for subkey followed by equals and optionally a comma
                    var key_equals = new RegExp("(" + subkey + "=)[^,]*(,)?","g");               
               
                    //does the key already hold this subkey with equals?
                    if (fetched[key].match(key_equals)){                  
                        
                        bbcjs.trace("editUserdata: subkey found with equals: " + fetched[key].match(key_equals),3);
                        
                        if (subkey_val){
                            bbcjs.trace("editUserdata: passed subkey value = '" + subkey_val + "'",3);  
                            //update value for subkey                     
                            var value = fetched[key].replace(key_equals,"$1" + subkey_val + "$2");                       
                            update = true;
                            match = true;
                        }else{
                            bbcjs.trace("editUserdata: no passed subkey value, do nothing",3);                        
                        }                                           
                    }
                    
                    //create new regex to look for subkey only followed by comma or end of string
                    var key_only = new RegExp("(" + subkey + ")\\b(,|$)","g");
                    
                    //does the key already hold this subkey on it's own
                    if (fetched[key].match(key_only)){                         
                        
                        bbcjs.trace("editUserdata: subkey already exists on it's own: '" + fetched[key].match(key_only) + "' no need to add",3);                        
                            match = true;                           
                     }  
                                                       
                   
                    
                    //if the subkey does not already exist
                    if (match == false){
                        bbcjs.trace("editUserdata: subkey '" + subkey + "' not exist within key",3);
                        if (subkey_val){
                            bbcjs.trace("editUserdata: passed subkey value = '" + subkey_val + "'",3);
                            //update key with new subkey/value pair
                             if (overwrite == "true" || overwrite == true){
                                bbcjs.trace("editUserdata: overwite whole key: " + key);
                                value = subkey + "=" + subkey_val                               
                            }else{
                                value = addValue(subkey + "=" + subkey_val);                                                          
                            }                                           
                        }else{
                            bbcjs.trace("editUserdata: no passed subkey value, just add key on it's own",3); 
                            if (overwrite == "true" || overwrite == true){
                                bbcjs.trace("editUserdata: overwite whole key: " + key);
                                value = subkey;                               
                            }else{
                                value = addValue(subkey);                                                          
                            }                                       
                        }
                    update = true;         
                    }
                //if no subkey   
                }else{                    
                      bbcjs.trace("editUserdata: no subkey val, do nothing",3);                    
                }
            //if subkey is number
            }else{
                    bbcjs.trace("editUserdata: key holds number value, just update number if passed as subkey",3);
                    if (subkey){
                        value = subkey;
                        update = true;
                    }else{
                    bbcjs.trace("editUserdata: no passed subkey, do nothing",3);
                    }
            }
        //if key doesn't exist already
        }else{
            bbcjs.trace("editUserdata: key: '" + key + "' does not already exist, will add this key and any (optional) name/values passed in",3);             
            if (subkey){
                bbcjs.trace("editUserdata: subkey passed: " + subkey,3);
                value = subkey;
                 if (subkey_val){
                 bbcjs.trace("editUserdata: subkey val passed: " + subkey_val,3);
                 value = value + "=" + subkey_val;
                 }
            }
        //if nothing just add new key
        update = true;
        }
        
        function addValue(sk){       
            if (fetched[key] != ""){
                bbcjs.trace("editUserdata: adding comma",3);
                sk = fetched[key] + "," + sk;            
            }          
        return sk;
        }
    
    if (update){      
    //call to userdata
    var url = '<script language="JavaScript" src="/apps/ifl/languages/french/userdata?Mode=store&'  + key + '=' + value + '&OutputFormat=Javascript"></'+'script>';        
    bbcjs.trace("editUserdata: updating with this url: " + url.replace("<","&lt;") ,3);
    document.write(url);            
    }
            
    return false;
    
}
   