Commits

roxie_linden  committed db3e5d3 Merge

automated merge

  • Participants
  • Parent commits 5f11d3b, 92814d0

Comments (0)

Files changed (32)

File indra/llcommon/roles_constants.h

 //
 
 // KNOWN HOLES: use these for any single bit powers you need
-// bit 0x1 << 41
 // bit 0x1 << 46
 // bit 0x1 << 49 and above
 
 const U64 GP_LAND_ALLOW_CREATE	= 0x1 << 25;	// Bypass Create/Edit Objects Restriction
 const U64 GP_LAND_ALLOW_LANDMARK	= 0x1 << 26;	// Bypass Landmark Restriction
 const U64 GP_LAND_ALLOW_SET_HOME	= 0x1 << 28;	// Bypass Set Home Point Restriction
+const U64 GP_LAND_ALLOW_HOLD_EVENT	= 0x1LL << 41;	// Allowed to hold events on group-owned land
+
 
 // Parcel Access
 const U64 GP_LAND_MANAGE_ALLOWED	= 0x1 << 29;	// Manage Allowed List

File indra/newview/CMakeLists.txt

     lldriverparam.cpp
     lldynamictexture.cpp
     llemote.cpp
-    lleventinfo.cpp
     lleventnotifier.cpp
     lleventpoll.cpp
     llexpandabletextbox.cpp
     lldriverparam.h
     lldynamictexture.h
     llemote.h
-    lleventinfo.h
     lleventnotifier.h
     lleventpoll.h
     llexpandabletextbox.h

File indra/newview/app_settings/settings.xml

       <key>Value</key>
       <integer>175</integer>
     </map>
+    <key>EventURL</key>
+    <map>
+      <key>Comment</key>
+      <string>URL for Event website, displayed in the event floater</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>http://search.secondlife.com/viewer/embed/event/</string>
+    </map>
     <key>EveryoneCopy</key>
       <map>
         <key>Comment</key>

File indra/newview/lleventinfo.cpp

-/** 
- * @file lleventinfo.cpp
- * @brief LLEventInfo class implementation
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "lleventinfo.h"
-
-#include "lluuid.h"
-#include "message.h"
-
-LLEventInfo::cat_map LLEventInfo::sCategories;
-
-void LLEventInfo::unpack(LLMessageSystem *msg)
-{
-	U32 event_id;
-	msg->getU32("EventData", "EventID", event_id);
-	mID = event_id;
-
-	msg->getString("EventData", "Name", mName);
-
-	msg->getString("EventData", "Category", mCategoryStr);
-
-	msg->getString("EventData", "Date", mTimeStr);
-
-	U32 duration;
-	msg->getU32("EventData","Duration",duration);
-	mDuration = duration;
-
-	U32 date;
-	msg->getU32("EventData", "DateUTC", date);
-	mUnixTime = date;
-
-	msg->getString("EventData", "Desc", mDesc);
-
-	std::string buffer;
-	msg->getString("EventData", "Creator", buffer);
-	mRunByID = LLUUID(buffer);
-
-	U32 foo;
-	msg->getU32("EventData", "Cover", foo);
-
-	mHasCover = foo ? TRUE : FALSE;
-	if (mHasCover)
-	{
-		U32 cover;
-		msg->getU32("EventData", "Amount", cover);
-		mCover = cover;
-	}
-
-	msg->getString("EventData", "SimName", mSimName);
-
-	msg->getVector3d("EventData", "GlobalPos", mPosGlobal);
-
-	// Mature content
-	U32 event_flags;
-	msg->getU32("EventData", "EventFlags", event_flags);
-	mEventFlags = event_flags;
-}
-
-// static
-void LLEventInfo::loadCategories(const LLSD& options)
-{
-	for(LLSD::array_const_iterator resp_it = options.beginArray(),
-		end = options.endArray(); resp_it != end; ++resp_it)
-	{
-		LLSD name = (*resp_it)["category_name"];
-		if(name.isDefined())
-		{
-			LLSD id = (*resp_it)["category_id"];
-			if(id.isDefined())
-			{
-				LLEventInfo::sCategories[id.asInteger()] = name.asString();
-			}
-		}
-	}
-}

File indra/newview/lleventinfo.h

-/** 
- * @file lleventinfo.h
- * @brief LLEventInfo class definition
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLEVENTINFO_H
-#define LL_LLEVENTINFO_H
-
-#include <map>
-
-#include "v3dmath.h"
-#include "lluuid.h"
-
-class LLMessageSystem;
-
-class LLEventInfo
-{
-public:
-        LLEventInfo() :
-	mID(0),
-	mDuration(0),
-	mUnixTime(0),
-	mHasCover(FALSE),
-	mCover(0),
-	mEventFlags(0),
-	mSelected(FALSE)
-	{}
-
-	void unpack(LLMessageSystem *msg);
-
-	static void loadCategories(const LLSD& options);
-
-public:
-	std::string mName;
-	U32			mID;
-	std::string mDesc;
-	std::string mCategoryStr;
-	U32			mDuration;
-	std::string	mTimeStr;
-	LLUUID		mRunByID;
-	std::string	mSimName;
-	LLVector3d	mPosGlobal;
-	time_t		mUnixTime; // seconds from 1970
-	BOOL		mHasCover;
-	U32			mCover;
-	U32			mEventFlags;
-	BOOL		mSelected;
-
-	typedef std::map<U32, std::string> cat_map;
-	static	cat_map sCategories;
-};
-
-#endif // LL_LLEVENTINFO_H

File indra/newview/lleventnotifier.cpp

 #include "llnotificationsutil.h"
 #include "message.h"
 
-#include "lleventinfo.h"
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
+#include "llfloaterevent.h"
 #include "llagent.h"
+#include "llcommandhandler.h"	// secondlife:///app/... support
+
+class LLEventHandler : public LLCommandHandler
+{
+public:
+	// requires trusted browser to trigger
+	LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { }
+	bool handle(const LLSD& params, const LLSD& query_map,
+				LLMediaCtrl* web)
+	{
+		if (params.size() < 2)
+		{
+			return false;
+		}
+		std::string event_command = params[1].asString();
+		S32 event_id = params[0].asInteger();
+		if(event_command == "details")
+		{
+			LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+			if (floater)
+			{
+				floater->setEventID(event_id);
+				LLFloaterReg::showTypedInstance<LLFloaterEvent>("event");
+				return true;
+			}
+		}
+		else if(event_command == "notify")
+		{
+			// we're adding or removing a notification, so grab the date, name and notification bool
+			if (params.size() < 3)
+			{
+				return false;
+			}			
+			if(params[2].asString() == "enable")
+			{
+				gEventNotifier.add(event_id);
+				// tell the server to modify the database as this was a slurl event notification command
+				gEventNotifier.serverPushRequest(event_id, true);
+			
+			}
+			else
+			{
+				gEventNotifier.remove(event_id);
+			}
+			return true;
+		}
+
+		
+		return false;
+	}
+};
+LLEventHandler gEventHandler;
+
 
 LLEventNotifier gEventNotifier;
 
 		// Check our notifications again and send out updates
 		// if they happen.
 
-		time_t alert_time = time_corrected() + 5 * 60;
+		F64 alert_time = LLDate::now().secondsSinceEpoch() + 5 * 60;
 		en_map::iterator iter;
 		for (iter = mEventNotifications.begin();
 			 iter != mEventNotifications.end();)
 		{
 			LLEventNotification *np = iter->second;
 
-			if (np->getEventDate() < (alert_time))
+			iter++;
+			if (np->getEventDateEpoch() < alert_time)
 			{
 				LLSD args;
 				args["NAME"] = np->getEventName();
+				
 				args["DATE"] = np->getEventDateStr();
 				LLNotificationsUtil::add("EventNotification", args, LLSD(),
-					boost::bind(&LLEventNotification::handleResponse, np, _1, _2));
-				mEventNotifications.erase(iter++);
-			}
-			else
-			{
-				iter++;
+					boost::bind(&LLEventNotifier::handleResponse, this, np->getEventID(), _1, _2));
+				remove(np->getEventID());
+				
 			}
 		}
 		mNotificationTimer.reset();
 	}
 }
 
+
+
+bool LLEventNotifier::handleResponse(U32 eventId, const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	switch (option)
+	{
+		case 0:
+		{
+			LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+			if (floater)
+			{
+				floater->setEventID(eventId);
+				LLFloaterReg::showTypedInstance<LLFloaterEvent>("event");
+			}
+			break;
+		}
+		case 1:
+			break;
+	}
+	return true;
+}
+
+bool LLEventNotifier::add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName)
+{
+	LLEventNotification *new_enp = new LLEventNotification(eventId, eventEpoch, eventDateStr, eventName);
+	
+	llinfos << "Add event " << eventName << " id " << eventId << " date " << eventDateStr << llendl;
+	if(!new_enp->isValid())
+	{
+		delete new_enp;
+		return false;
+	}
+	
+	mEventNotifications[new_enp->getEventID()] = new_enp;
+	return true;
+	
+}
+
+void LLEventNotifier::add(U32 eventId)
+{
+	
+	gMessageSystem->newMessageFast(_PREHASH_EventInfoRequest);
+	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+	gMessageSystem->nextBlockFast(_PREHASH_EventData);
+	gMessageSystem->addU32Fast(_PREHASH_EventID, eventId);
+	gAgent.sendReliableMessage();
+
+}
+
+//static 
+void LLEventNotifier::processEventInfoReply(LLMessageSystem *msg, void **)
+{
+	// extract the agent id
+	LLUUID agent_id;
+	U32 event_id;
+	std::string event_name;
+	std::string eventd_date;
+	U32 event_time_utc;
+	
+	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
+	msg->getU32("EventData", "EventID", event_id);
+	msg->getString("EventData", "Name", event_name);
+	msg->getString("EventData", "Date", eventd_date);
+	msg->getU32("EventData", "DateUTC", event_time_utc);
+	
+	gEventNotifier.add(event_id, (F64)event_time_utc, eventd_date, event_name);
+}	
+	
+	
 void LLEventNotifier::load(const LLSD& event_options)
 {
 	for(LLSD::array_const_iterator resp_it = event_options.beginArray(),
 	{
 		LLSD response = *resp_it;
 
-		LLEventNotification *new_enp = new LLEventNotification();
-
-		if(!new_enp->load(response))
-		{
-			delete new_enp;
-			continue;
-		}
-		
-		mEventNotifications[new_enp->getEventID()] = new_enp;
+		add(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString());
 	}
 }
 
 	return FALSE;
 }
 
-
-void LLEventNotifier::add(LLEventInfo &event_info)
-{
-	// We need to tell the simulator that we want to pay attention to
-	// this event, as well as add it to our list.
-
-	if (mEventNotifications.find(event_info.mID) != mEventNotifications.end())
-	{
-		// We already have a notification for this event, don't bother.
-		return;
-	}
-
-	// Push up a message to tell the server we have this notification.
-	gMessageSystem->newMessage("EventNotificationAddRequest");
-	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	gMessageSystem->nextBlock("EventData");
-	gMessageSystem->addU32("EventID", event_info.mID);
-	gAgent.sendReliableMessage();
-
-	LLEventNotification *enp = new LLEventNotification;
-	enp->load(event_info);
-	mEventNotifications[event_info.mID] = enp;
-}
-
 void LLEventNotifier::remove(const U32 event_id)
 {
 	en_map::iterator iter;
 		return;
 	}
 
-	// Push up a message to tell the server to remove this notification.
-	gMessageSystem->newMessage("EventNotificationRemoveRequest");
+	serverPushRequest(event_id, false);
+	delete iter->second;
+	mEventNotifications.erase(iter);
+}
+
+
+void LLEventNotifier::serverPushRequest(U32 event_id, bool add)
+{
+	// Push up a message to tell the server we have this notification.
+	gMessageSystem->newMessage(add?"EventNotificationAddRequest":"EventNotificationRemoveRequest");
 	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
 	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
 	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
 	gMessageSystem->nextBlock("EventData");
 	gMessageSystem->addU32("EventID", event_id);
 	gAgent.sendReliableMessage();
-	
-	delete iter->second;
-	mEventNotifications.erase(iter);
 }
 
-LLEventNotification::LLEventNotification() :
-	mEventID(0),
-	mEventDate(0),
-	mEventName("")
+
+LLEventNotification::LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) :
+	mEventID(eventId),
+	mEventName(eventName),
+	mEventDateEpoch(eventEpoch),
+    mEventDateStr(eventDateStr)
 {
+	
 }
 
 
-LLEventNotification::~LLEventNotification()
-{
-}
 
-bool LLEventNotification::handleResponse(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	switch (option)
-	{
-	case 0:
-		{
-			gAgent.teleportViaLocation(getEventPosGlobal());
-			LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
-			if(floater_world_map) floater_world_map->trackLocation(getEventPosGlobal());
-			break;
-		}
-	case 1:
-		LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", S32(getEventID())));
-		break;
-	case 2:
-		break;
-	}
 
-	// We could clean up the notification on the server now if we really wanted to.
-	return false;
-}
 
-BOOL LLEventNotification::load(const LLSD& response)
-{
-	BOOL event_ok = TRUE;
-	LLSD option = response.get("event_id");
-	if (option.isDefined())
-	{
-		mEventID = option.asInteger();
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
 
-	option = response.get("event_name");
-	if (option.isDefined())
-	{
-		llinfos << "Event: " << option.asString() << llendl;
-		mEventName = option.asString();
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
-
-	option = response.get("event_date");
-	if (option.isDefined())
-	{
-		llinfos << "EventDate: " << option.asString() << llendl;
-		mEventDateStr = option.asString();
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
-
-	option = response.get("event_date_ut");
-	if (option.isDefined())
-	{
-		llinfos << "EventDate: " << option.asString() << llendl;
-		mEventDate = strtoul(option.asString().c_str(), NULL, 10);
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
-
-	S32 grid_x = 0;
-	S32 grid_y = 0;
-	S32 x_region = 0;
-	S32 y_region = 0;
-
-	option = response.get("grid_x");
-	if (option.isDefined())
-	{
-		llinfos << "GridX: " << option.asInteger() << llendl;
-		grid_x= option.asInteger();
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
-
-	option = response.get("grid_y");
-	if (option.isDefined())
-	{
-		llinfos << "GridY: " << option.asInteger() << llendl;
-		grid_y = option.asInteger();
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
-
-	option = response.get("x_region");
-	if (option.isDefined())
-	{
-		llinfos << "RegionX: " << option.asInteger() << llendl;
-		x_region = option.asInteger();
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
-
-	option = response.get("y_region");
-	if (option.isDefined())
-	{
-		llinfos << "RegionY: " << option.asInteger() << llendl;
-		y_region = option.asInteger();
-	}
-	else
-	{
-		event_ok = FALSE;
-	}
-
-	mEventPosGlobal.mdV[VX] = grid_x * 256 + x_region;
-	mEventPosGlobal.mdV[VY] = grid_y * 256 + y_region;
-	mEventPosGlobal.mdV[VZ] = 0.f;
-
-	return event_ok;
-}
-
-BOOL LLEventNotification::load(const LLEventInfo &event_info)
-{
-
-	mEventID = event_info.mID;
-	mEventName = event_info.mName;
-	mEventDateStr = event_info.mTimeStr;
-	mEventDate = event_info.mUnixTime;
-	mEventPosGlobal = event_info.mPosGlobal;
-	return TRUE;
-}
-

File indra/newview/lleventnotifier.h

 #include "llframetimer.h"
 #include "v3dmath.h"
 
-class LLEventInfo;
 class LLEventNotification;
 
 
 	virtual ~LLEventNotifier();
 
 	void update();	// Notify the user of the event if it's coming up
+	bool add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName);
+	void add(U32 eventId);
 
+	
 	void load(const LLSD& event_options);	// In the format that it comes in from login
-	void add(LLEventInfo &event_info);	// Add a new notification for an event
 	void remove(U32 event_id);
 
 	BOOL hasNotification(const U32 event_id);
+	void serverPushRequest(U32 event_id, bool add);
 
 	typedef std::map<U32, LLEventNotification *> en_map;
+	bool  handleResponse(U32 eventId, const LLSD& notification, const LLSD& response);		
 
+	static void processEventInfoReply(LLMessageSystem *msg, void **);	
+	
 protected:
 	en_map	mEventNotifications;
 	LLFrameTimer	mNotificationTimer;
 class LLEventNotification
 {
 public:
-	LLEventNotification();
-	virtual ~LLEventNotification();
+	LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName);
 
-	BOOL load(const LLSD& en);		// In the format it comes in from login
-	BOOL load(const LLEventInfo &event_info);		// From existing event_info on the viewer.
-	//void setEventID(const U32 event_id);
-	//void setEventName(std::string &event_name);
+
 	U32					getEventID() const				{ return mEventID; }
 	const std::string	&getEventName() const			{ return mEventName; }
-	time_t				getEventDate() const			{ return mEventDate; }
-	const std::string	&getEventDateStr() const		{ return mEventDateStr; }
-	LLVector3d			getEventPosGlobal() const		{ return mEventPosGlobal; }
-	bool				handleResponse(const LLSD& notification, const LLSD& payload);
+	bool                isValid() const                 { return mEventID > 0 && mEventDateEpoch != 0 && mEventName.size() > 0; }
+	const F64		    &getEventDateEpoch() const		{ return mEventDateEpoch; }
+	const std::string   &getEventDateStr() const        { return mEventDateStr; }
+	
+	
 protected:
 	U32			mEventID;			// EventID for this event
 	std::string	mEventName;
+	F64		    mEventDateEpoch;
 	std::string mEventDateStr;
-	time_t		mEventDate;
-	LLVector3d	mEventPosGlobal;
 };
 
 extern LLEventNotifier gEventNotifier;

File indra/newview/llfloaterevent.cpp

 #include "llcachename.h"
 #include "llcommandhandler.h"	// secondlife:///app/chat/ support
 #include "lleventflags.h"
-#include "lleventnotifier.h"
+#include "llmediactrl.h"
 #include "llexpandabletextbox.h"
 #include "llfloater.h"
 #include "llfloaterreg.h"
+#include "llmediactrl.h"
 #include "llfloaterworldmap.h"
 #include "llinventorymodel.h"
 #include "llsecondlifeurls.h"
 #include "lltrans.h"
 
 
-class LLEventHandler : public LLCommandHandler
-{
-public:
-	// requires trusted browser to trigger
-	LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { }
-	bool handle(const LLSD& params, const LLSD& query_map,
-				LLMediaCtrl* web)
-	{
-		if (params.size() < 1)
-		{
-			return false;
-		}
-		
-		LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
-		if (floater)
-		{
-			floater->setEventID(params[0].asInteger());
-			LLFloaterReg::showTypedInstance<LLFloaterEvent>("event");
-			return true;
-		}
-
-		return false;
-	}
-};
-LLEventHandler gEventHandler;
-
 LLFloaterEvent::LLFloaterEvent(const LLSD& key)
 	: LLFloater(key),
-
+      LLViewerMediaObserver(),
+      mBrowser(NULL),
 	  mEventID(0)
 {
 }
 
 BOOL LLFloaterEvent::postBuild()
 {
-	mTBName = getChild<LLTextBox>("event_name");
-
-	mTBCategory = getChild<LLTextBox>("event_category");
-	
-	mTBDate = getChild<LLTextBox>("event_date");
-
-	mTBDuration = getChild<LLTextBox>("event_duration");
-
-	mTBDesc = getChild<LLExpandableTextBox>("event_desc");
-
-	mTBRunBy = getChild<LLTextBox>("event_runby");
-	mTBLocation = getChild<LLTextBox>("event_location");
-	mTBCover = getChild<LLTextBox>("event_cover");
-
-	mTeleportBtn = getChild<LLButton>( "teleport_btn");
-	mTeleportBtn->setClickedCallback(onClickTeleport, this);
-
-	mMapBtn = getChild<LLButton>( "map_btn");
-	mMapBtn->setClickedCallback(onClickMap, this);
-
-	mNotifyBtn = getChild<LLButton>( "notify_btn");
-	mNotifyBtn->setClickedCallback(onClickNotify, this);
-
-	mCreateEventBtn = getChild<LLButton>( "create_event_btn");
-	mCreateEventBtn->setClickedCallback(onClickCreateEvent, this);
-
-	mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn");
-	mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this));
+	mBrowser = getChild<LLMediaCtrl>("browser");
+	if (mBrowser)
+	{
+		mBrowser->addObserver(this);
+	}
 
 	return TRUE;
 }
 
+void LLFloaterEvent::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event)
+{
+	switch (event) 
+	{
+		case MEDIA_EVENT_NAVIGATE_BEGIN:
+			getChild<LLUICtrl>("status_text")->setValue(getString("loading_text"));
+			break;
+			
+		case MEDIA_EVENT_NAVIGATE_COMPLETE:
+			getChild<LLUICtrl>("status_text")->setValue(getString("done_text"));
+			break;
+			
+		default:
+			break;
+	}
+}
+
 void LLFloaterEvent::setEventID(const U32 event_id)
 {
 	mEventID = event_id;
-	// Should reset all of the panel state here
-	resetInfo();
 
 	if (event_id != 0)
 	{
-		sendEventInfoRequest();
-	}
-}
-
-void LLFloaterEvent::onClickDeleteEvent()
-{
-	LLMessageSystem* msg = gMessageSystem;
-
-	msg->newMessageFast(_PREHASH_EventGodDelete);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-
-	msg->nextBlockFast(_PREHASH_EventData);
-	msg->addU32Fast(_PREHASH_EventID, mEventID);
-
-	gAgent.sendReliableMessage();
-}
-
-void LLFloaterEvent::sendEventInfoRequest()
-{
-	LLMessageSystem *msg = gMessageSystem;
-
-	msg->newMessageFast(_PREHASH_EventInfoRequest);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
-	msg->nextBlockFast(_PREHASH_EventData);
-	msg->addU32Fast(_PREHASH_EventID, mEventID);
-	gAgent.sendReliableMessage();
-}
-
-//static 
-void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **)
-{
-	// extract the agent id
-	LLUUID agent_id;
-	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
-
-	LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
-	
-	if(floater)
-	{
-		floater->mEventInfo.unpack(msg);
-		floater->mTBName->setText(floater->mEventInfo.mName);
-		floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr);
-		floater->mTBDate->setText(floater->mEventInfo.mTimeStr);
-		floater->mTBDesc->setText(floater->mEventInfo.mDesc);
-		floater->mTBRunBy->setText(LLSLURL("agent", floater->mEventInfo.mRunByID, "inspect").getSLURLString());
-
-		floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60));
-
-		if (!floater->mEventInfo.mHasCover)
-		{
-			floater->mTBCover->setText(floater->getString("none"));
-		}
-		else
-		{
-			floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover));
-		}
-
-		F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX];
-		F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY];
-
-		S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;
-		S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
-		S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]);
-
-		std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z);
-		floater->mTBLocation->setText(desc);
-
-		floater->getChildView("rating_icon_m")->setVisible( FALSE);
-		floater->getChildView("rating_icon_r")->setVisible( FALSE);
-		floater->getChildView("rating_icon_pg")->setVisible( FALSE);
-		floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("unknown"));
-
-		//for some reason there's not adult flags for now, so see if region is adult and then
-		//set flags
-		LLWorldMapMessage::url_callback_t cb = boost::bind(	&regionInfoCallback, floater->mEventInfo.mID, _1);
-		LLWorldMapMessage::getInstance()->sendNamedRegionRequest(floater->mEventInfo.mSimName, cb, std::string("unused"), false);
-
-		if (floater->mEventInfo.mUnixTime < time_corrected())
-		{
-			floater->mNotifyBtn->setEnabled(FALSE);
-		}
-		else
-		{
-			floater->mNotifyBtn->setEnabled(TRUE);
-		}
-
-		if (gEventNotifier.hasNotification(floater->mEventInfo.mID))
-		{
-			floater->mNotifyBtn->setLabel(floater->getString("dont_notify"));
-		}
-		else
-		{
-			floater->mNotifyBtn->setLabel(floater->getString("notify"));
-		}
-	
-		floater->mMapBtn->setEnabled(TRUE);
-		floater->mTeleportBtn->setEnabled(TRUE);
-	}
-}
-
-//static 
-void LLFloaterEvent::regionInfoCallback(U32 event_id, U64 region_handle)
-{
-	LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(region_handle);
-	LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
-
-	if (sim_info && floater && (event_id == floater->getEventID()))
-	{
-		// update the event with the maturity info
-		if (sim_info->isAdult())
-		{
-			floater->getChildView("rating_icon_m")->setVisible( FALSE);
-			floater->getChildView("rating_icon_r")->setVisible( TRUE);
-			floater->getChildView("rating_icon_pg")->setVisible( FALSE);
-			floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("adult"));
-
-		}
-		else if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE)
-		{
-			floater->getChildView("rating_icon_m")->setVisible( TRUE);
-			floater->getChildView("rating_icon_r")->setVisible( FALSE);
-			floater->getChildView("rating_icon_pg")->setVisible( FALSE);
-			floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("moderate"));
-		}
-		else
-		{
-			floater->getChildView("rating_icon_m")->setVisible( FALSE);
-			floater->getChildView("rating_icon_r")->setVisible( FALSE);
-			floater->getChildView("rating_icon_pg")->setVisible( TRUE);
-			floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("general"));
-		}
+		LLSD subs;
+		subs["EVENT_ID"] = (S32)event_id;
+        // get the search URL and expand all of the substitutions                                                       
+        // (also adds things like [LANGUAGE], [VERSION], [OS], etc.)                                                    
+		std::ostringstream url;
+		url <<  gSavedSettings.getString("EventURL") << event_id << "/" << std::endl;
+		// and load the URL in the web view                                                                             
+        mBrowser->navigateTo(url.str());
+		
 	}
 }
 
 void LLFloaterEvent::draw()
 {
-	mGodDeleteEventBtn->setVisible(gAgent.isGodlike());
-
 	LLPanel::draw();
 }
-
-void LLFloaterEvent::resetInfo()
-{
-	mTBName->setText(LLStringUtil::null);
-	mTBCategory->setText(LLStringUtil::null);
-	mTBDate->setText(LLStringUtil::null);
-	mTBDesc->setText(LLStringUtil::null);
-	mTBDuration->setText(LLStringUtil::null);
-	mTBCover->setText(LLStringUtil::null);
-	mTBLocation->setText(LLStringUtil::null);
-	mTBRunBy->setText(LLStringUtil::null);
-	mNotifyBtn->setEnabled(FALSE);
-	mMapBtn->setEnabled(FALSE);
-	mTeleportBtn->setEnabled(FALSE);
-}
-
-// static
-void LLFloaterEvent::onClickTeleport(void* data)
-{
-	LLFloaterEvent* self = (LLFloaterEvent*)data;
-	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
-	if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
-	{
-		gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal);
-		worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
-	}
-}
-
-
-// static
-void LLFloaterEvent::onClickMap(void* data)
-{
-	LLFloaterEvent* self = (LLFloaterEvent*)data;
-	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
-
-	if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
-	{
-		worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
-		LLFloaterReg::showInstance("world_map", "center");
-	}
-}
-
-
-// static
-void LLFloaterEvent::onClickCreateEvent(void* data)
-{
-	LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage); 
-}
-
-
-// static
-void LLFloaterEvent::onClickNotify(void *data)
-{
-	LLFloaterEvent* self = (LLFloaterEvent*)data;
-
-	if (!gEventNotifier.hasNotification(self->mEventID))
-	{
-		gEventNotifier.add(self->mEventInfo);
-		self->mNotifyBtn->setLabel(self->getString("dont_notify"));
-	}
-	else
-	{
-		gEventNotifier.remove(self->mEventInfo.mID);
-		self->mNotifyBtn->setLabel(self->getString("notify"));
-	}
-}

File indra/newview/llfloaterevent.h

 #define LL_LLFLOATEREVENT_H
 
 #include "llfloater.h"
-#include "lleventinfo.h"
-#include "lluuid.h"
-#include "v3dmath.h"
+#include "llviewermediaobserver.h"
 
-class LLTextBox;
-class LLTextEditor;
+
+class LLMediaCtrl;
 class LLButton;
-class LLExpandableTextBox;
-class LLMessageSystem;
 
-class LLFloaterEvent : public LLFloater
+class LLFloaterEvent : public LLFloater,
+                       public LLViewerMediaObserver
+
 {
 public:
 	LLFloaterEvent(const LLSD& key);
 	/*virtual*/ void draw();
 
 	void setEventID(const U32 event_id);
-	void sendEventInfoRequest();
-
-	static void processEventInfoReply(LLMessageSystem *msg, void **);
 
 	U32 getEventID() { return mEventID; }
 
-protected:
-	void resetInfo();
-
-	static void onClickTeleport(void*);
-	static void onClickMap(void*);
-	//static void onClickLandmark(void*);
-	static void onClickCreateEvent(void*);
-	static void onClickNotify(void*);
-	void onClickDeleteEvent();
-
-	static void regionInfoCallback(U32 event_id, U64 region_handle);
 
 
 protected:
+	/*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event);	
+	
 	U32				mEventID;
-	LLEventInfo		mEventInfo;
 
-	LLTextBox*		mTBName;
-	LLTextBox*		mTBCategory;
-	LLTextBox*		mTBDate;
-	LLTextBox*		mTBDuration;
-	LLExpandableTextBox*	mTBDesc;
+	LLMediaCtrl*	mBrowser;
 
-	LLTextBox*		mTBRunBy;
-	LLTextBox*		mTBLocation;
-	LLTextBox*		mTBCover;
-
-	LLButton*		mTeleportBtn;
-	LLButton*		mMapBtn;
-	LLButton*		mCreateEventBtn;
-	LLButton*		mGodDeleteEventBtn;
-	LLButton*		mNotifyBtn;
 };
 
 #endif // LL_LLFLOATEREVENT_H

File indra/newview/llfloaterworldmap.h

 #include "lltracker.h"
 #include "llslurl.h"
 
-class LLEventInfo;
 class LLFriendObserver;
 class LLInventoryModel;
 class LLInventoryObserver;

File indra/newview/llstartup.cpp

 #include "llpanellogin.h"
 #include "llmutelist.h"
 #include "llavatarpropertiesprocessor.h"
-#include "llfloaterevent.h"
 #include "llpanelclassified.h"
 #include "llpanelpick.h"
 #include "llpanelgrouplandmoney.h"
 			LLFloaterReg::showInstance("hud", LLSD(), FALSE);
 		}
 
-		LLSD event_categories = response["event_categories"];
-		if(event_categories.isDefined())
-		{
-			LLEventInfo::loadCategories(event_categories);
-		}
-
 		LLSD event_notifications = response["event_notifications"];
 		if(event_notifications.isDefined())
 		{
 
 	msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
 	msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
-
-	msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply);
+	msg->setHandlerFunc("EventInfoReply", LLEventNotifier::processEventInfoReply);
+	
 	msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
 //	msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
 	msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);

File indra/newview/skins/default/xui/da/floater_event.xml

-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater label="Event" name="Event" title="EVENT DETALJER">
-	<floater.string name="none">
-		ingen
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="400"
+ can_resize="true"
+ help_topic="event_details"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ save_rect="true"
+ save_visibility="false"
+ title="EVENT DETAILS" 
+ width="600">
+	<floater.string
+		name="loading_text">
+		Henter...
 	</floater.string>
-	<floater.string name="notify">
-		Meddel
-	</floater.string>
-	<floater.string name="dont_notify">
-		Meddel ikke
-	</floater.string>
-	<floater.string name="moderate">
-		Moderat
-	</floater.string>
-	<floater.string name="adult">
-		Voksent
-	</floater.string>
-	<floater.string name="general">
-		Generelt
-	</floater.string>
-	<floater.string name="unknown">
-		Ukendt
-	</floater.string>
-	<layout_stack name="layout">
-		<layout_panel name="profile_stack">
-			<text name="event_name">
-				Event uden navn.
-			</text>
-			<text name="event_category">
-				(ingen kategori)
-			</text>
-			<text name="event_runby_label">
-				Afholdt af:
-			</text>
-			<text initial_value="(henter)" name="event_runby"/>
-			<text name="event_date_label">
-				Dato:
-			</text>
-			<text name="event_date">
-				10/10/2010
-			</text>
-			<text name="event_duration_label">
-				Varighed:
-			</text>
-			<text name="event_duration">
-				1 time
-			</text>
-			<text name="event_covercharge_label">
-				Pris:
-			</text>
-			<text name="event_cover">
-				Gratis
-			</text>
-			<text name="event_location_label">
-				Lokation:
-			</text>
-			<text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
-			<text name="rating_label" value="Rating:"/>
-			<text name="rating_value" value="ukendt"/>
-			<expandable_text name="event_desc">
-				Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-			</expandable_text>
-		</layout_panel>
-		<layout_panel name="button_panel">
-			<button name="create_event_btn" tool_tip="Opret event"/>
-			<button name="god_delete_event_btn" tool_tip="Slet event"/>
-			<button label="Giv besked" name="notify_btn"/>
-			<button label="Teleport" name="teleport_btn"/>
-			<button label="Kort" name="map_btn"/>
-		</layout_panel>
-	</layout_stack>
+    <floater.string
+     name="done_text">
+        Done
+    </floater.string>
+  <web_browser
+     trusted_content="true" 
+     follows="left|right|top|bottom"
+     layout="topleft"
+     left="10"
+     name="browser"
+     height="365"
+     width="580"
+     top="0"/>
+	<text
+	 follows="bottom|left"
+	 height="16"
+	 layout="topleft"
+	 left_delta="0"
+	 name="status_text"
+	 top_pad="10"
+	 width="150" />	 
 </floater>
+

File indra/newview/skins/default/xui/da/notifications.xml

 [NAME]
 [DATE]
 		<form name="form">
-			<button name="Teleport" text="Teleportér"/>
-			<button name="Description" text="Beskrivelse"/>
+			<button name="Details" text="Beskrivelse"/>
 			<button name="Cancel" text="Annullér"/>
 		</form>
 	</notification>

File indra/newview/skins/default/xui/de/floater_event.xml

-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater label="Event" name="Event" title="EVENT-DETAILS">
-	<floater.string name="none">
-		keines
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="400"
+ can_resize="true"
+ help_topic="event_details"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ save_rect="true"
+ save_visibility="false"
+ title="EVENT DETAILS" 
+ width="600">
+	<floater.string
+		name="loading_text">
+		Wird geladen...
 	</floater.string>
-	<floater.string name="notify">
-		Benachrichtigen
-	</floater.string>
-	<floater.string name="dont_notify">
-		Nicht benachrichtigen
-	</floater.string>
-	<floater.string name="moderate">
-		Moderat
-	</floater.string>
-	<floater.string name="adult">
-		Adult
-	</floater.string>
-	<floater.string name="general">
-		Allgemein
-	</floater.string>
-	<floater.string name="unknown">
-		Unbekannt
-	</floater.string>
-	<layout_stack name="layout">
-		<layout_panel name="profile_stack">
-			<text name="event_name">
-				Namenloses Event....namenlos! Tadaaa! Tadatadaaaah!
-			</text>
-			<text name="event_category">
-				(keine Kategorie)
-			</text>
-			<text name="event_runby_label">
-				Ausgeführt von:
-			</text>
-			<text initial_value="(wird in Datenbank gesucht)" name="event_runby"/>
-			<text name="event_date_label">
-				Datum:
-			</text>
-			<text name="event_date">
-				10/10/2010
-			</text>
-			<text name="event_duration_label">
-				Dauer:
-			</text>
-			<text name="event_duration">
-				1 Stunde
-			</text>
-			<text name="event_covercharge_label">
-				Eintritt:
-			</text>
-			<text name="event_cover">
-				Kostenlos
-			</text>
-			<text name="event_location_label">
-				Standort:
-			</text>
-			<text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
-			<text name="rating_label" value="Einstufung:"/>
-			<text name="rating_value" value="unbekannt"/>
-		</layout_panel>
-		<layout_panel name="button_panel">
-			<button name="create_event_btn" tool_tip="Event erstellen"/>
-			<button name="god_delete_event_btn" tool_tip="Event löschen"/>
-			<button label="Mich benachrichtigen" name="notify_btn"/>
-			<button label="Teleportieren" name="teleport_btn"/>
-			<button label="Karte" name="map_btn"/>
-		</layout_panel>
-	</layout_stack>
+    <floater.string
+     name="done_text">
+        Done
+    </floater.string>
+  <web_browser
+     trusted_content="true" 
+     follows="left|right|top|bottom"
+     layout="topleft"
+     left="10"
+     name="browser"
+     height="365"
+     width="580"
+     top="0"/>
+	<text
+	 follows="bottom|left"
+	 height="16"
+	 layout="topleft"
+	 left_delta="0"
+	 name="status_text"
+	 top_pad="10"
+	 width="150" />	 
 </floater>
+

File indra/newview/skins/default/xui/de/notifications.xml

 [NAME]
 [DATE]
 		<form name="form">
-			<button name="Teleport" text="Teleportieren"/>
-			<button name="Description" text="Beschreibung"/>
+			<button name="Details" text="Beschreibung"/>
 			<button name="Cancel" text="Abbrechen"/>
 		</form>
 	</notification>

File indra/newview/skins/default/xui/en/floater_event.xml

 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  follows="all"
- height="350"
+ height="400"
+ can_resize="true"
  help_topic="event_details"
  label="Event"
  layout="topleft"
  name="Event"
+ save_rect="true"
+ save_visibility="false"
  title="EVENT DETAILS" 
- width="330">
-  <floater.string
-   name="none">
-    none
-  </floater.string>
-  <floater.string
-   name="notify">
-    Notify
-  </floater.string>
-  <floater.string
-   name="dont_notify">
-    Don&apos;t Notify
-  </floater.string>
-  <floater.string
-   name="moderate">
-    Moderate
-  </floater.string>
-  <floater.string
-   name="adult">
-    Adult
-  </floater.string>
-  <floater.string
-   name="general">
-    General
-  </floater.string>
-  <floater.string
-   name="unknown">
-    Unknown
-  </floater.string>
-  <layout_stack
-    name="layout"
-    orientation="vertical"
-    follows="all"
-    layout="topleft"
-    left="0"
-    top="0"
-    height="350"
-    width="330"
-    border_size="0">
-    <layout_panel
-       name="profile_stack"
-       follows="top|left"
-       layout="topleft"
-       top="0"
-       left="0"
-       height="305"
-       width="330">
-      <text
-       follows="top|left|right"
-       font="SansSerifLarge"
-       text_color="white"
-       height="17"
-       layout="topleft"
-       left="10"
-       name="event_name"
-       top="5"
-       use_ellipses="true"
-       width="310">
-        Nameless Event...of Doom! De doom! Doom doom.
-      </text>
-      <text
-        type="string"
-        length="1"
-        follows="top|left"
-        height="13"
-        text_color="LtGray_50"
-        layout="topleft"
-        left="25"
-        name="event_category"
-        width="300">
-        (no category)
-      </text>
+ width="600">
+	<floater.string
+		name="loading_text">
+		Loading...
+	</floater.string>
+    <floater.string
+     name="done_text">
+        Done
+    </floater.string>
+  <web_browser
+     trusted_content="true" 
+     follows="left|right|top|bottom"
+     layout="topleft"
+     left="10"
+     name="browser"
+     height="365"
+     width="580"
+     top="0"/>
+	<text
+	 follows="bottom|left"
+	 height="16"
+	 layout="topleft"
+	 left_delta="0"
+	 name="status_text"
+	 top_pad="10"
+	 width="150" />	 
+</floater>
 
-      <text
-       type="string"
-       length="1"
-       follows="top|left"
-       layout="topleft"
-       left="10"
-       top_pad="7"
-       name="event_runby_label"
-       width="90">
-        Run by:
-      </text>
-      <text
-        follows="left|top"
-        height="20"
-        initial_value="(retrieving)"
-        layout="topleft"
-        left_pad="0"
-        link="true"
-        name="event_runby"
-        top_delta="0"
-        use_ellipses="true"
-        width="240" />
-      <text
-       type="string"
-       length="1"
-       follows="top|left"
-       layout="topleft"
-       left="10"
-       top_pad="5"
-       name="event_date_label"
-       width="90">
-        Date:
-      </text>
-      <text
-     type="string"
-     length="1"
-     left_pad="0"
-     height="17"
-     top_delta="0"
-     follows="top|left"
-     layout="topleft"
-     name="event_date"
-     width="240">
-        10/10/2010
-      </text>
-      <text
-       type="string"
-       length="1"
-       follows="top|left"
-       layout="topleft"
-       left="10"
-       top_pad="5"
-       name="event_duration_label"
-       width="90">
-        Duration:
-      </text>
-      <text
-       type="string"
-       height="14"
-       length="1"
-       left_pad="0"
-       follows="top|left"
-       layout="topleft"
-       name="event_duration"
-       top_delta="0"
-       width="240">
-        1 hour
-      </text>
-      <text
-       type="string"
-       length="1"
-       follows="top|left"
-       layout="topleft"
-       left="10"
-       top_pad="5"
-       name="event_covercharge_label"
-       width="90">
-        Cover charge:
-      </text>
-      <text
-        type="string"
-        follows="left|top"
-        height="16"
-        layout="topleft"
-       left_pad="0"
-       name="event_cover"
-        visible="true"
-        width="240"
-        top_delta="0">
-        Free
-      </text>
-      <text
-       type="string"
-       length="1"
-       follows="top|left"
-       layout="topleft"
-       left="10"
-       top_pad="5"
-       name="event_location_label"
-       width="90">
-        Location:
-      </text>
-      <text
-       type="string"
-       length="1"
-       height="20"
-       left_pad="0"
-       follows="top|left"
-       layout="topleft"
-       name="event_location"
-       use_ellipses="true"
-       top_delta="0"
-       value="SampleParcel, Name Long (145, 228, 26)"
-       width="240" />
-      <icon
-       follows="top|left"
-       height="16"
-       image_name="Parcel_PG_Dark"
-       layout="topleft"
-       left="10"
-       name="rating_icon_pg"
-       width="18" />
-      <icon
-       follows="top|left"
-       height="16"
-       image_name="Parcel_M_Dark"
-       layout="topleft"
-       left="10"
-       name="rating_icon_m"
-       top_delta="0"
-       width="18" />
-      <icon
-       follows="top|left"
-       height="16"
-       image_name="Parcel_R_Dark"
-       layout="topleft"
-       left="10"
-       name="rating_icon_r"
-       top_delta="0"
-       width="18" />
-      <text
-       follows="left|top"
-       height="16"
-       layout="topleft"
-       left_pad="12"
-       name="rating_label"
-       top_delta="3"
-       value="Rating:"
-       width="90" />
-      <text
-       follows="left|right|top"
-       height="16"
-       layout="topleft"
-       left_pad="2"
-       name="rating_value"
-       top_delta="0"
-       value="unknown"
-       width="240" />
-      <expandable_text
-       follows="left|top|right"
-       height="65"
-       layout="topleft"
-       left="6"
-       name="event_desc"
-       width="322">
-       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</expandable_text>
-    </layout_panel>
-    <layout_panel
-       follows="left|right"
-       height="24"
-       layout="topleft"
-       mouse_opaque="false"
-       name="button_panel"
-       top="0"
-       left="0"
-       user_resize="false">
-      <button
-       follows="left|top"
-           height="18"
-           image_selected="AddItem_Press"
-           image_unselected="AddItem_Off"
-           image_disabled="AddItem_Disabled"
-           layout="topleft"
-           left="6"
-       name="create_event_btn"
-           tool_tip="Create Event"
-           width="18" />
-      <button
-       follows="left|top"
-           height="18"
-           image_selected="MinusItem_Press"
-           image_unselected="MinusItem_Off"
-           image_disabled="MinusItem_Disabled"
-           layout="topleft"
-           visible="false" 
-           left="6"
-           top_pad="-7" 
-          name="god_delete_event_btn"
-           tool_tip="Delete Event"
-           width="18" />
-      <button
-   follows="left|top"
-   height="23"
-   label="Notify Me"
-   layout="topleft"
-   left_pad="3"
-   top_delta="-12"
-   name="notify_btn"
-   width="100" />
-      <button
-       follows="left|top"
-       height="23"
-       label="Teleport"
-       layout="topleft"
-       left_pad="5"
-       name="teleport_btn"
-       width="100" />
-      <button
-       follows="left|top"
-       height="23"
-       label="Map"
-       layout="topleft"
-       left_pad="5"
-       name="map_btn"
-       width="85" />
-    </layout_panel>
-  </layout_stack>
-  </floater>
-

File indra/newview/skins/default/xui/en/notifications.xml

     <form name="form">
       <button
        index="0"
-       name="Teleport"
-       text="Teleport"/>
+       name="Details"
+       text="Details"/>
       <button
        index="1"
-       name="Description"
-       text="Description"/>
-      <button
-       index="2"
        name="Cancel"
        text="Cancel"/>
     </form>

File indra/newview/skins/default/xui/en/role_actions.xml

 		<action description="Allow &apos;Set Home to Here&apos; on group land"
 		     longdescription="Members in a Role with this Ability can use World menu &gt; Landmarks &gt; Set Home to Here on a parcel deeded to this group."
 		     name="land allow set home" value="28" />
+		<action description="Allow &apos;Event Hosting&apos; on group land"
+		     longdescription="Members in a Role with this Ability can select group owned parcels as venus when hosting an event."
+		     name="land allow host event" value="41" />			 
 	</action_set>
 	<action_set
 	     description="These Abilities include powers to allow or restrict access to group-owned parcels, including freezing and ejecting Residents."

File indra/newview/skins/default/xui/es/floater_event.xml

-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater label="Evento" name="Event" title="DETALLES DEL EVENTO">
-	<floater.string name="none">
-		ninguno
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="400"
+ can_resize="true"
+ help_topic="event_details"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ save_rect="true"
+ save_visibility="false"
+ title="EVENT DETAILS" 
+ width="600">
+	<floater.string
+		name="loading_text">
+		Cargando...
 	</floater.string>
-	<floater.string name="notify">
-		Notificar
-	</floater.string>
-	<floater.string name="dont_notify">
-		No notificar
-	</floater.string>
-	<floater.string name="moderate">
-		Moderado
-	</floater.string>
-	<floater.string name="adult">
-		Adulto
-	</floater.string>
-	<floater.string name="general">
-		General
-	</floater.string>
-	<floater.string name="unknown">
-		desconocida
-	</floater.string>
-	<layout_stack name="layout">
-		<layout_panel name="profile_stack">
-			<text name="event_name">
-				Evento sin nombre...
-			</text>
-			<text name="event_category">
-				(sin categoría)
-			</text>
-			<text name="event_runby_label">
-				Organizado por:
-			</text>
-			<text initial_value="(obteniendo)" name="event_runby"/>
-			<text name="event_date_label">
-				Fecha:
-			</text>
-			<text name="event_date">
-				10/10/2010
-			</text>
-			<text name="event_duration_label">
-				Duración:
-			</text>
-			<text name="event_duration">
-				1 hora
-			</text>
-			<text name="event_covercharge_label">
-				Entrada:
-			</text>
-			<text name="event_cover">
-				Gratis
-			</text>
-			<text name="event_location_label">
-				Localización:
-			</text>
-			<text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
-			<text name="rating_label" value="Calificación:"/>
-			<text name="rating_value" value="desconocida"/>
-			<expandable_text name="event_desc">
-				Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-			</expandable_text>
-		</layout_panel>
-		<layout_panel name="button_panel">
-			<button name="create_event_btn" tool_tip="Crear el evento"/>
-			<button name="god_delete_event_btn" tool_tip="Borrar el evento"/>
-			<button label="Notificarme" name="notify_btn"/>
-			<button label="Teleportar" name="teleport_btn"/>
-			<button label="Mapa" name="map_btn"/>
-		</layout_panel>
-	</layout_stack>
+    <floater.string
+     name="done_text">
+        Done
+    </floater.string>
+  <web_browser
+     trusted_content="true" 
+     follows="left|right|top|bottom"
+     layout="topleft"
+     left="10"
+     name="browser"
+     height="365"
+     width="580"
+     top="0"/>
+	<text
+	 follows="bottom|left"
+	 height="16"
+	 layout="topleft"
+	 left_delta="0"
+	 name="status_text"
+	 top_pad="10"
+	 width="150" />	 
 </floater>
+

File indra/newview/skins/default/xui/es/notifications.xml

 [NAME]
 [DATE]
 		<form name="form">
-			<button name="Teleport" text="Teleportar"/>
-			<button name="Description" text="Descripción"/>
+			<button name="Details" text="Detalles"/>
 			<button name="Cancel" text="Cancelar"/>
 		</form>
 	</notification>

File indra/newview/skins/default/xui/fr/floater_event.xml

-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater label="Événement" name="Event" title="DÉTAILS SUR L&apos;ÉVÉNEMENT">
-	<floater.string name="none">
-		aucun
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="400"
+ can_resize="true"
+ help_topic="event_details"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ save_rect="true"