by Jessica Margetts

// Here is a menu based texture changing script, that has no limits on the number of pages textures it can support.

// PLEASE remember that textures MUST HAVE full permissions in order to be used with it.

integer         INVENTORY_TYPE  = INVENTORY_TEXTURE;
integer         PAGES;
integer         PAGE            = 1;
integer         COM_CHAN        = -278976;
integer         LISTENER;
integer         NEEDED_PERMS;

list            THIS_PAGE;
list            LIST_NAV_X      = ;
list            LIST_NAV_A      = ;
list            LIST_NAV_B      = ;
list            LIST_NAV_C      = ;

string          PAGE_NAV_NULL   = "    ";
string          PAGE_NAV_NEXT   = "NEXT";
string          PAGE_NAV_BACK   = "BACK";
string          PAGE_NAV_HOME   = "HOME";

integer ptTestPerms(string item, integer needed)
{
    integer perm = llGetInventoryPermMask(item, MASK_OWNER);
    if ((perm & needed) == needed) { return(TRUE); }
    return(FALSE);
}

ptDisplayPage(key theUser) {
    integer     TEXTURES    = llGetInventoryNumber(INVENTORY_TYPE);
    integer     I;
    integer     START;
    integer     STOP;
    string      INTRO       = "Page " + (string) PAGE + " of " + (string) PAGES;
    string      NEW_LINE;
    string      ITEM_NAME;
    string      T;
    list        MENU;
    
    
    if (TEXTURES >= 1) {
        PAGES       = 1 + (llFloor((float) TEXTURES / 9.0));
        INTRO       = "Page " + (string) PAGE + " of " + (string) PAGES;
        if (TEXTURES <= 9) {
            MENU = [] + LIST_NAV_X;
            for (I = 0; I < TEXTURES; ++I)
            {
                T           = (string) (I + 1);
                ITEM_NAME   = llGetInventoryName(INVENTORY_TYPE, I);
                if (ptTestPerms(ITEM_NAME, NEEDED_PERMS)) {                
                    NEW_LINE    = "\n" + T + "- " + ITEM_NAME;
                    INTRO       = "" + INTRO + NEW_LINE;
                    MENU        = [] + MENU + ;
                } else {
                    NEW_LINE    = "\n" + T + "- ~BLOCKED ~";
                    INTRO       = "" + INTRO + NEW_LINE;
                    MENU        = [] + MENU + ;
                }
            }
        } else {
            if ((PAGE == 1) || (PAGE > PAGES)) {
                PAGE = 1;
                MENU = [] + LIST_NAV_A;
            } else if ((PAGE == PAGES) || (PAGE < 1)) {
                MENU = [] + LIST_NAV_C;
            } else {
                MENU = [] + LIST_NAV_B;
            }
            START       = ((PAGE - 1) * 9);
            STOP        = (PAGE * 9);
            if (STOP > TEXTURES) { STOP = TEXTURES - 1; }
            INTRO       = "Page " + (string) PAGE + " of " + (string) PAGES;
            
            for (I = START; I < STOP; ++I)
            {
                T           = (string) (I + 1);
                ITEM_NAME   = llGetInventoryName(INVENTORY_TYPE, I);
                NEW_LINE    = "\n" + T + "- " + ITEM_NAME;
                INTRO       = "" + INTRO + NEW_LINE;
                MENU        = [] + MENU + ;
            }
        }   
        llDialog(theUser, INTRO, MENU, COM_CHAN);
    }
}

default
{
    state_entry()
    {
        NEEDED_PERMS    = PERM_COPY | PERM_MODIFY | PERM_TRANSFER;
        //LISTENER    = llListen(COM_CHAN, "", llGetOwner(), "");
        LISTENER    = llListen(COM_CHAN, "", NULL_KEY, "");
    }
    
    on_rez(integer param) { llResetScript(); }
    
    touch_start(integer total)
    {
        key     agent   = llDetectedKey(0);
        PAGE            = 1;
        //if (agent == llGetOwner()) {
            ptDisplayPage(agent);
        //}
    }
    
    listen(integer channel, string name, key agent, string message) {
        integer TEXTURE_CHOICE = (integer) message;
        if (!TEXTURE_CHOICE) {
            if (message == PAGE_NAV_NEXT) { ++PAGE; }
            if (message == PAGE_NAV_BACK) { --PAGE; }
            if (message == PAGE_NAV_HOME) { PAGE=1; }
            ptDisplayPage(agent);
        } else {
            key         DOITNOW;
            integer     CHOICE  = TEXTURE_CHOICE - 1;
            string      SHOWIT  = llGetInventoryName(INVENTORY_TYPE, CHOICE);
            if (ptTestPerms(SHOWIT, NEEDED_PERMS)) {
                DOITNOW     = llGetInventoryKey(SHOWIT);
            } else {
                DOITNOW     = "3651326d-9398-a600-7fe0-10db365896b9";
            }
            
            llSetLinkTexture(LINK_SET, DOITNOW, ALL_SIDES);
            ptDisplayPage(agent);
        }
    }
}