LLFloaterDirectory::LLFloaterDirectory(const std::string& name)
:	LLFloater(name, std::string("FloaterFindRect2"), LLStringUtil::null),
	mMinimizing(false)
{
	sInstance = this;

	mFindAllPanel = NULL;
	mClassifiedPanel = NULL;
	mEventsPanel = NULL;
	mLandPanel = NULL;

	mPanelAvatarp = NULL;
	mPanelEventp = NULL;
	mPanelGroupp = NULL;
	mPanelGroupHolderp = NULL;
	mPanelPlacep = NULL;
	mPanelPlaceSmallp = NULL;
	mPanelClassifiedp = NULL;
	
	// Build the floater with our tab panel classes
	bool secondlife = gHippoGridManager->getConnectedGrid()->isSecondLife();

	LLCallbackMap::map_t factory_map;
	factory_map["classified_panel"] = LLCallbackMap(createClassified, this);
	factory_map["events_panel"] = LLCallbackMap(createEvents, this);
	factory_map["places_panel"] = LLCallbackMap(createPlaces, this);
	factory_map["land_sales_panel"] = LLCallbackMap(createLand, this);
	factory_map["people_panel"] = LLCallbackMap(createPeople, this);
	factory_map["groups_panel"] = LLCallbackMap(createGroups, this);
	factory_map[market_panel] = LLCallbackMap(LLPanelDirMarket::create, this);
	factory_map["find_all_panel"] = LLCallbackMap(createFindAll, this);
	factory_map["showcase_panel"] = LLCallbackMap(createShowcase, this);
	if (secondlife)
	{
		factory_map["web_panel"] = LLCallbackMap(createWebPanel, this);
	}
	else
	{
		factory_map["find_all_old_panel"] = LLCallbackMap(createFindAllOld, this);
	}

	factory_map["classified_details_panel"] = LLCallbackMap(createClassifiedDetail, this);
	factory_map["event_details_panel"] = LLCallbackMap(createEventDetail, this);
	factory_map["group_details_panel"] = LLCallbackMap(createGroupDetail, this);
	factory_map["group_details_panel_holder"] = LLCallbackMap(createGroupDetailHolder, this);
	factory_map["place_details_panel"] = LLCallbackMap(createPlaceDetail, this);
	factory_map["place_details_small_panel"] = LLCallbackMap(createPlaceDetailSmall, this);

	factory_map["Panel Avatar"] = LLCallbackMap(createPanelAvatar, this);
	
	mCommitCallbackRegistrar.add("Search.WebFloater", boost::bind(&LLFloaterSearch::open, boost::bind(LLFloaterSearch::getInstance)));
	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_directory.xml", &factory_map);
	moveResizeHandlesToFront();

	if (mPanelAvatarp)
	{
		mPanelAvatarp->selectTab(0);
	}
	
	LLTabContainer* container = getChild<LLTabContainer>("Directory Tabs");
	if (secondlife)
	{
		container->removeTabPanel(getChild<LLPanel>("find_all_old_panel")); // Not used
	}
	else
	{
		container->removeTabPanel(getChild<LLPanel>("web_panel")); // Not needed
		LLPanel* panel(getChild<LLPanel>("find_all_panel"));
		LLPanel* prev_tab(getChild<LLPanel>("find_all_old_panel"));
		LFSimFeatureHandler& inst(LFSimFeatureHandler::instance());
		set_tab_visible(container, panel, !inst.searchURL().empty(), prev_tab);
		inst.setSearchURLCallback(boost::bind(set_tab_visible, container, panel, !boost::bind(&std::string::empty, _1), prev_tab));
		panel = getChild<LLPanel>("showcase_panel");
		prev_tab = getChild<LLPanel>("events_panel");
		set_tab_visible(container, panel, !inst.destinationGuideURL().empty(), prev_tab);
		inst.setDestinationGuideURLCallback(boost::bind(set_tab_visible, container, panel, !boost::bind(&std::string::empty, _1), prev_tab));

		LLPanelDirMarket* marketp = static_cast<LLPanelDirMarket*>(container->getPanelByName(market_panel));
		container->removeTabPanel(marketp); // Until we get a MarketPlace URL, tab is removed.
		marketp->handleRegionChange(container);
		gAgent.addRegionChangedCallback(boost::bind(&LLPanelDirMarket::handleRegionChange, marketp, container));
	}
	container->setCommitCallback(boost::bind(&LLFloaterDirectory::onTabChanged,_2));
}