TOXDropBox

//:TOX: DropBox
//Script Name: :TOX: Dropbox.lsl
//By: Dimentox Travanti
//
// This is a Drop box which allows people to drop in items it can have a required prefix on the items
// And has the abilility to hand out a template / instructions 
// Also you can set the color and if it notifies you.
//
//CONFIG //
string templatename=""; // give a template? leave blank for no
integer allowed = INVENTORY_NOTECARD; /// the type of item allowed
string rname = "dcs"; //name to be allowed it will check for the item must be named this to start
string inst ="INSTRUCTIONS HERE"; // instructions that are given. blank for no instructions
integer showhover = 1; //Show hover text
string title = ""; //leave blank to display the objects name;
vector color = <1,1,1>; //hover color 
float alpha = 1.0; // the brightness of the hover 1.0 is full 0.0 is not visable
integer showtotal = 0; //1 for yes 0 for no
integer protect = 1; //Protect against other scripts runing when droped in? 
integer notify = 0; // Notify of new additions.
///////////////NOTHING UNDER HERE SHOULD NEED TO BE CHANGED!///////////
//Needed vars//
list items;
integer ctotal=0;
list ids;
list types = [INVENTORY_TEXTURE, INVENTORY_SOUND, INVENTORY_LANDMARK,
 INVENTORY_CLOTHING, INVENTORY_OBJECT, INVENTORY_SCRIPT,INVENTORY_NOTECARD,
 INVENTORY_BODYPART, INVENTORY_ANIMATION, INVENTORY_GESTURE];
//functions
set()
{
 if (showhover == 1)
 {
 string temp = title + "\n";
 if (templatename != "")
 {
 temp += "Touch for Template\n";
 } 
 if (inst != "")
 {
 temp += "Touch for Instructions\n"; 
 }
 if (showtotal == 1)
 {
 temp +="Total: "+(string)ctotal;
 }
 llSetText(temp, color, alpha); 
 } 
}
string genslurl()
{
 string sim = llEscapeURL(llGetRegionName());
 vector pos = llGetPos();
 integer x = (integer)pos.x;
 integer y = (integer)pos.y;
 integer z = (integer)pos.z;
 
 return "http:///slurl.com/secondlife/"+sim+"/"+(string)x+"/"+(string)y+"/"+(string)z+"/";
 
}
sprotect()
{
 integer num = llGetInventoryNumber(INVENTORY_SCRIPT);
 integer x;
 for (x = 0; x< num; x++)
 {
 string name = llGetInventoryName(INVENTORY_SCRIPT, x);
 if (name != llGetScriptName())
 {
 llSetScriptState(name, FALSE);
 } 
 }
}
integer remove()
{
 //textures
 integer removed = 0;
 integer tcount = llGetListLength(types);
 integer x = 0;
 while (x < tcount)
 {
 integer type = llList2Integer(types, x);
 // llOwnerSay((string)type);
 if (type != allowed) // make sure its not an allowed thing.
 {
 integer num = llGetInventoryNumber(type);
 integer z = 0;
 while (z < num)
 {
 string name = llGetInventoryName(type, z);
 // llOwnerSay(name);
 if (name == llGetScriptName() || name == templatename)
 {
 //do nothing
 } else {
 
 
 llSay(0, "I am sorry this type of item is not allowed to be given in this box. \n"+inst);
 llRemoveInventory(llGetInventoryName(type, z));
 removed = 1;
 }
 z++;
 }
 
 }
 x++;
 }
 return removed;
}
default
{
 state_entry()
 {
 llSay(0, genslurl());
 sprotect();
 if (title == "")
 {
 title = llGetObjectName(); 
 }
 integer tot = llGetInventoryNumber(allowed);
 ctotal = llGetInventoryNumber(allowed);
 integer i = 0;
 for(i;i < tot;++i)
 {
 string name = llGetInventoryName(allowed,i);
 key id = llGetInventoryKey(name);
 integer index = llListFindList((list)name,items);
 if(index = -1 )
 {
 items += name;
 ids += id;
 llOwnerSay("Added named: " + name);
 }
 }
 set();
 }
 touch_start(integer total_number)
 {
 if (templatename != "")
 {
 llGiveInventory(llDetectedKey(0), templatename);
 }
 if (inst != "")
 {
 llSay(0, inst);
 }
 }
 changed(integer change)
 {
 if(change & CHANGED_INVENTORY)
 {
 sprotect();
 llSay(0, "Please Wait Proccessing your submission");
 if (llGetInventoryNumber(allowed) != ctotal)
 {
 integer tot = llGetInventoryNumber(allowed);
 integer i = 0;
 for(i;i < tot;++i)
 {
 string name = llGetInventoryName(allowed,i);
 
 key id = llGetInventoryKey(name);
 integer index = llListFindList(items,(list)name);
 if(index == -1)
 {
 if (name != templatename || name != llGetScriptName())
 {
 integer rlen = llStringLength(rname) - 1;
 if (llToLower(llGetSubString(name, 0, rlen)) != llToLower(rname))
 {
 llSay(0, "This item is not named properly and will be removed\n" + inst);
 llRemoveInventory(name);
 } else {
 items += name;
 ids += id;
 llSay(0, "Thanks for the submission of " + name);
 if (notify == 1)
 {
 
 string msg = "You have a new item named " + name + " waiting for you!\nLocation: "+ genslurl();
 llInstantMessage(llGetOwner(), msg); 
 }
 }
 }
 }
 }
 }else {
 remove();
 }
 set();
 }
 }
}