vector minROT = <0,  1.9, 180>;
vector midROT = <0, 10.9, 180>;
vector maxROT = <0, 20.9, 180>;
integer isOpen;


default {
    state_entry() {
        llSetTimerEvent(0.2);
        llSetLocalRot(llEuler2Rot(minROT * DEG_TO_RAD));
        llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
        llListen(667, "", NULL_KEY, "");
    }
    
    timer() {
        if(isOpen == TRUE) {
            llSetLocalRot(llEuler2Rot(minROT * DEG_TO_RAD));
            isOpen = FALSE;
            return;
        }
        
        integer info = llGetAgentInfo(llGetOwner());
        if(info & AGENT_TYPING) {
            //llStopAnimation("type");
            vector rot = minROT;
            rot.y = llFrand(maxROT.y - midROT.y) + midROT.y;
            llSetLocalRot(llEuler2Rot(rot * DEG_TO_RAD));
            isOpen = TRUE;
        }
    }
    
    listen(integer chan, string name, key id, string message) {
        if(llGetOwnerKey(id) != llGetOwner()) return;
        if(message == " " || message == "Cancel") return;
        
        if (message == "OPEN") {
            llSetLocalRot(llEuler2Rot(maxROT * DEG_TO_RAD));
        } else if (message == "HALF OPEN") {
            llSetLocalRot(llEuler2Rot(midROT * DEG_TO_RAD));
        } else if (message == "CLOSE") {
            llSetLocalRot(llEuler2Rot(minROT * DEG_TO_RAD));
        }
    }
}

