questionnaire.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
///////////////////////////////////////////////////////////////////////////
//                            CONFIGURATION                              //
///////////////////////////////////////////////////////////////////////////
 
 
// Set this to the domain name or the IP address where 
// the questionnaire.php script  is to be found.
string DOMAIN_OR_IP = "127.0.0.1";
 
///////////////////////////////////////////////////////////////////////////
//                              INTERNALS                                //
///////////////////////////////////////////////////////////////////////////
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
string wasKeyValueGet(string var, string kvp) {
    list dVars = llParseString2List(kvp, ["&"], []);
    do {
        list data = llParseString2List(llList2String(dVars, 0), ["="], []);
        string k = llList2String(data, 0);
        if(k != var) jump continue;
        return llList2String(data, 1);
@continue;
        dVars = llDeleteSubList(dVars, 0, 0);
    } while(llGetListLength(dVars));
    return "";
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
string wasKeyValueSet(string var, string val, string kvp) {
    list dVars = llParseString2List(kvp, ["&"], []);
    if(llGetListLength(dVars) == 0) return var + "=" + val;
    list result = [];
    do {
        list data = llParseString2List(llList2String(dVars, 0), ["="], []);
        string k = llList2String(data, 0);
        if(k == "") jump continue;
        if(k == var && val == "") jump continue;
        if(k == var) {
            result += k + "=" + val;
            val = "";
            jump continue;
        }
        string v = llList2String(data, 1);
        if(v == "") jump continue;
        result += k + "=" + v;
@continue;
        dVars = llDeleteSubList(dVars, 0, 0);
    } while(llGetListLength(dVars));
    if(val != "") result += var + "=" + val;
    return llDumpList2String(result, "&");
}
 
string question = "";
 
default
{
    state_entry() {
        llListen(0, "", "", "");
    }
    touch_start(integer num) {
        integer line = (integer)wasKeyValueGet("line", llGetObjectDesc());
        if(line+1 > osGetNumberOfNotecardLines("Questions")-1) line = 0;
        question = osGetNotecardLine("Questions", line++);
        llSetObjectDesc(wasKeyValueSet("line", (string)line, llGetObjectDesc()));
        llSay(0, question);
    }  
    listen(integer channel, string name, key id, string message) {
        llHTTPRequest("http://" + DOMAIN_OR_IP + "/questionnaire.php?q=" + llEscapeURL(question) + "&v=" + llEscapeURL(name) + "&a=" + llEscapeURL(message), [], "");
    }
    on_rez(integer num) {
        llResetScript();
    }
}